使用C#关闭MDI子窗体

时间:2011-05-16 16:14:46

标签: c# .net winforms mdi

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

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

有解决方法吗?

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

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

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

1 个答案:

答案 0 :(得分:9)

用户打开和关闭

表单意图。实际上,当它们关闭时,对象实例可能会被销毁,导致您丢失存储在与该对象实例关联的字段或属性中的所有数据。

因此,您不应将表单实例用作存储数据的永久位置。你需要写数据到磁盘上,将其保存到数据库中,或者简单地将其存储在跨越的所有的你的表格(即,当然,也不会被破坏,直到您共享一个类的实例通过代码明确地这样做,因为它没有用户界面,并且不能被用户“关闭”。

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

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

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