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

在Form_FormClosing事件中设置e.Cancel = true后,窗体仍然关闭

取消表单关闭事件可以防止:

  1. 用户关闭表单
  2. 应用程序。退出退出应用程序
  3. 调用表单的代码。关闭表单

但是它不能阻止:

  1. 用户关闭应用程序主表单
  2. 代码调用表。在表单
  3. 上进行处理
  4. 代码调用表。关闭应用程序的主窗口

最后3种情况甚至不会触发非主表单上的表单关闭事件,所以表单没有机会取消它就消失了。也许您的应用程序首先以前3种方式之一关闭表单,这会触发事件,然后以后3种方式之一(或类似的方式)关闭表单,这不会触发事件,但无论如何都会强制关闭表单。

编辑:

将此函数添加到窗体代码中,它将允许您在调试器中查看当窗口关闭时调用堆栈的样子,以便您可以看到实际导致它的原因:

  protected override void DestroyHandle()
  {
     System.Diagnostics.Debugger.Break();
     base.DestroyHandle();
  }