使用退出按钮后,FormClosing事件触发两次

时间:2018-04-24 15:37:09

标签: c# winforms

我有一个退出表单的按钮,这是代码

    DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
    if (dialogResult == DialogResult.No)
    {
    }
    else
    {
        Application.Exit();
    }

我尝试使用调试器模式,然后单击“是”后,它会通过Application.Exit(),然后激活FormClosing事件,然后运行相同的对话框。

我也尝试删除FormClosing事件中的代码,因此它只有Application.Exit(),但使用Alt + F4或单击X按钮将自动退出应用程序。

我的问题是如果他想退出程序而不是两次触发对话框,我该如何质疑用户?

提前致谢,我让大家都知道我只是一个初学者,这是我最大的项目,所以我想要做到这一点。

2 个答案:

答案 0 :(得分:3)

这是一个例子。它只要求确认关闭是否由用户启动 - 当Windows重新启动时,您可能不希望弹出MessageBox。

private void form_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            Application.Exit();
        }
    }
    else 
    {
        // Cancel the close
        e.Cancel = true;
    }
 }

答案 1 :(得分:0)

有两种方法可以实现这一目标。

  • 取消订阅偶数按钮点击
  • 正如stuartd的回答中所建议的那样,检查关闭 的原因(但他的答案中存在问题,因此在修复时也添加了这种方法,因此它将有助于未来的人。)

我假设,在这两种情况下都需要此确认,按钮单击和“x”按钮单击,您在两个处理程序中都放了相同的代码。

接近一个

在按钮单击的处理程序中,当您要求用户确认并且用户是否单击“是”时。 在排队之前,

Application.Exit();

您应该取消订阅表格结束活动。通过这样做,它不能在执行Application.Exit()

时引发表单关闭事件

假设您的表单是MainForm并且事件是MainForm_Closing,它看起来像,

    private void btnClose_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.FormClosing -= MainForm_FormClosing;
            Application.Exit();
        }
    }

因此在执行Application.Exit()时不会提升表单结束事件,因此您的问题将得到解决。

接近两个

正如stuartd所建议的那样(根据我的说法更为清晰。为此+1),您可以在Form Closing事件处理程序中检查表单结束原因。

注意他的示例代码中存在一些问题(错误)[您已经接受了答案!!]。错误点击'x' buttonAlt+F4后;如果用户在确认消息上单击“否”,则表示正在关闭表单,因为没有处理其他条件。正确的解决方案应如下所示。

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing)
            {
                DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                    Application.Exit();
                else
                    e.Cancel = true;    //stopping Form Close perocess.
            }
        }