2013-09-24 46 views
0

我有一个带有两个按钮的MdiParent,当button1点击form1时会显示,当button2点击时form2会显示,然后form1会隐藏,反之亦然。例如我点击button1 form1打开,然后我输入form1的文本框。之后,我点击button2然后form2显示和form1隐藏。问题是当我再次单击form1所显示的button1时,textBox中以前的类型丢失。看起来表单并不隐藏,而是关闭,然后单击按钮时再次打开。隐藏MDi的子表单

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(); 
    } 
} 

我这是怎么打开childform:

编辑

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); 
    } 
} 

回答

1

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

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

所以你不能使用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... 
    } 
0
new form1().openForm(this); 
new form2().openForm(this); 

要创建的窗体的新实例,显示的形式不是它们的形式隐藏这就是为什么文本框中的文本丢失。尽量不要创建新的实例。

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

someForm1.openForm(this); 

表单2明显

someForm2.openForm(this); 
+0

@ mdcuesta,还是一样 –

+0

你能证明你实例的形式,并调用扩展方法的OpenForm 的代码,它可能是你创造的方法范围的对象,它死在方法的最后。 – mdcuesta

+0

@ mdcuesta-完成:) –

0

使用form.hide();隐藏的形式和form.show();再次显示窗体的尝试..

+0

@vyskah仍然没有运气 –