C# MDI父级的OnFormClosing方法

C# MDI父级的OnFormClosing方法,c#,.net,winforms,C#,.net,Winforms,每当我单击红色的X按钮关闭MDI父窗体时,它首先调用MDI子窗体的所有OnFormClosing方法,然后调用MDI父窗体的OnFormClosing方法。但是,在MDI父级的OnFormClosing方法中,我可以编写e.Cancel=true代码中的某个地方。在这种情况下,它不应该调用MDI子窗体的OnFormClosing方法 1-)是否有办法确保关闭MDI父窗体不会触发MDI子窗体的OnFormClosing方法 2-)是否有MDI子窗体的方法,以便在我关闭该子窗体时调用此方法,而在我关

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

1-)是否有办法确保关闭MDI父窗体不会触发MDI子窗体的OnFormClosing方法


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

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

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


您可以使用较低级别的方法,并处理窗体的事件:


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

我不完全理解您为什么要这样做?!你的问题中有些事情甚至是不可能的。你能说得更具体一点吗……这很有效,但当你试图让机器关机时,效果并不好。谢谢你,这是一个很好的解决办法,它解决了我的问题。@HansPassant是的,我同意。我也讨厌程序问我是否确定要退出程序,但这只是一个例子。这种方法的有用性是显而易见的。
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);
}