Winform的窗體之間的數據傳遞是開發的必備技術,下面介紹幾種典型的傳值方法緩存
一、構造函數傳值,但這種方法是單向的(推薦)函數
上代碼,先傳值this
1 private void button2_Click(object sender, EventArgs e) 2 { 3 Form3 fr3 = new Form3("要傳的值啊"); 4 fr3.ShowDialog(); 5 }
接值,對了,這裏須要重載一個Form3的構造函數,而後將拿到的值顯示出來spa
1 public Form3(string canshu) 2 { 3 InitializeComponent(); 4 label1.Text = canshu; 5 }
效果圖,就是這麼簡單code
二、靜態變量傳值(不推薦)orm
能夠將靜態變量申明在你須要的地方,好比一個單獨類,或者Form中,好比咱們在這裏申明在Form2中對象
public static string xvalue;
1 private void button2_Click(object sender, EventArgs e) 2 { 3 xvalue = "要傳的值啊xvalue"; 4 Form3 fr3 = new Form3(); 5 fr3.ShowDialog(); 6 }
先給賦值,而後在Form3中取值blog
1 public Form3() 2 { 3 InitializeComponent(); 4 label1.Text = Form2.xvalue;//Form2實際也是個class,直接取靜態值便可,若是靜態變量xvalue定義在其餘類中,即將Form2替換便可 5 }
效果圖上事件
三、經過共有屬性傳值開發
首先在要打開的Form中建立一個共有屬性,而後在調用窗口賦值便可。好比下面Form2啓動Form3,即給Form3的yvalue傳值
(1)在Form3中定義共有屬性
1 public string yvalue { 2 get 3 { 4 return label1.Text.ToString(); 5 } 6 set 7 { 8 label1.Text = value; 9 } 10 }
(2)Form2中啓動Form3,並傳值
1 private void button2_Click(object sender, EventArgs e) 2 { 3 Form3 fr3 = new Form3(); 4 fr3.yvalue = "要傳的值啊"; 5 fr3.ShowDialog(); 6 }
四、經過Owner屬性傳值
(1)在調用者Form2中申明一個公有變量,並賦值,設置須要啓動的Form3的Owner
1 public string xvalue; 2 private void button2_Click(object sender, EventArgs e) 3 { 4 xvalue = "Form2要傳的值"; 5 Form3 fr3 = new Form3(); 6 fr3.Owner = this; 7 fr3.ShowDialog(); 8 }
(2)啓動窗體Form3中取值
1 private void Form3_Load(object sender, EventArgs e) 2 { 3 Form2 fr2 = (Form2)this.Owner; 4 label1.Text = fr2.xvalue; 5 }
這種方法實際是將Form2傳給了Form3,所以Form3能夠取到Form2的全部公有變量和屬性。
五、委託傳值(推薦)
委託傳值主要用在子窗體給父窗體傳值上,即上文的Form3給Form2傳值
(1)先在Form3中申明委託
1 public delegate void PutHandler(string text); 2 public PutHandler putTextHandler;//委託對象 3 private void button1_Click(object sender, EventArgs e) 4 { 5 if (putTextHandler != null) 6 { 7 putTextHandler(textBox1.Text.ToString()); 8 } 9 }
(2)在Form2中綁定委託事件
1 public void getValue(string strV) 2 { 3 this.textBox1.Text = strV; 4 } 5 6 private void button1_Click(object sender, EventArgs e) 7 { 8 Form3 fr3 = new Form3(); 9 fr3.putTextHandler = getValue; 10 fr3.ShowDialog(); 11 }
注意:
if (putTextHandler != null)
{
putTextHandler(textBox1.Text.ToString());
}
上面這樣作是有bug的。
最好的作法是,是先用臨時變量緩存putTextHandler ;
而後在處理,
不然你判斷!=null成立
可是立刻在其餘地方-=的話,程序就出錯了
-=你是不知道會由誰調用的