使用C#关闭MDI子窗体时隐藏它们

4

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

我尝试将窗体关闭事件设置为仅隐藏窗体,但是当用户关闭主父窗体时,应用程序不会退出。

有没有解决这个问题的方法?

以下是我目前在子窗体的窗体关闭事件中使用的代码:

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

使用这段代码,主窗体的X按钮必须点击两次才能关闭子窗体和主窗体。

1个回答

10

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

因此,您不应将表单实例用作永久存储数据的位置。您需要将数据写入磁盘,保存到数据库中,或者只是将其存储在跨所有表单共享的类实例中(当然,除非您通过代码明确这样做,否则它不会被销毁,因为它没有用户界面,无法被用户“关闭”)。

但是,如果您只想让它工作,也可以这样做。您需要更改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关机时阻止窗口关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接