2010-02-09 5 views
1

문제 : 대화 상자의 FormClosing() 이벤트가 자식 인 경우 발생합니다. 즉 소유자 속성이 부모 폼으로 설정되었지만 자식 하위 인 경우 설정되지 않았습니다. 그래서 메인 폼을 닫으면 어떤 손자들의 대화 상자에서도 closing 이벤트를 호출하지 않습니다.닫을 때 두 번째 수준 하위 폼 프롬프트를 표시하려면 어떻게해야합니까?

세부 정보 : YesNoCancel 단추가있는 대화 상자에 "변경 사항 저장?"이라는 메시지가 FormClosing() 이벤트에 나타납니다. 취소를 클릭하면 대화 상자가 열린 상태로 유지됩니다.

Private Sub Dialog_FormClosing(...) Handles Me.FormClosing 
    If MessageBox.Show("Save Changes?", YesNoCancel) = No Then 
     e.Cancel = True 
    End If 
End Sub 

그래서

// called from the main form 
Dim dlg As New Dialog 
dlg.Owner = Me 
dlg.Show() 

...

사용자가 소유자/부모를 종료하려고하면 대화 상자가 저장하라는 메시지를 표시하는 이점이있다 ... 그 소유자 속성 집합으로, 새로운 대화를 인스턴스화 . 취소를 클릭하면 대화 상자가 열리고 소유자이기도합니다.

그러나

같은 대화 상자가 아닌 부모로부터 (이 소유자 속성 세트의도로) 부모의 아이에서 표시 한 경우 : 다음

// called from another child 
Dim dlg As New Dialog 
dlg.Owner = Me 
dlg.Show() 

아이의 FormClosing() 이벤트 최상위 부모가 닫히면 제기하지 않습니다.

프레임 워크에서 알고있는 설계상의 제한 사항입니까? 이 문제를 해킹하기 전에 고려해야 할 사항이 있습니까?

답장을 보내 주셔서 감사합니다.

답변

1

예. 문제의 일부는 대화 상자로 대화 할 수 있지만 실제로 ShowDialog() 메서드를 사용하여 표시하지 않는 것입니다. 그러면 대화 상자가 표시되는 동안 사용자가 기본 양식을 닫을 수 없게됩니다. 주 양식이 닫히면 메시지 루프가 종료되고, 나머지 양식은 정상 종료 절차를 거치지 않고 폐기됩니다.

한 가지 해결책은 기본 양식이 닫힐 때 양식을 사전 적극적으로 닫는 것입니다. 이것은 잘 작동했습니다 :

Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing 
    For frm As Integer = Application.OpenForms.Count - 1 To 1 Step -1 
     Application.OpenForms(frm).Close() 
     If Application.OpenForms.Count - 1 = frm Then 
     e.Cancel = True 
     Exit For 
     End If 
    Next 
    End Sub 

Windows 종료를 차단하지 않으므로 e.CloseReason에주의해야합니다.

+0

감사합니다. 훌륭한 답변입니다. – invert

관련 문제