4

我想在关闭表单之前显示一个 MessageBox 以确认退出。因此,创建了一个 FormClosing 事件。

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

我的 MessageBox 显示了两次。调试工具显示代码以某种方式通过 FormClosing() 两次。即使我在上面的 FormClosing() 中没有任何内容,也会发生这种情况。我确实在我的整个代码中搜索了 FormClosing() ,并且只有一个地方可以订阅它。我在另外两个项目中有相同的 FormClosing() ,但这并没有发生。谁能给我指点?这对我来说没有任何意义。

4

3 回答 3

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;
     }
  }
于 2012-05-28T18:04:13.647 回答
2

好的,我想通了。我有:

初始化组件();

在两个地方。删除其中一个后,事情会按应有的方式工作。

于 2012-05-29T15:51:18.667 回答
2

最有可能的“猜测”是您订阅了该事件两次。如果您使用设计器,请记住检查自动生成的设计器代码。

如果你在事件上设置了一个断点 - 你也可以拉起调用堆栈(http://msdn.microsoft.com/en-us/library/a3694ts5.aspx - 调试/窗口/调用堆栈),你可以看到什么执行代码以到达您所在的位置。

完全可以直接调用事件处理程序(但您不太可能会误操作);但是查看调用堆栈可以帮助追踪它。

最后 - 确保您Application.Exit在处理 Closing 事件时没有调用或类似事件 - 我相信这会触发第二次触发。

于 2012-05-25T23:04:59.477 回答