Winforms应用程序.关闭x应用程序或单击带有确认消息的退出按钮时退出



我正在开发一个带有Telerik WinForm(2019.2.618.40(控件的WinForms(.NET 4.7.2(应用程序。

单击窗口顶部紧固的关闭框[x]图标时,我想要求用户确认,如果只是,则关闭应用程序。

以下代码效果很好,它会关闭窗口,但它不是关闭过程(我仍然可以在任务管理器中看到该应用程序(。

我相信我需要打电话给Application.Exit();来终止应用程序进程。但是当我调用关闭事件时,触发了两次,我得到了两次确认窗口并收到以下错误

System.InvalidOperationException: 'Collection 已被修改; 枚举操作可能无法执行。

如何更正关闭事件,以便我可以要求用户确认并关闭窗口以及从任务管理器中干净地退出应用程序?

我的基本表单

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);
}

//....
//....
//....
}

更新


而不是FormClosign事件,如果我使用FormClosed事件,Application.Exit()工作正常,但在确认消息中,如果我单击否,它仍在关闭应用程序。

this.FormClosed += new FormClosedEventHandler(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;
}
}
}

感谢nihique发布在这里 https://stackoverflow.com/a/13459878/942855 并且米基德在这个问题评论中也指出了。

显然我的闭幕活动没有问题。当我从表单 A 重定向到表单 B 时,我必须执行以下接线,然后它就像一个魅力

var newform = new myNewForm();
newform.Closed += (s, args) => this.Close();
this.Hide();
newform.Show();

相关内容

最新更新