使用C#关闭MDI子窗体

iso*_*rik 3 .net c# mdi winforms

我目前正在构建一个多文档界面应用程序,但是当通过x按钮关闭子窗体时我遇到了问题.当窗体关闭时,再次显示它的唯一方法是创建该特定窗体的新实例,这意味着前一个窗体中包含的所有数据都将丢失.

我试图将表单关闭事件设置为简单地隐藏表单,但是当用户关闭主父表单时,应用程序不会退出.

有没有解决的办法?

这是我目前用于我的子表单'表单结束事件的代码:

private void ParameterForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.FormOwnerClosing)
    {
        this.Hide();
        e.Cancel = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,必须单击主窗体的x按钮两次,一次关闭子窗体,一次关闭主窗体.

Cod*_*ray 9

表格旨在由用户打开和关闭.实际上,当它们关闭时,对象实例会被销毁,导致您丢失存储在与该对象实例关联的字段或属性中的所有数据.

因此,您不应将表单实例用作存储数据的永久位置.您需要将该数据写入磁盘,将其保存到数据库中,或者可能只是将其存储在所有表单共享的类实例中(当然,在您通过代码明确地执行此操作之前,不会销毁它)它没有用户界面,用户无法"关闭".

但是,如果您只是想让这项工作成功,那么也可以这样做.你需要在你的更改代码FormClosing的事件处理程序防止子窗体从收盘时的e.CloseReason属性表示,他们正在关闭作为直接用户互动的结果:

private void ParameterForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        this.Hide();
        e.Cancel = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

您的检查不起作用(e.CloseReason != CloseReason.FormOwnerClosing)的原因是您有一个MDI应用程序.在MDI父级关闭时使用了一个特殊原因:CloseReason.MdiFormClosing.你可以看为,但它是简单的做到这一点上面显示的方式,因为你不希望防止从窗口时,Windows是关闭被关闭,例如.