正如我在标题中所说,我正在创建一个程序。但是,我遇到了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;
}
}
我发现的其他任何东西都没有帮助过我。就像我之前说的那样,消息框出现两次。这是我唯一的问题。这个空虚的其他一切工作正常。
答案 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)