2015-02-06 4 views
0

У меня есть Form1 с 2 переключателями (rb1 и rb2) и одной обычной кнопкой (btn). Когда я нажимаю на btn, я должен открыть Form2, так как ребенок MDI Form1 проверяется, если rb1, или как обычно Dialog, если проверено rb2. Кроме того, в любой момент может быть только один Form2.Ничего не происходит, когда я закрываю максимальную дочернюю форму MDI

Это мой код:

public partial class Form1 : Form 
{ 

    Form2 f2; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (f2 != null) 
     { 
      MessageBox.Show("Close form!"); 
      return; 
     } 

     f2 = new Form2(); 
     if (radioButton1.Checked == true) 
     { 
      this.IsMdiContainer = true; 
      f2.MdiParent = this; 
      f2.Show(); 
     } 
     else 
     { 
      f2.Show(); 
     } 

     f2.FormClosed += f2_FormClosed; 

    } 

    void f2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     this.IsMdiContainer = false; 
     f2 = null; 
    } 

} 

Все работает, как должно, за исключением, когда я максимально Form2, как MDI ребенка, а затем закройте его. После этого экрана остается тот же (как я даже не закрыл Form2), но я могу открыть новый Form2, а затем Form1 «Form1 - [Form2]», и если я повторю процесс, это будет «Form1 - [Form2] - [Form2]» и т. Д. .

Я понял, что я мой f2_FormClosed метод должен быть

void f2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     f2.Hide(); // <<<<<<<<-----------NEW 
     this.IsMdiContainer = false; 
     f2 = null; 
    } 

, но я не знаю, почему; Form2 должен быть закрыт, я не знаю, почему я должен его скрывать ?!

Спасибо!

+2

Изменение свойства IsMdiContainer на форме, окно которой создано, имеет * много * побочных эффектов. Не делай этого. –

ответ

0

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

Серьезно рассмотрите другой дизайн для вашего приложения.

Имея это в виду, здесь, наверное, глупее хак я выложу весь день:

public partial class Form1 : Form 
{ 

    Form2 f2; 
    System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer(); 

    public Form1() 
    { 
     InitializeComponent(); 
     tmr.Interval = 100; 
     tmr.Enabled = false; 
     tmr.Tick += delegate (object sender, EventArgs e) { 
      tmr.Stop(); 
      this.IsMdiContainer = false; 
     }; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (f2 != null) 
     { 
      MessageBox.Show("Close form!"); 
      return; 
     } 

     f2 = new Form2(); 
     f2.FormClosed += delegate(object sender2, FormClosedEventArgs e2) { 
      f2 = null; 
     };  
     if (radioButton1.Checked == true) 
     { 
      this.IsMdiContainer = true; 
      f2.FormClosed += delegate(object sender3, FormClosedEventArgs e3) { 
       tmr.Start(); 
      };  
      f2.MdiParent = this; 
     } 
     f2.Show(); 
    } 

} 

* Изначально я пытался Призывая вызов изменить IsMdiContainer, но это не сработало, поэтому я перешел на Таймер. Глупость, которая работает. Используйте это решение с осторожностью ...