前言
做項目的時候,winfrom因為沒有B/S的緩存機制,窗體間傳遞數據沒有B/S頁面傳遞數據那么方便,今天我們就說下winfrom中窗體傳值的幾種方式。
共有字段傳遞
共有字段傳遞實現起來很方便,就是在窗體類中加個共有字段屬性:
1 public string Msg 2 { 3 get 4 { 5 return this.textBox1.Text.Trim(); 6 } 7 }
調用代碼:
1 public Form2(Form1 f1) 2 { 3 InitializeComponent(); 4 this.label1.Text = f1.Msg; 5 }
就這么簡單,共有字段傳遞其實只是一種可以傳遞數據的方式,但不希望采用這種方式,除非一些窗體是要做傳值的,比如一些信息彈窗,可以采用這種方式。
構造傳遞
構造傳遞一般是我們做項目常用的一種,就像對象傳值一樣,我們只要在構造方法中添加參數即可。
1 public Form2(string msg) 2 { 3 InitializeComponent(); 4 this.label1.Text = msg; 5 } 6 7 private void button1_Click(object sender, EventArgs e) 8 { 9 Form2 f2 = new Form2(this.textBox1.Text.Trim()); //調用 10 f2.Show(); 11 }
委托與事件傳遞
上面說的兩種方式都是由父窗體傳值給子窗體,還有一種方式是子窗體傳值給子船體,這種方式一般采用委托和事件傳遞,我們來做個示例看下。
我們先建一個委托,參數是string:
1 public delegate void selectChangedHandler(string s);
在傳值中我們需要第二種方式來傳遞一個對象集合,首先我們建一個數據傳遞集合:
1 public class CallObject 2 { 3 public string callMessage = ""; 4 public event selectChangedHandler selectChangedEvent; 5 6 public void callEvent(string s) 7 { 8 this.selectChangedEvent(s); 9 } 10 }
集合包含兩個部分,一個是返回信息對象,一個是事件對象,這些其實以便子窗體調用來得到從子窗體中傳遞過來的數據,事件定義好了就得有事件處理方法:
1 public void co_selectChangedEvent(string s) 2 { 3 this.txtF2Select.Text = s; 4 }
我們看下父窗體的調用方法:
1 private void btnCallForm2_Click(object sender, EventArgs e) 2 { 3 CallObject co = new CallObject(); 4 co.selectChangedEvent+=new selectChangedHandler(co_selectChangedEvent); 5 Form2 f2 = new Form2(co); 6 7 f2.ShowDialog(); 8 txtEventResult.Text = "Form2傳的信息:" + co.callMessage; 9 }
這邊主要是給事件注冊,從父窗體中我們就可以推斷出,子窗體是怎么調用的,通過構造方法得到對象集合,然后觸發事件就可以了。
1 private CallObject co; 2 public Form2(CallObject cov):this() 3 { 4 this.co = cov; 5 } 6 7 private void rb_A_CheckedChanged(object sender, EventArgs e) 8 { 9 co.callEvent("A"); 10 }
運行效果:
下面傳值給父窗體的值需要關閉子窗體,父窗體再可以得到,上面的可以實時傳遞。
程序下載:窗體間傳遞數據.rar
后記
其實上面第一種并不能說是一種好的方式,就像說模式,常用并且可以解決問題的解決方案稱為模式,開門有幾種方式:拿鑰匙開門和撬門,我們常用的是第一種,并稱為一種開門模式,并不是說第二種就不是了,只不過我們不常用,適合一些特殊的情況,比如,忘記拿鑰匙了,就是這個意思。
文章列表