2016-08-04 3 views
0

I 양식 (MdiParent)를 가지고와 함께 두 번 같은 양식을 엽니 다양식은 다음 코드로 MdiParent

private void toolStripMenuItem_ClickForm2(object sender, EventArgs e) 
{ 
    if(frm2 == null) 
    { 
     frm2 = new Form2(frm1); 
     frm2.MdiParent = this; 
    } 
    frm2.Show(); 
} 


private void toolStripMenuItem_ClickForm1(object sender, EventArgs e) 
{ 
    if(frm1 == null) 
    { 
     frm1 = new Form1(); 
     frm1.MdiParent = this; 
    } 
    frm1.Show(); 
} 

menuitemForm2를 클릭하면 form2에서 DB 액세스 및 DatagridView 채우기, frm1이 frm2로 초기화되지 않음)를 클릭 한 다음 menuitemForm1을 클릭하여 frm1을 표시합니다. 그것은 같은 form1의 두 개의 창을 만들 것입니다.

누구도 전에 이상한 행동을 했습니까? 때문에 코멘트

부록 ...

frm2는 Frm1에는에이 같은 작업을 수행합니다

Form1 frm ; 

public Form2(Form1 form1) 
{ 
    frm = form1; 
} 

public void Optionalmethod() 
{ 
    if(frm == null) 
    { 
    frm = new Form1(); 
    frm.MdiParent = this.MdiParent; 
    } 
    frm.Show(); 
} 

Optionalmethod()는 테스트 중에 실행되지 않습니다. 내 논리를 Form1에 따르면

은 두 가지 경우에 초기화 할 수 있습니다 : Form1에 초기화된다 나를 위해

1. Inside form2 
2. In the Main form 

문제가되지 않지만, 그것의 단 하나의 인스턴스를 가지고 중요하다. 그게 null 인 경우에도 참조를 전달하기로 결정했기 때문에 그 이유가 있습니다

+1

당신이 menuitemForm2을 클릭하고 당신이 두 가지 형태가 어떻게해야합니까, menuitemForm1 클릭하지 않으면? 그렇다면 클릭 이벤트가 두 번 유선처럼 처리 된 것 같습니다. – LarsTech

+1

"frm1"이 초기화되지 않았거나 아직 표시되지 않은 경우 Form2의 생성자에 null을 전달합니다. 그런 다음 어떻게해야합니까 (Form1에 대한 참조가 어떻게 생깁니 까?). 아마도 둘 다 null인지 확인하고 아무것도 표시하기 전에 인스턴스화해야합니다. 또한, 그 핸들러에서 Form1의 MdiParent를 설정하지 않습니다 (Form2의 MdiParent ...를 null로 설정할 수 있습니다!). –

+0

@Idle_Mind 두 번째 MdiParent를 잘 잡습니다. 그것을 놓쳤습니다. OP는 아마 거기에 저장되어있는 "데이터"에 더 관심이 있기 때문에 양식을 지나쳐서는 안됩니다. 스파게티빌에 오신 것을 환영합니다. – LarsTech

답변

1

문제를 재현 할 수 없었지만 어떤 경우에도 대안을 제안합니다. 저는 개인적으로 자식 폼 사이에서 폼 변수를 전달하는 것을 선호하지 않습니다. 그것을하기위한 훨씬 깔끔한 방법이 있습니다. 코드를

private void toolStripMenuItem_ClickForm1(object sender, EventArgs e) 
{ 
    ShowForm1(); 
} 

    public void ShowForm1() 
    { 
     try 
     { 
      if (frm1 == null) 
      { 
       frm1 = new Form1(); 
       frm1.MdiParent = this; 
      } 
      else if (frm1.MdiParent == null) 
      { 
       frm1 = new Form1(); 
       frm1.MdiParent = this; 
      } 
      frm1.Show(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

으로 대체하십시오. 양식이 작성되고 닫힌 경우 참조는 널 (null)이 아니지만 MdiParent 특성은 널입니다.

이제 Form2를 생성자 (플러스 전용 멤버)에서 Form1에 매개 변수를 제거하고 함께 OptionalMethod 코드를 바꿉니다

 var parent = (MainForm)this.MdiParent; 
     parent.ShowForm1(); 

이 잘 작동합니다.

HTH

조나단에게

관련 문제