在C#中窗口的顯示有兩種方式:模態顯示(showdialog)和非模態顯示(show)。
區別:
模態與非模態窗體的主要區別是窗體顯示的時候是否可以操作其他窗體。模態窗體不允許操作其他窗體,非模態窗體可以操作其他窗體。
模態顯示后,
彈出窗口阻止調用窗口的所有消息響應。
只有在彈出窗口結束后調用窗口才能繼續。
在模態窗口“關閉”后,可以讀取模態窗口中信息,包括窗口的返回狀態,窗口子控件的值。
在調用Form.ShowDialog方法后,直到關閉對話框后,才執行此方法后面的代碼
窗體顯示為模式窗體時,單擊“關閉”按鈕會隱藏窗體,並將DialogResult屬性設置為DialogResult.Cancel
與無模式窗體不同,當用戶單擊對話框的關閉窗體按鈕或設置DialogResult屬性的值時,不調用窗體的Close方法
實際上是把窗體的Visible屬性賦值為false,隱藏窗體了
這樣隱藏的窗體是可以重新顯示,而不用創建該對話框的新實例
因為未關閉窗體,所以在應用程序不再需要該窗體時,請調用該窗體的Dispose方法
所以模態窗口在關閉時,不會調用close方法,也不調用dispose方法,窗口仍然存在,占有資源,所以可以繼續獲得窗口相關信息,在窗口不再使用時,需要手動釋
testDialog.ShowDialog(); // 模態窗口關閉后,可以再次顯示出來 testDialog.Dispose(); // 當模態窗口不再使用時,應該調用dispose方法釋放資源
非模態顯示后,
可以在彈出窗口和調用窗口之間隨意切換。
調用窗口調用show方法后,下面的代碼可以立即執行。
在非模態窗口關閉后,窗口的所有資源被釋放,窗口不存在,無法獲取窗口的任何信息。
怎么判斷一個窗體是模式窗體呢?
利用Form.Modal屬性,如果該窗體是模式顯示,則為true,否則為false
根據通過Show和ShowDialog而顯示出來的窗體的Modal屬性分別對應false和true
特別注意:
由於在窗體創建之前是無法得知顯示方式的,所以在窗體構造函數中,Modal屬性總是對應false,所以我們只能在Load事件中或者之后利用Modal屬性值
怎么確定窗體間的所有者關系?
Form類的Owner屬性:窗體的所有者
當一個窗體歸另一窗體所有時,它便隨着所有者窗體最小化和關閉。
例如,如果Form2歸窗體Form1所有,則關閉或最小化Form1時,Form2也會關閉或最小化。
private void button1_Click(object sender, EventArgs e) { Form2 mainForm = new Form2(); mainForm.StartPosition = FormStartPosition.CenterScreen; mainForm.Location = new Point(500,500); //mainForm.ShowDialog(this); //或者 如果設置子府窗體,可以根據具體需求設置調用的方式 mainForm.Show(this); //或者 //mainForm.Owner = this; //mainForm.ShowDialog(); }
Winform 窗體傳值
1.調用構造函數,傳值是單向的傳遞,實現簡單,重寫構造函數,在其中賦值即可;
2.靜態變量,在一個類中定義一個靜態變量,其實相當於定義一個全局變量;
3.給窗體定義公有屬性,在調用時給予賦值;
4.通過窗體的公有屬性值和Owner屬性 特點:實現簡單,靈活
實現代碼如下: 在窗體Form1中 public int Form1Value = 1; Form2 f2 = new Form2 ( ); f2.ShowDialog ( this ); //把Form1作為Form2的所有者傳遞給Form2 在窗體Form2中 //Form2的所有者是Form1 Form1 f1 = ( Form1 ) this.Owner; //取到Form1的值是1 MessageBox.Show ( f1.Form1Value .ToString ( ) ); //給Form1的Form1Value賦值222 f1.Form1Value = 222;
5.通過窗體的公有屬性值和Application.OpenForms屬性
說明:Application.OpenForms屬性:獲取屬於應用程序的打開窗體的集合。(此屬性在 .NET Framework2.0版中) 實現代碼如下: 在窗體Form1中 public int Form1Value = 1; Form2 f2 = new Form2 ( ); f2.Show ( ); 在窗體Form2中 string formName = "Form1"; Form fr = Application.OpenForms [ formName ]; if ( fr != null ) { Form1 f1 = ( Form1 ) fr; //取到Form1的值是1 MessageBox.Show ( f1.Form1Value.ToString ( ) ); //給Form1的Form1Value賦值222 f1.Form1Value = 222; }
6通過事件
實現代碼如下: 在窗體Form2中定義公有屬性Form2Value,獲取和設置textBox1的文本值 並且還定義一個accept事件 public string Form2Value { get { return this.textBox1.Text; } set { this.textBox1.Text = value; } } public event EventHandler accept; private void button1_Click ( object sender , EventArgs e ) { if ( accept != null ) { accept ( this , EventArgs.Empty ); //當窗體觸發事件,傳遞自身引用 } } 在窗體Form1中 Form2 f2 = new Form2 ( ); f2.accept += new EventHandler ( f2_accept ); f2.Show ( ); void f2_accept ( object sender , EventArgs e ) { //事件的接收者通過一個簡單的類型轉換得到Form2的引用 Form2 f2 = (Form2) sender; //接收到Form2的textBox1.Text this.textBox1.Text = f2.Form2Value;
原文網址:http://blog.csdn.net/percy__lee/article/details/48554339
