在关闭原因上,用户关闭窗体显示关闭对话框 2 次

本文关键字:显示 对话框 窗体 用户 | 更新日期: 2023-09-27 17:55:36

我想

在用户尝试关闭应用程序时显示对话框(我的窗体上的红色窗口和按钮),但是当窗口关闭时,此对话框会阻止关闭,所以我想要通过应用程序检测何时窗口关闭并在没有对话框的情况下继续。这是我的代码

表单加载后 Im 捕获关闭事件:

this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        switch (e.CloseReason)
        {
            case CloseReason.UserClosing:
                if (MessageBox.Show("Do you want to exit the application?", "Your App", MessageBoxButtons.YesNo) == DialogResult.No)
                    {
                        e.Cancel = true;
                    }
                break;
            case CloseReason.WindowsShutDown:
                e.Cancel = false; //this is propably dumb
                break;
            default:
                break;
        }
    }

但是当用户关闭应用程序时,对话框会显示 2 次。第一个对话框点执行任何操作,在第二个对话框之后执行操作。如何显示仅关闭一次的对话框,而在窗口关闭时显示没有对话框(因为窗口正在等待我的应用程序关闭)?

在关闭原因上,用户关闭窗体显示关闭对话框 2 次

编写此代码的更好方法(我认为)是不订阅表单事件,而是使用可用的覆盖方法:

protected override void OnFormClosing(FormClosingEventArgs e)
{
  switch (e.CloseReason)
  {
    case CloseReason.UserClosing:
      if (MessageBox.Show("Do you want to exit the application?", "Your App", MessageBoxButtons.YesNo) == DialogResult.No)
      {
        e.Cancel = true;
      }
      break;
    case CloseReason.WindowsShutDown:
      e.Cancel = false; //this is propably dumb
      break;
    default:
      break;
    }
  base.OnFormClosing(e);
}

您可能需要考虑仅使用 if (e.CloseReason == CloseReason.UserClosing),而不是基于其当前形式的 switch 语句。 默认情况下,e.Cancel 已为 False,因此您无需对其进行严格设置。