隐藏MDi的Childform

时间:2013-09-24 03:04:39

标签: c# winforms mdi mdichild mdiparent

我有一个带有两个按钮的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);
    }
 }

3 个答案:

答案 0 :(得分:2)

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

不幸的是,你的案例中存在一个字节错误。销毁本机窗口也会使它从Application.OpenForms()集合中消失。您依赖该集合来查找窗口,它不会起作用,您将始终创建表单的 new 实例。当然,TextBox中没有任何文本。使用调试器btw很容易看到。

因此您无法使用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...
    }

答案 1 :(得分:0)

new form1().openForm(this);
new form2().openForm(this);

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

var someForm1 = new form1();
var someForm2 = new form2();

someForm1.openForm(this);
表格2的

显然是

someForm2.openForm(this);

答案 2 :(得分:0)

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