2011-05-16 96 views
2

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

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

有没有办法解决这个问题?

这是我目前使用的为我的孩子形式的形式结束活动代码:

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

有了这个代码,主要形式的X按钮必须被点击两次,一次关闭子形式,一次关闭主窗体。

回答

7

形式是打算由用户打开和关闭。而且,实际上,当它们关闭时,对象实例会遭到破坏,导致您丢失存储在与该对象实例关联的字段或属性中的所有数据。

因此,您不应将表单实例用作存储数据的永久位置。您需要将这些数据写入磁盘,将其保存到数据库中,或者只是将其存储在您的表单中共享的全部的类实例中(当然,直到您通过代码明确地执行此操作后才会销毁它们,因为它没有用户界面并且不能被用户“关闭”)。

但是,如果您只是想使这项工作,也可以做到这一点。你需要在你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关闭时,您不希望阻止窗口关闭。

+0

谢谢,这个工程。 – isometrik 2011-05-16 16:28:40