我想在关闭表单之前显示一个MessageBox来确认退出。因此,创建了一个FormClosing事件。
private void Form_Main_FormClosing(object sender, FormClosingEventArgs e)
{
//nothing here for now
}
我将MessageBox显示两次。调试工具显示代码以某种方式遍历FormClosing()两次。即使我在上面的FormClosing()中没有任何内容,也会发生这种情况。我在我的整个代码中搜索了FormClosing(),并且只有一个地方可以订阅它。我在其他两个项目中有相同的FormClosing(),但这不会发生。任何人都可以给我指针吗?这对我没有任何意义。
答案 0 :(得分:3)
您不能在FormClosing事件处理程序中调用Close和Dispose方法
表单结束代码应为:
private void Form_Main_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("EXIT?", "Exit Program", MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
e.Cancel = true;
}
}
答案 1 :(得分:2)
最可能的'猜测'是你订阅了两次事件。如果您使用的是Designer,请记得检查自动生成的设计器代码。
如果您在事件上设置BreakPoint - 您还可以调出调用堆栈(http://msdn.microsoft.com/en-us/library/a3694ts5.aspx - 调试/窗口/调用堆栈)并且您可以看到执行了什么代码来到达你所在的位置。
完全可以直接调用事件处理程序(但可能不太可能是你错误地执行了);但是查看调用堆栈可以帮助追踪它。
最后 - 确保在处理Closing事件时你没有调用Application.Exit
或类似事件 - 我相信这会引发第二次触发。
答案 2 :(得分:2)
好的,我明白了。我有:
的InitializeComponent();
在两个地方。删除其中一个后,事情按照他们应该的方式工作。