在C#中创建程序,FormClosing事件执行两次

时间:2015-05-21 09:38:34

标签: c# winforms formclosing

正如我在标题中所说,我正在创建一个程序。但是,我遇到了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;
    }
}

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

3 个答案:

答案 0 :(得分:4)

您的问题是您正在呼叫Application.Exit()。作为MSDN says

  

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

换句话说,它会再次触发表格结束事件。

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

答案 1 :(得分:1)

您的第二个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 中处理它。
但我不会在这里做。

答案 2 :(得分:0)

您真的不应该向用户投掷多个消息框...您可能想要阅读thisthisthis。也就是说,我考虑退出并提示保存为其中一个好点,但不是两个。

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

如果他们回答否,请不要再问。我现在可以听到他们了......

  

"我已经告诉你,只是退出!!!"