2010-12-06 11 views
4

내 MDI 자식 폼이 닫히고 그에 따라 반응 할 때 MDI 부모에서 검색하려고합니다. MDI 자녀가 끝날 때까지 MDI 부모는 아무 것도해서는 안됩니다. 여기에 내 코드가 있는데, 내가 뭘 잘못하고 있는지 확실하지 않지만 추가 된 폼 닫힌 이벤트 메서드는 절대로 호출되지 않는다.C# MDI 부모 MDI 자식 닫는 때 검색합니까?

다음 코드는 MDI 부모 클래스에있다. 분명하지.

private void keyValidation() 
    { 
     if (Properties.Settings.Default.Unlock == true) 
      return; 
     else 
     { 
      menu.Enabled = false; 
      statusStrip.Enabled = false; 

      ValidationForm vf = new ValidationForm(); 
      vf.MdiParent = this; 
      vf.Show(); 
      vf.FormClosed += new FormClosedEventHandler(validationForm_FormClosed); 
     } 
    } 

    void validationForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     MessageBox.Show("Got here"); 
     if (Properties.Settings.Default.Unlock == true) 
     { 
      menu.Enabled = true; 
      statusStrip.Enabled = true; 
     } 
    } 

어떤 도움을 주셔서 감사합니다!

+0

누군가는 실행의 차이를 설명 할 수 있을까? 그리고 위의 용도로 사용해야합니까? – CODe

+0

'Form Closing' 이벤트는'Closed '전에 호출됩니다. 'Closing' 이벤트를 사용하여 사용자가 예를 들어 문서를 저장해야하는지 확인할 수 있습니다. –

+0

설명해 주셔서 감사합니다. 양식이 보존되어있는 것을 저장하는 것이 마지막 시도라고 생각합니다. – CODe

답변

1

실제로이 문제는 언급 한 문제를 해결하지는 못하지만 사용 사례를 고려할 때 유효성 검사 양식을 MDI 하위 대신 모달 대화 상자로 여는 것이 좋습니다.

Show()이있는 양식의 ShowDialog() 방법을 사용하여이 작업을 수행 할 수 있습니다. ShowDialog()은 다른 양식의 버튼에 할당 한 경우 DialogResult을 반환 할 수 있습니다.

0

어쩌면 아마도 숨어 있지 않은 아동용 양식을 가지고있을 수도 있습니다. VisibleChanged를 후킹 해보고 무슨 일이 일어나는 지보십시오.

또한 FormClosing을 사용하면 닫기를 취소 할 수 있으며 FormClosed는 해당 옵션을 제공하지 않습니다.

0

이벤트를 사용하지 마십시오. Closed 이벤트. 대신, FormClosing 이벤트 사용 MdiContainer로 ParentForm를 표시하면 true로 IsMdiContainer을 설정하여

private void frmMain_FormClosing(object sender, FormClosingEventArgs e){ 
    if (MessageBox.Show("Are you sure you want to Exit", "Confirmation", MessageBoxButtons.YesNo,MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.No) { 
    e.Cancel = true; 
    } 
} 
0

을의 ParentForm.ControlAdded 이벤트는 부모 폼에 "MdiClient"컨트롤을 추가 올렸다. 부모 MDI 폼에 MdiClient를 추가 할 때, 우리는 우리가 MdiClient.ControlAdded를 제기 할 필요는 MdiClient 컨트롤 아래 같은에 대한

public ParentForm() 
    { 
    InitializeComponent(); 
    this.ControlAdded += Form1_ControlAdded; 
    this.IsMdiContainer = true; 

을 ControlAdded 이벤트를 발생 올릴 수 있습니다, 아래 등

void Form1_ControlAdded(object sender, ControlEventArgs e) 
     { 
      if(e.Control is MdiClient) 
       e.Control.ControlAdded += MdiClient_ControlAdded; 

     } 

기본적으로 MDI 자식 폼은 부모 폼의 MdiClient 컨트롤 컬렉션에 추가됩니다. 따라서 ChildForm.MdiParent 값을 부모 폼으로 설정하면 MdiClient에 대한 ControlAdded 이벤트가으로 높아집니다. 자식 폼 부모 MDI 형태로 첨가 할 때 MdiClient_ControlAdded 방법이 상기에서

void MdiClient_ControlAdded(object sender, ControlEventArgs e) 
{ 
    if (e.Control is Form) 
     { 
      var form = e.Control as Form; 
      form.FormClosing += form_FormClosing; 
      form.FormClosed += form_FormClosed; 
     } 
} 

을 일으킨다. 따라서 하위 폼에 대한 FormClosing 및 FormClosed 이벤트를 발생 시키면 하위 폼이 닫혀 있는지 여부를 쉽게 감지 할 수 있습니다.

0

MDI 상위 이벤트 핸들러를 MDI 하위에 호출 할 수있는 이유는 무엇입니까?

자녀가 활성화되거나 비활성화 될 때 특정 일을하고 싶다고 가정 해 보겠습니다. MDI 상위의 일부 이벤트 핸들러 (예 : SetupToolStripMenu_PlantMasterRecipe)를 선언하고 그 내부의 일부 논리를 언급하면됩니다. 이렇게하면 MDI 부모로부터 MDI 자식의 각 개체 동작을 제어 할 수 있습니다.

여기 objB 내 자식 폼 내가 MDI 부모 내부에이 코드를 쓰고 있어요 : 양식을 사용할 때 폼 닫는 대 폐쇄

또한
objB.MdiParent = this; 

objB.Activated += SetupToolStripMenu_PlantMasterRecipe; 

objB.Deactivate += DisposeToolStripMenu; 

objB.Show(); 
관련 문제