C#程式中兩個表單傳值的簡單方法
兩個表單傳值向來是論壇的熱門問題,對於使用Visual Basic 2005 和 2008版本的網友可能比較沒有這個困擾,原因是在這兩個版本會自動將所設計的表單在其特有的My物件中神不知鬼不覺的產生一個靜態的參考。但C#就很麻煩了,因為C#沒有My,所以沒得偷懶 (不過偷懶有時會造成觀念錯誤,我第一次寫C#時還不明白這個道理,差點把我搞死)。
舉個常見的例子,很多人會試圖想要這樣去傳遞值到另一個表單:
(1)在Form1 class 中撰寫開啟Form2的程式碼
private void button2_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
}
(2)在Form2 Class中試圖要傳遞值到Form1 的執行個體
private void button2_Click(object sender, EventArgs e)
{
Form1 frm1=new Form1();
frm1.textBox1.Text = "ABC";
}
註:這還是假設Form1中的textBox1已經被設成Public了;正常是Private的狀況下,其實應該是在Form1 Class中增加一個自訂的Public 屬性來連結textBox1。
然後,不幸地事情發生了,你不論在Form2 Class的執行個體中怎麼按button2,初始的那個Form1 執行個體中的textBox1的值根本不會改變。問題出在哪?出在這兩個我們以為是同一個Form1的執行個體,事實上是兩個,而我們卻一直傳值到那個還沒被Show出來的Form 1執行個體。
正確地方法是應該在Form 2 Class中自訂一個屬性,讓Form1執行個體在產生Form2 Class 執行個體的時候可以把Form1 執行個體的參考指標傳遞過去,如果你對於自行定義屬性不熟悉,有個簡單的替代方法是使用Owner屬性來傳遞,請看以下範例:
(1)在Form1 class 中撰寫開啟Form2的程式碼
private void button2_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
//這邊就是傳遞自己的參考指標給Form2的Owner屬性
frm2.Owner = this;
frm2.Show();
}
(2)在Form2 Class中試圖要傳遞值到Form1 的執行個體
private void button1_Click(object sender, EventArgs e)
{
TextBox frm1textbox = (TextBox)this.Owner.Controls.Find("textBox1", true)[0];
frm1textbox.Text = "zkkk";
}
很簡單的概念,對不對?其實這個範例太過簡單,基本上如果會自行定義屬性的話,還可以只要傳Form1執行個體的textBox1參考指標過去就好。
你去研究一下DataBinding的技術.
他裡面會告訴你.一個Control的值改變自動更新相關其他Control或其他Form的Control.
如Form1.TextBox1改變他會通知Form2.TextBox1 相反的你更新Form2.TextBox1,Form1.TextBox1也會被更新.
在C#裡, 就算用DataBinding還是要傳遞參考啊. 不然要Bind到哪個參考指標呢 ?
你可能有點誤解我的意思, 其實這篇的重點在講的是兩個表單間如何正確取得或傳遞參考指標
有一個地方忘了提, 是關於Owner屬性的特性, 在MSDN文件的說明是這樣:
若要使表單被另一個表單擁有,指派它的 Owner 屬性為將成為擁有人之表單的參考。
當表單為另一個表單擁有時,它將與主控表單一起最小化和關閉。例如,當 Form2 為表單 Form1 所擁有時,如果將 Form1 關閉或最小化,則 Form2 也會隨之關閉或最小化。所擁有的表單也從不顯示在它們的主控表單後面。您可以使用視窗擁有的表單,例如就尋找和取代視窗而言,當選取主控表單時,不應該顯示在主控表單後面。若要確定父表單所擁有的表單,請使用 OwnedForms 屬性。