天天看點

C# Show()與ShowDialog()的差別

a.winform中窗體顯示  

顯示窗體可以有以下2種方法:  

form.showdialog方法 (窗體顯示為模式窗體)  

form.show方法 (窗體顯示為無模式窗體)  

兩者具體差別如下:  

1.在調用form.show方法後,show方法後面的代碼會立即執行  

2.在調用form.showdialog方法後,直到關閉對話框後,才執行此方法後面的代碼  

小注:

1、模态顯示後,

 彈出視窗阻止調用視窗的所有消息響應。

 隻有在彈出視窗結束後調用視窗才能繼續。

 在模态視窗“關閉”後,可以讀取模态視窗中資訊,包括視窗的傳回狀态,視窗子控件的值。

msdn上對showdialog的解釋:

當窗體顯示為模式對話框時,單擊“關閉”按鈕(窗體右上角帶 x 的按鈕)會隐藏窗體并将 dialogresult 屬性設定為 dialogresult.cancel。與無模式窗體不同,當使用者單擊對話框的關閉窗體按鈕或設定 dialogresult 屬性的值時,.net framework 不調用 close 方法。窗體轉而可以隐藏并可重新顯示,而不用建立該對話框的新執行個體。因為未關閉顯示為對話框的窗體,是以在您的應用程式不再需要該窗體時,必須調用該窗體的 dispose 方法。

也就是說,非模态視窗在關閉時,會調用close方法,進而調用dispose方法,将視窗資源進行回收,是以視窗關閉後,不能在擷取視窗資訊。模态視窗在關閉時,不會調用close方法,也不調用dispose方法,視窗仍然存在,占有資源,是以可以繼續獲得視窗相關資訊,在視窗不再使用時,需要手動釋放

2、非模态顯示後,

 可以在彈出視窗和調用視窗之間随意切換。

 調用視窗調用show方法後,下面的代碼可以立即執行。

 在非模态視窗關閉後,視窗的所有資源被釋放,視窗不存在,無法擷取視窗的任何資訊。

3、故當要show的窗體使用單例模式時,每次show完,close()窗體後,在第二次show的時候會出現:無法通路已釋放的對象。對象名:“xxxx”。 此時,應該将close()修改為窗體隐藏。