点击退出按钮后FormClosing事件触发两次的问题求助
解决退出按钮触发二次确认对话框的问题
这个问题我之前也碰到过,核心原因就是Application.Exit()会触发所有打开窗体的FormClosing事件——哪怕你以为已经删掉了FormClosing事件里的代码,只要事件绑定还存在(比如设计器自动生成的绑定没移除),就会导致二次弹窗。下面给你几个可行的解决办法:
方法1:彻底移除FormClosing事件绑定
先检查你的窗体设计器文件(比如YourForm.Designer.cs),看看有没有类似下面的代码:
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.YourForm_FormClosing);
如果有,直接删除这行代码,同时把对应的事件处理方法(比如YourForm_FormClosing)也删掉,这样Application.Exit()就不会触发额外的确认逻辑了。
方法2:用标记变量区分退出触发源
如果你需要保留FormClosing事件的其他逻辑(比如用户点击窗体右上角叉号时的确认),可以添加一个标记变量来区分是通过退出按钮触发的退出,还是其他方式:
- 在窗体类里定义一个私有布尔变量:
private bool _isInitiatedExit = false; - 修改退出按钮的点击事件代码:
private void btnExit_Click(object sender, EventArgs e) { DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { _isInitiatedExit = true; Application.Exit(); } } - 在FormClosing事件处理程序里添加判断:
private void YourForm_FormClosing(object sender, FormClosingEventArgs e) { if (!_isInitiatedExit) { // 这里只处理非按钮触发的退出(比如点击叉号) DialogResult result = MessageBox.Show("Are you sure you want to exit?", "Exit", MessageBoxButtons.YesNo); if (result == DialogResult.No) { e.Cancel = true; } } }
这样当通过退出按钮触发退出时,标记设为true,FormClosing里就不会再弹出确认框了。
方法3:改用窗体关闭代替Application.Exit()
你也可以不用Application.Exit(),直接关闭主窗体,这样应用程序会自动退出(只要Program.cs里是Application.Run(new YourMainForm())):
修改退出按钮的代码:
private void btnExit_Click(object sender, EventArgs e) { DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { this.Close(); } }
如果需要保留FormClosing的确认逻辑,同样可以结合上面的标记变量来区分触发源,避免二次弹窗。
内容的提问来源于stack exchange,提问作者Jonathan Tapnio
相关产品推荐
相关产品推荐

