2013-09-24 2 views
0

У меня есть MdiParent с двумя кнопками, когда button1 нажимает форму 1, показывается, и когда button2 нажимает форму, будет отображаться, тогда форма 1 будет скрываться и наоборот. Например, я нажимаю кнопку1, когда открывается форма1, затем я ввожу текстовое поле формы1. После этого я нажимаю кнопку2, затем отображается форма 2 и образует1. Проблема заключается в том, что я снова нажимаю кнопку 1, пока не появится форма1, но ранее отсутствующий тип 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:

EDIT

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- done :) –

0

попробуйте использовать form.hide(); для сокрытия формы и form.show(); для показа формы снова ..

+0

@vyskah еще не повезло –

Смежные вопросы