C#中SHOWDIALOG()與SHOW()的區別_模態與非模態_銷毀與釋放


Dispose() Close()

C#中showDialog()與show()的區別
showdialog方法 有 駐權交回 的功能
C# show和showdialog區別


在C#中窗口的顯示有兩種方式:
模態顯示(showdialog)
非模態顯示(show)。

二者最常見的區別是:
模態顯示后,彈出窗口阻止調用窗口的所有消息響應。
只有在彈出窗口結束后調用窗口才能繼續。
在模態窗口“關閉”后,可以讀取模態窗口中信息,包括窗口的返回狀態,窗口子控件的值。

非模態顯示后,
可以在彈出窗口和調用窗口之間隨意切換。
調用窗口調用show方法后,下面的代碼可以立即執行。
在非模態窗口關閉后,窗口的所有資源被釋放,窗口不存在,
無法獲取窗口的任何信息。

MSDN上對showdialog的解釋:

當窗體顯示為模式對話框時,單擊“關閉”按鈕(窗體右上角帶 X 的按鈕)會隱藏窗體並將 DialogResult 屬性設置為 DialogResult.Cancel。與無模式窗體不同,當用戶單擊對話框的關閉窗體按鈕或設置 DialogResult 屬性的值時,.NET Framework 不調用 Close 方法。窗體轉而可以隱藏並可重新顯示,而不用創建該對話框的新實例。因為未關閉顯示為對話框的窗體,所以在您的應用程序不再需要該窗體時,必須調用該窗體的 Dispose 方法。

也就是說,非模態窗口在關閉時,會調用close方法,進而調用dispose方法,將窗口資源進行回收,所以窗口關閉后,不能在獲取窗口信息。

模態窗口在關閉時,不會調用close方法,也不調用dispose方法,窗口仍然存在,占有資源,所以可以繼續獲得窗口相關信息,在窗口不再使用時,需要手動釋放資源。
[csharp] view plain copy
Form2 testDialog = new Form2();

if (testDialog.ShowDialog(this) == DialogResult.OK)
{
this.txtResult.Text = testDialog.TextBox1.Text; // 窗口關閉后,還可以繼續訪問窗口的子控件值
}
else
{
this.txtResult.Text = "Cancelled";
}
// 關閉窗口
// 其他操作
......
......
testDialog.ShowDialog(); // 模態窗口關閉后,可以再次顯示出來
testDialog.Dispose(); // 當模態窗口不再使用時,
應該調用dispose方法釋放資源

Form2 test = new Form2();
test.Show(); // 非模態顯示
// 關閉窗口
// 其他操作
......
......
test.Show(); // 異常,因為在test關閉時,窗口已經被徹底銷毀了,這里必須重新新建一個窗口,然后顯示
// 修改為如下
test = new Form2(); // 創建一個新窗口,重新分配空間
test.Show(); // 顯示窗口

 

面對多窗口的調用的時候,我們往往不喜歡窗口之間的隨意切換,那樣我們還有花費時間尋找我們要用的窗口,而且,一但出現問題,窗口的順序也有可能被再次打亂,很是不順手,那么我們怎么辦呢?
我們可以將show方法轉化為showdialog方法,顧名思義,showdialog是一個進行路經綁定的show方法,他是不可以自由切換的,換言之,就是,當你沒有關閉你當前頁的前提下,你是無法關閉該頁面后面的任一頁面的,它是當前唯一(路經打開)為true的。

而show方法由於未進行綁定,它所顯示的各個窗口、對話框是可以相互切換,而不需要關閉當前窗口、對話框。但是他由於未進行綁定,所以每個由show方法打開的窗口的順序是非固定的,如果遇到什么問題,由show方法打開的窗口的順序可能會有很大的改變!

show()僅僅是顯示出來窗口界面而已```也就是和你執行的結果在同一窗口顯示```所顯示的窗口可以在后台運行```而showDialog()是一個對話框窗口界面```執行結果以新窗口界面出現```不允許進行后台運行```就是你想編輯什么的時候```非得先關閉showDialog()窗口界面才可以進行其他操作```

這就是它們的一點小區別了```

show()是非模式窗體.
showDialog()是模式窗體.
區別在於,以showDialog()打開的窗體,要等窗體關閉后才能操作其他窗體.而show()則不受此限制.

這是最經常的區別了,
還有一個我個人使用的心得,你可以了解

比如你先打開子窗體,想隱藏主窗體。
如果這個時候用Show的話,則會發生的事情是,打開子窗體的同時主窗體又顯示出來,而使用ShowDialog()的時候主要當子窗體關閉的時候主窗體才會顯示。
簡單代碼如下:
Form2 f2 = new Form2();
this.Visible = false;
f2.ShowDialog();
this.Visible= true;
這就是模態對話框的與Show的區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM