在Form_FormClosing事件中设置e.Cancel = true后,窗体仍然关闭
本文关键字:true 窗体 Cancel FormClosing Form 事件 设置 | 更新日期: 2023-09-27 18:05:45
这是有问题的代码:
private void FormAccounting_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.FormAccountingLocation = this.Location;
Properties.Settings.Default.Save();
if (IsEditing)
{
MessageBox.Show("Please save or cancel open transactions before closing the accounting window.", "Open Transactions", MessageBoxButtons.OK, MessageBoxIcon.Information);
e.Cancel = true;
}
}
我已经在e.Cancel = true;
行中添加了断点,以确保它被执行。
单击Ok后,窗体立即关闭。
下面是调用FormAccounting的代码: private void buttonAccounts_Click(object sender, EventArgs e)
{
FormAccounting NewFormAccounting = new FormAccounting();
NewFormAccounting.Show();
}
取消表单关闭事件可以防止:
- 用户关闭表单
- 应用程序。退出退出应用程序
- 调用表单的代码。关闭表单
但是它不能阻止:
- 用户关闭应用程序主表单
- 代码调用表。在表单 上进行处理
- 代码调用表。关闭应用程序的主窗口
最后3种情况甚至不会触发非主表单上的表单关闭事件,所以表单没有机会取消它就消失了。也许您的应用程序首先以前3种方式之一关闭表单,这会触发事件,然后以后3种方式之一(或类似的方式)关闭表单,这不会触发事件,但无论如何都会强制关闭表单。
编辑:将此函数添加到窗体代码中,它将允许您在调试器中查看当窗口关闭时调用堆栈的样子,以便您可以看到实际导致它的原因:
protected override void DestroyHandle()
{
System.Diagnostics.Debugger.Break();
base.DestroyHandle();
}