0

每当我单击红色 X 按钮关闭 MDI 父窗体时,它首先调用 MDI 子窗体的所有 OnFormClosing 方法,然后调用 MDI 父窗体的 OnFormClosing 方法。但是,在我的 MDI Parent 的 OnFormClosing 方法中,我可以e.Cancel = true;在代码中的某处编写。在这种情况下,它不应该调用 MDI 子窗体的 OnFormClosing 方法。

1-) 有没有办法确保关闭 MDI Parent 不会触发 MDI 子窗体的 OnFormClosing 方法?

2-) 是否有针对 MDI 子窗体的方法,以便在我关闭该子窗体时调用此方法,而在关闭其父窗体时不会调用此方法?

4

2 回答 2

2

您可以使用较低级别的方法,WndProc并处理表单的WM_CLOSE事件:

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x10) // WM_CLOSE
    {
        // Process the form closing. Call the base method if required,
        // and return from the function if not.
        // For example:
        var ret = MessageBox.Show("Do you really want to exit?", "Exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (ret == System.Windows.Forms.DialogResult.No)
            return;
    }
    base.WndProc(ref m);
}

将此代码放入 MDI 父窗体。它会FormClosing在子表单上的事件之前发生。

于 2013-02-13T09:09:59.740 回答
0

我猜你无法控制它,如此处所述

表单关闭事件

如果窗体是多文档界面 (MDI) 父窗体,则在引发 MDI 父窗体的 FormClosing 事件之前引发所有 MDI 子窗体的 FormClosing 事件。同样,在引发 MDI 父表单的 FormClosed 事件之前引发所有 MDI 子表单的 FormClosed 事件。取消 MDI 子窗体的 FormClosing 事件不会阻止引发 MDI 父窗体的 FormClosing 事件。但是,取消事件会将作为参数传递给父窗体的 FormClosingEventArgs 类的 Cancel 属性设置为 true。若要强制关闭所有 MDI 父窗体和子窗体,请将 MDI 父窗体中的 Cancel 属性设置为 false。

于 2013-02-13T09:03:37.330 回答