5

这是有问题的代码:

    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;行中添加了断点以确保它正在执行。

单击确定后表单立即关闭。

下面是调用 FormAccounting 的代码:

    private void buttonAccounts_Click(object sender, EventArgs e)
    {
        FormAccounting NewFormAccounting = new FormAccounting();
        NewFormAccounting.Show();
    }
4

1 回答 1

13

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

  1. 用户关闭表单
  2. Application.Exit 退出应用程序
  3. 在表单上调用 Form.Close 的代码

但它不能防止:

  1. 用户关闭应用程序的主窗体
  2. 在表单上调用 Form.Dispose 的代码
  3. 在应用程序的主窗口上调用 Form.Close 的代码

最后 3 种情况甚至不会触发非主表单上的表单关闭事件,因此表单会消失而没有机会取消它。也许您的应用程序导致表单首先以触发事件的前 3 种方式之一关闭,然后以后 3 种方式(或类似方式)之一关闭,这不会触发事件并强制关闭表单.

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

  protected override void DestroyHandle()
  {
     System.Diagnostics.Debugger.Break();
     base.DestroyHandle();
  }
于 2011-08-17T11:38:12.647 回答