在我們實際的項目工程中,窗體之間往往需要數據的傳遞,本次通過學習網友發的帖子,了解了值傳遞的方法,現寫下來。
窗體之間值的傳遞方式有很多種,本文只講三種:控件屬性訪問、普通委托事件訪問、泛型委托Action訪問
第一種:
首先新建一個winform窗體form1,再添加一個窗體form2,在窗體1添加一個textbox1和button1,在窗體2添加一個textbox2和button2。如圖
在窗體2中添加如下代碼:

1 public partial class Form2 : Form 2 { 3 public Form2() 4 { 5 InitializeComponent(); 6 } 7 8 9 /// <summary> 10 /// 將外部不可訪問的textbox4.Text封裝成屬性TextBox2Value 11 /// </summary> 12 public string TextBox2Value 13 { 14 set { textBox4.Text = value; } 15 get { return textBox4.Text; } 16 } 17 private void button1_Click(object sender, EventArgs e) 18 { 19 this.DialogResult = DialogResult.OK;//這里的DialogResult是form2類對象的屬性 20 } 21 }
在窗體1中添加如下代碼:

1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void button2_Click(object sender, EventArgs e) 9 { 10 Form2 f2 = new Form2(); 11 f2.TextBox2Value = textBox5.Text;//把父窗體的值先傳給子窗體 12 13 if (f2.ShowDialog()==DialogResult.OK) 14 { 15 textBox5.Text = f2.TextBox2Value; 16 } 17 18 } 19 20 21 } 22 }
這種可以實現子窗體和父窗體的相互傳值。
第二種:委托事件傳值
1.在窗體2中命名空間下先定義一個委托:public delegate void ChangeHandleText(string str);//帶參數
2.定義一個事件:public event ChangeHandleText changetext;//定義事件
3.將事件與委托關聯起來:Form2 f=new Form2(); f.changetext+=new ChangeHandleText(Change_text);//關鍵
form2代碼:

public delegate void ChangeHandleText(string str);//定義委托 public partial class Form2 : Form { public event ChangeHandleText changetext; //定義事件 public Form2() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { if (changetext!=null)//判斷事件是否為空 { changetext(textBox2.Text);//執行委托實例 } } }
form1代碼

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f = new Form2(); f.changetext += new ChangeHandleText(Change_text); f.Show(); } public void Change_text(string str) { textBox1.Text = str; } }
第三種:泛型委托和Lambda表達式結合
簡單介紹下Lambda表達式:“Lambda表達式”是一種匿名函數,是一種高效的類似於函數式編程的表達式,Lambda簡化了開發中需要編寫的代碼量。它可以包含表達式和語句,並且可用於創建委托或表達式目錄樹類型,支持帶有可綁定到委托或表達式樹的輸入參數的內聯表達式。所有Lambda表達式都使用Lambda運算符=>,該運算符讀作“goes to”。Lambda運算符的左邊是輸入參數(如果有),右邊是表達式或語句塊。Lambda表達式x=>x*x讀作“x goes to x times x”。可以將此表達式分配給委托類型。如下圖

delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 }
言歸正傳。
窗體2代碼

public partial class Form2 : Form 31 { 32 public Form2() 33 { 34 InitializeComponent(); 35 } 36 37 public Action<string> ChangeText;//之前的定義委托和定義事件由這一句話代替 38 39 private void button2_Click(object sender, EventArgs e) 40 { 41 if (ChangeText != null)//判斷事件是否為空 42 { 43 ChangeText(textBox2.Text);//執行委托實例 44 this.Close(); 45 } 46 } 47 }
窗體1代碼

public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 private void button1_Click(object sender, EventArgs e) 15 { 16 Form2 f2 = new Form2(); 17 f2.ChangeText = (str) => textBox1.Text = str;//用lambda表達式實現,這句話必須放在f2.ShowDialog();前面 18 f2.ShowDialog(); 19 } 20 }