【问题标题】:Creating program in C#, FormClosing event executes twiceC#创建程序,FormClosing事件执行两次
【发布时间】:2015-05-21 09:38:33
【问题描述】:

正如我在标题中所说,我正在创建一个程序。但是,我面临FormClosing 事件执行两次的问题。出现消息框并且按钮很好地执行了它们的目的,但是当我单击“是”或“否”时,它会重复出现。幸好“取消”按钮没有这个问题。

private void Form1_FormClosing (object sender, FormClosingEventArgs e)
{
    DialogResult dialog = MessageBox.Show("Do you want to save your progress?", "Media Cataloguer", MessageBoxButtons.YesNoCancel);

    if (dialog == DialogResult.Yes)
    {
        SaveFileDialog savefile = new SaveFileDialog();
        savefile.Filter = "Text files|*.txt";
        savefile.Title = "Save As";
        savefile.ShowDialog();
        System.IO.FileStream fs = (System.IO.FileStream)savefile.OpenFile();
        Application.Exit();
    }
    else if (dialog == DialogResult.No)
    {
        MessageBox.Show("Are you sure?", "Media Cataloguer", MessageBoxButtons.YesNo);
        Application.Exit();
    }
    else if (dialog == DialogResult.Cancel)
    {
        e.Cancel = true;
    }
}

我发现没有其他任何东西对我有很大帮助。就像我之前说的,消息框出现了两次。那是我唯一的问题。这个 void 的其他一切工作正常。

【问题讨论】:

  • 如果删除 Application.Exit(); 会发生什么从你的代码?可能是表单正在关闭并且您调用 Application.Exit();哪个再次触发事件?
  • 能否贴出调用Form1_FormClosing的代码
  • 听起来你注册了两次事件处理程序。检查您自己和设计器生成的代码。
  • 订阅两次可能是个问题,Application.Exit() 也可能。如果您没有提出解决方案,您可能希望在您的方法之上设置一个标志,以将关闭过程标记为正在运行。并且只有在关闭过程尚未运行时才继续执行该方法。

标签: c# winforms formclosing


【解决方案1】:

你的问题是你打电话给Application.Exit()。作为MSDN says

Exit 方法停止所有线程上所有正在运行的消息循环,并 关闭应用程序的所有窗口

换句话说,它会再次触发表单关闭事件。

要解决这个问题,请改用Environment.Exit(0)

【讨论】:

    【解决方案2】:

    您的第二个 MessageBox 没有意义,您不必退出应用程序。
    如果您不将 e.Cancel 设置为 true,则该窗口应该关闭:
    https://msdn.microsoft.com/en-us/library/system.windows.window.closing%28v=vs.110%29.aspx

    private void Form1_FormClosing (object sender, FormClosingEventArgs e) {
        DialogResult dialog = MessageBox.Show("Do you want to save your progress?", "Media Cataloguer", MessageBoxButtons.YesNoCancel);
    
        if (dialog == DialogResult.Yes) {
            SaveFileDialog savefile = new SaveFileDialog();
            savefile.Filter = "Text files|*.txt";
            savefile.Title = "Save As";
            savefile.ShowDialog();
            System.IO.FileStream fs = (System.IO.FileStream)savefile.OpenFile();
        } else if (dialog == DialogResult.No) {
            if(MessageBox.Show("Are you sure?", "Media Cataloguer", MessageBoxButtons.YesNo) == DialogResult.No){
               e.Cancel = true;
            }
        } else if (dialog == DialogResult.Cancel) {
            e.Cancel = true;
        }
    }
    

    我不会在窗口关闭事件中退出应用程序。
    它不是为执行该任务而设计的。
    您可以使用项目设置来定义应用程序何时退出
    或者,如果您需要更多控制,您可能需要在 App.cs 中进行处理。
    但我不会在这里做。

    【讨论】:

    • 这将是一个简单的程序。真的不会有太多事情。主要的是,它不会像 Skype 那样“关闭”。
    【解决方案3】:

    您真的不应该向用户抛出多个消息框...您可能想阅读thisthisthis。也就是说,我考虑退出时提示保存为一个的好位置之一,但不是两个。

    您已经建立了正确的机制(他们可以回答是、否或取消)。修改你的问题,让用户更清楚:“你想在退出之前保存你的工作吗?”如果他们取消,则像您使用e.Cancel 一样取消。否则,只需让表单自行关闭。

    如果他们回答不是,就不要再问了。我现在可以听到他们的声音了……

    “我已经告诉过你,退出!!!”

    【讨论】:

    • 无关紧要,但仍然是一个好点。不知道为什么我没有想到这一点。感谢您指出这一点。
    猜你喜欢
    • 2012-06-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多