文章出處

前言

  做項目的時候,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

  附錄:小菜學習編程-Winform系列(初學者)

后記

  其實上面第一種并不能說是一種好的方式,就像說模式,常用并且可以解決問題的解決方案稱為模式,開門有幾種方式:拿鑰匙開門和撬門,我們常用的是第一種,并稱為一種開門模式,并不是說第二種就不是了,只不過我們不常用,適合一些特殊的情況,比如,忘記拿鑰匙了,就是這個意思。

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()