2010-02-09 16 views
1

問題:如果它是一個孩子,也就是說,它的所有者屬性設置爲父窗體,但如果它是一個孩子的,一個孩子的對話框的的FormClosing()事件引發不。因此,關閉主窗體不會在任何孫子對話框上調用關閉事件。如何才能讓二級子窗體關閉提示?

詳細信息:在FormClosing()事件中,對話框會提示「Save Changes?」,並帶有YesNoCancel按鈕。點擊取消保持對話框打開,即取消關閉。

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 

你可能應該注意e.CloseReason,所以你不要阻止Windows關機。

+0

感謝您的回答。 – invert 2010-02-11 10:31:36