【问题标题】:How to prevent MDI main form closing from MDI Child如何防止 MDI 主窗体从 MDI Child 关闭
【发布时间】:2010-05-10 08:24:26
【问题描述】:

我有一个 MDI 主窗体。我在上面托管了一个表单,我希望它在关闭之前显示一个消息框(询问用户是否保存更改)。

到目前为止一切顺利,但是我发现关闭 MDI 主窗体不会引发 MDI 子 FormClosing 事件。我想我会在 MDI 主的 FormClosing 事件(确实会引发)中调用 MdiChild.Close()。这个接缝可以工作,但它确实会导致问题......

在我显示的消息框中,我让用户保存更改,而不是保存更改并取消关闭。通常这工作正常,但我似乎无法找到取消 MDI 主的 FormClosing 事件的方法。有没有一种优雅的方式来做到这一点?

编辑:我通过抛出异常(当用户决定取消关闭过程时)解决了这个问题,该异常在 MDI 主的 FormClosing 事件中被捕获。通过这种方式,我知道何时必须取消 MDI 主的 FormClosing 事件,并且这个接缝可以正常工作......但是我无法相信这个“​​hax”是这样做的唯一方法。肯定有更好的方法吗?

【问题讨论】:

    标签: c# mdi formclosing


    【解决方案1】:

    我认为当用户投票取消关闭时,您取消子窗体上的关闭?

    在这种情况下,我会关闭这个主窗体

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            foreach (Form frm in this.MdiChildren)
            {
                frm.Close();
            }
        }
        e.Cancel = (this.MdiChildren.Length > 0);
    }
    

    【讨论】:

    • 不,不要这样做,因为您可能希望在用户在“保存更改”提示上点击取消时立即停止。您不希望用户此时必须循环浏览每个表单,而这段代码就是这样做的。相反,在调用 Close() 之后,检查 frm.IsDisposed。如果为 false,则表单由于某种原因无法关闭,您应该设置 e.Cancel = true 并从 foreach 循环中中断。这样一旦用户点击取消,整个操作就会停止。
    【解决方案2】:

    我建议不要在子窗体上调用Close,而是可以在子窗体中创建一个类似ReadyToClose 的方法,然后主窗体循环并为每个子窗体调用它,它会向用户提出问题并在需要时进行保存,最后如果可以继续,它将返回 true。

    如果所有孩子都对关闭进行“投票”,则您将其全部关闭,否则您什么也不关闭。

    【讨论】:

      【解决方案3】:

      当关闭 MDI 主窗体时,首先调用所有子 Close 事件,因此,在 foreach 循环上调用 frm.Close() 时,再次调用子的 Close 事件(我不知道为什么应该这样做已经关闭)。

      ho1 建议对我来说效果很好。这是我修改后的 foreach 循环(ClosableMDIChildForm 是一个包含 IsOkToClose() 方法的接口):

      foreach (ClosableMDIChildForm cmdif in this.MdiChildren)
      {
          if (!cmdif.IsOkToClose())
          {
              e.Cancel = true;
              ((Form)mdifc).Focus();
              break;
          }
      }
      

      显然,this.MdiChildren 表单必须实现 ClosableMDIChildForm 接口。决定是否可以关闭窗口的逻辑在 IsOkToClose() 的实现中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 2012-10-30
        • 1970-01-01
        相关资源
        最近更新 更多