【发布时间】:2019-09-05 09:21:50
【问题描述】:
我正在开发一个带有 Telerik WinForm (2019.2.618.40) 控件的 WinForms (.NET 4.7.2) 应用程序。
点击窗口顶部的关闭框[x]图标,我想要求用户确认,如果是,则关闭应用程序。
以下代码运行良好,它关闭了窗口,但它不是关闭过程(我仍然可以在任务管理器中看到该应用程序)。
我相信我需要调用Application.Exit(); 来终止应用程序进程。但是当我调用 Closing Event 被触发两次并且我得到两次确认窗口并得到以下错误时
System.InvalidOperationException: '集合已修改; 枚举操作可能无法执行。'
如何更正我的关闭事件,以便我可以要求用户确认并关闭窗口以及从任务管理器中干净地退出应用程序?
我的基本表单
public class BaseForm : Telerik.WinControls.UI.RadForm
{
public BaseForm()
{
this.FormClosing += new FormClosingEventHandler(Form_Closing);
}
public void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
RadMessageBox.SetThemeName("Material");
DialogResult dialogResult = RadMessageBox.Show(
this,
"Are you sure, you want to exit out of the application? Any unsaved data will be lost!",
"Application Name",
MessageBoxButtons.YesNo,
RadMessageIcon.Question,
MessageBoxDefaultButton.Button2,
RightToLeft.No);
if (dialogResult == DialogResult.Yes)
{
e.Cancel = false;
//Application.Exit();
}
else if (dialogResult == DialogResult.No)
{
e.Cancel = true;
}
base.OnClosing(e);
}
//....
//....
//....
}
更新
如果我使用 FormClosed 事件,而不是 FormClosign 事件,Application.Exit() 可以正常工作,但如果我单击“否”,则在确认消息中它仍在关闭应用程序。
this.FormClosed += new FormClosedEventHandler(App_kill);
App Kill 方法(无法处理 DialogResult.No 响应)
private void App_kill(object sender, FormClosedEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
RadMessageBox.SetThemeName("Material");
DialogResult dialogResult = RadMessageBox.Show(
this,
"Are you sure, you want to exit out of the application? Any unsaved data will be lost!",
"Close Application",
MessageBoxButtons.YesNo,
RadMessageIcon.Question,
MessageBoxDefaultButton.Button2,
RightToLeft.No);
if (dialogResult == DialogResult.Yes)
{
Application.Exit();
}
if (dialogResult == DialogResult.No)
{
//e.Cancel = true;
}
}
}
【问题讨论】:
-
如果您注释掉
RadMessageBox.Show、dialogResult逻辑并然后尝试关闭应用程序会发生什么情况。它会杀死进程吗? (以防 Telerik 做一些奇怪的事情) -
我看到你的类被命名为
BaseForm,你是从它派生一个代表你的应用程序窗口的子类吗? -
@MickyD,是的,如果我删除 RadMessageBox.Show 它将很好地终止进程。是的,我所有的表单都是从 BaseForm 派生的
-
如果在可能关闭窗口期间使用 Telerik 可能会出现错误。也许它附在它上面并进行一些笨拙的模态处理?您可以使用普通的 ol' WinForms
MessageBox.Show,它可能看起来不那么漂亮,但它对 YesNo、Question 等具有相同的功能。我可能会针对 Telerik 提出错误报告 -
@MickyD MessageBox.Show 有同样的问题,这里的问题是这个事件被连接到 FormClosing 事件。当我们调用 Application.Exit() 它再次调用 FormClosing 事件时,我认为在 Application.Exit() 上我应该防止触发 FormClosing
标签: c# winforms telerik .net-4.7.2