【问题标题】:FormClosing() event loaded twice [closed]FormClosing()事件加载了两次[关闭]
【发布时间】:2012-06-01 11:29:39
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试过重建解决方案?
  • 堆栈跟踪说明了它是如何到达那里的?
  • 您能否发布您的代码。如果不是代码,那么骨架至少?
  • 我已经重建了它。同样的事情发生。它不断检查 FormClosing() 两次。对我来说毫无意义。
  • 搜索Form_Main_FormClosing查看是否被两次订阅。

标签: c# formclosing


【解决方案1】:

您不能在 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;
     }
  }

【讨论】:

    【解决方案2】:

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

    如果您在事件上设置了断点 - 您还可以拉起调用堆栈(http://msdn.microsoft.com/en-us/library/a3694ts5.aspx - 调试/窗口/调用堆栈)并且您可以看到执行了哪些代码才能到达您所在的位置。

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

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

    【讨论】:

    • 好的,为了方便起见,我在这里上传了我的代码:docs.google.com/open?id=0B3dcu0IKtxKxblRudlhVOE1rZWM 当我使用 This.Dispose() 时,它会加载两次。当我使用 This.Close() 时,它永远不会关闭。现在这个谜团吓坏了我。以前从未发生过。我有另外两个使用相同方法的表单应用程序,它们运行良好。帮助!!!!!!!! Visual Studio 中的幽灵!!!!!!
    • 我之前搜索过Application.Exit。它不在整个解决方案中。
    【解决方案3】:

    好的,我想通了。我有:

    初始化组件();

    在两个地方。移除其中一个后,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多