2012-05-10 2 views
1

Я использую следующие коды для отображения дочерней формы в родительской форме MDI. Как вы знаете, нажатие кнопки приведет к появлению новой формы. Продолжайте нажимать кнопку, и ваш экран будет заполнен пустыми формами. Чтобы этого не произошло, я переместил код, который создает форму за пределами кнопки.Ребенок в родительском домике mdi в C#

Как это:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    Form2 f2 = new Form2();  

    private void button1_Click(object sender, EventArgs e) 
    { 
     f2.MdiParent = this; 
     f2.Show(); 
    } 

Но когда я закрываю форму ребенка и хочу, чтобы открыть его снова, он не будет препятствовать мне.

Пожалуйста, помогите мне решить эту проблему.

+0

'Form2 f2 = новый Form2();' на самом деле создает экземпляр, поэтому, если вы выпустите его только один раз, а затем не будете снова вызваны. Возможно, вам понадобится «Скрыть()», когда произойдет событие закрытия, а затем «Show()», когда вы нажмете – V4Vendetta

ответ

5

Вам нужно отслеживать состояние формы, чтобы вы знали, что вам нужно создать новый. Например:

private Form2 f2;  

private void button1_Click(object sender, EventArgs e) 
{ 
    if (f2 == null) { 
     f2 = new Form2(); 
     f2.MdiParent = this; 
     f2.FormClosed += delegate { f2 = null; }; 
     f2.Show(); 
    } 
    else { 
     f2.Activate(); 
    } 
} 
+0

. Таким образом, вы сохраняете все свои формы (mdichilds) в виде отдельных переменных (дважды) – riffnl

+0

Есть ли способ запретить показ дочерней формы, когда другая дочерняя форма уже активирована? – aliboy38

1

Вы не хотите, чтобы все ваши формы (дважды) были переменными. Все формы mdi добавляются в коллекцию MdiChildren. Итак, вы хотите проверить, нужно ли показывать форму, которую вы создали. Как так:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = new Form2(); 
    f2.MdiParent = this; 
    OpenMdiChild(f2); 
} 
private void OpenMdiChild(Form newForm) 
{ 
    bool found = false; 
    foreach (Form frm in this.MdiChildren) 
    { 
     if (frm.GetType() == newForm.GetType()) 
       { 
         frm.Activate(); 
         frm.Focus(); 
         //frm.BringToFront(); 
      found = true; 
      break; 
       } 
    } 
    if (!found) 
    { 
     frm.Show(); 
    } 
} 

Если вы хотите, чтобы пользователи просто открыть 1 форму, вы можете изменить OpenMdi-- метод следующим образом:

private void OpenMdiChild(Form newForm) 
{ 
    bool found = (this.MdiChildren.Length > 0); 
    if (!found) 
    { 
     foreach (Form frm in this.MdiChildren) 
     { 
      if (frm.GetType() == newForm.GetType()) 
      { 
      frm.Activate(); 
        frm.Focus(); 
        //frm.BringToFront(); 
        found = true; 
       break; 
       } 
     } 
    if (!found) 
    { 
      frm.Show(); 
    } 
    } 
} 
+0

Большое спасибо за помощь. Но у меня возникает другой вопрос: существует ли способ предотвратить отображение дочерней формы, когда другая дочерняя форма уже активирована? – aliboy38

+0

вы, как: показать только 1 форму? – riffnl

+0

Я имею в виду, например, когда показан дочерний вид2, запретить пользователям открывать дочернюю форму3 или другие дочерние формы, пока они не закрывают эту в настоящее время дочернюю форму, а затем смогут открыть другие дочерние формы. – aliboy38

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