0

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

3 回答 3

2

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

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

所以你不能使用 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...
    }
于 2013-09-25T14:06:45.677 回答
0

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

于 2013-09-25T05:48:07.273 回答
0
new form1().openForm(this);
new form2().openForm(this);

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

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

someForm1.openForm(this);

对于表格 2 显然

someForm2.openForm(this);
于 2013-09-24T05:07:50.120 回答