【问题标题】:Hide Childform of MDi隐藏 MDi 的子窗体
【发布时间】:2013-09-24 03:04:39
【问题描述】:

我有一个带有两个按钮的 MdiParent,当 button1 被点击时 form1 将显示,当 button2 点击 form2 时将显示 form1 将隐藏,反之亦然。例如,我单击 form1 打开的 button1,然后输入 form1 的 textBox。之后,我单击 button2 然后 form2 显示和 form1 隐藏。问题是当我再次单击 form1 显示的 button1 但之前在 textBox 中的类型丢失时。似乎表单不是隐藏而是关闭,然后在单击按钮时再次打开。

public static class Extensions
{
    public static void openForm<T>(this T frm, Form parent) where T : Form, new()
    {
        foreach (Form childForm in parent.MdiChildren)
        {
            childForm.Visible = false;
        }
        foreach (Form form in Application.OpenForms)
        {
            if (form.GetType() == typeof(T))
            {
                form.Visible = true;
                return;
            }
        }
        frm = new T();
        frm.MdiParent = parent;
        frm.WindowState = FormWindowState.Normal;
        frm.StartPosition = FormStartPosition.CenterScreen;
        frm.MaximizeBox = false;
        frm.MinimizeBox = false;
        frm.Show();
    }
}

这就是我打开子窗体的方式:

编辑

public partial class MainForm : Form
{
    form1 newform1 = new form1();
    form2 newform2 = new form2();
    private void Button1_Click(object sender, EventArgs e)
    {
        newform1.openForm(this);
    }
    private void Button2_Click(object sender, EventArgs e)
    {
        newform2.openForm(this);
    }
 }

【问题讨论】:

    标签: c# winforms mdi mdichild mdiparent


    【解决方案1】:

    MDI 实际上不支持隐藏子窗口。 Winforms 有一个解决方法,当您将其 Visible 属性设置为 false(或调用 Hide())时,它将破坏本机窗口,并在您创建它时 重新创建该窗口再次可见。

    不幸的是,在您的情况下存在字节错误。销毁本机窗口也会使其从 Application.OpenForms() 集合中消失。您依靠该集合来找到窗口,它不会工作,您将始终创建表单的 new 实例。当然,该文本框中没有任何文本。顺便说一句,调试器很容易看到。

    因此您不能使用 OpenForms 集合。但是,您可以使用 MdiChildren 集合来找回它。所以重写为:

        bool found = false;
        foreach (Form childForm in parent.MdiChildren) {
            if (form.GetType() = typeof(T)) form.Visible = found = true;
            else form.Visible = false;
        }
        if (!found) {
           // etc...
        }
    

    【讨论】:

      【解决方案2】:
      new form1().openForm(this);
      new form2().openForm(this);
      

      您正在创建表单的新实例,显示的表单不是隐藏的表单,这就是文本框中的文本丢失的原因。尽量不要创建新实例。

      var someForm1 = new form1();
      var someForm2 = new form2();
      
      someForm1.openForm(this);
      

      显然是表格2

      someForm2.openForm(this);
      

      【讨论】:

      • @mdcuesta-还是一样
      • 您能否显示实例化表单并调用扩展方法 openForm 的代码,它可能是您在方法范围内创建对象,并且它在方法结束时死亡。
      【解决方案3】:

      尝试使用form.hide(); 隐藏表单并使用form.show(); 再次显示表单..

      【讨论】:

      • @vyskah 仍然没有运气
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多