【问题标题】:Hiding MDI child forms on close using C# [duplicate]使用 C# 在关闭时隐藏 MDI 子窗体 [重复]
【发布时间】:2011-05-16 16:14:46
【问题描述】:

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

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

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

这是我目前用于我的子表单的表单关闭事件的代码:

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

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

【问题讨论】:

    标签: c# .net winforms mdi


    【解决方案1】:

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

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

    但是,如果您只想完成这项工作,也可以这样做。您需要将FormClosing 事件处理程序中的代码更改为e.CloseReason 属性指示子窗体由于直接用户交互而关闭时阻止它们关闭: p>

    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 关闭时,您也不想阻止窗口关闭。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多