2015-02-06 12 views
0

두 개의 라디오 단추 (rb1rb2)와 하나의 일반 단추 (btn)가있는 Form1이 있습니다. btn을 클릭하면 Form1 인 경우 rb1 인 경우 Form2을 열어야합니다. rb1 인 경우 Dialog 인 경우 rb2을 선택하면됩니다. 또한 언제든지 열린 Form2 하나만있을 수 있습니다. 그것이 내가 MDI의 자식으로 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), 새로운 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

저는 Hans에 동의합니다. 런타임시 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을 변경하려면 전화를 호출 시도했지만 문제가 해결되지 않았다 *, 그래서 내가 전환 : 염두에두고

, 여기 아마 내가 하루 종일 게시합니다 멍청한 해킹 타이머. 작동하는 어리 석음. 이 솔루션을 사용할 때는주의해야합니다.