FormClosing()事件加载了两次。

4

我想在让窗体关闭之前显示一个消息框来确认退出。因此,创建了一个FormClosing事件。

  private void Form_Main_FormClosing(object sender, FormClosingEventArgs e)
  {
     //nothing here for now
  }

我有两次弹出MessageBox的情况。调试工具显示代码会两次执行FormClosing(),即使我在上面什么也没有写。我在整个代码中搜索了FormClosing(),只有一个地方订阅了它。我在另外两个项目中也有相同的FormClosing(),但这种情况并未发生。有人能给我指点吗?这对我来说毫无意义。


1
你尝试过重新构建解决方案吗? - Ernestas Romeika
2
堆栈跟踪(Stack Trace)会告诉你它是如何到达那里的? - Tony Hopkinson
我不知道如何使用堆栈跟踪。 - CaTx
2
搜索 Form_Main_FormClosing 以检查是否订阅了两次。 - Tergiver
如果您正在尝试在此事件中退出应用程序,则应在Application.Exit()语句之前取消订阅此事件处理程序。这是因为Application.Exit()函数会再次触发FormClosing事件。 - chaosifier
显示剩余2条评论
3个回答

4

在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;
     }
  }

Dispose方法不会调用FormClosing事件。 - nawfal

2
最有可能的“猜测”是您订阅了事件两次。如果您正在使用设计师,请记得检查自动生成的设计器代码。
如果您在事件上设置了断点,则还可以打开调用堆栈(http://msdn.microsoft.com/en-us/library/a3694ts5.aspx - Debug / Window / Call Stack),并查看执行的代码,以了解到达当前位置的原因。
直接调用事件处理程序是完全可能的(但很可能不会误操作);但查看调用堆栈可以帮助跟踪它。
最后,请确保在处理关闭事件时不要调用 Application.Exit 或类似方法,因为这可能会触发第二次触发。

为了方便起见,我在这里上传了我的代码:https://docs.google.com/open?id=0B3dcu0IKtxKxblRudlhVOE1rZWM当我使用This.Dispose()时,它会加载两次。当我使用This.Close()时,它永远不会关闭。现在这个谜团让我感到非常害怕。以前从未发生过。我有另外两个使用相同方法的表单应用程序,它们运行良好。救命啊!!!!!Visual Studio里面有鬼!!!! - CaTx
我之前搜索过Application.Exit,在整个解决方案中都没有找到。 - CaTx

2

好的,我明白了。我有:

InitializeComponent();

在两个位置。删除其中一个后,一切都按照应该的方式工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接