C#跨窗体传递值
在我们实际的项目工程中,窗体之间往往需要数据的传递,本次通过学习网友发的帖子,了解了值传递的方法,现写下来。
窗体之间值的传递方式有很多种,本文只讲三种:控件属性访问、普通委托事件访问、泛型委托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 }
View Code
在窗体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 }
View Code
这种可以实现子窗体和父窗体的相互传值。
第二种:委托事件传值
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);//执行委托实例 } } }
View Code
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; } }
View Code
第三种:泛型委托和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 }
View Code
言归正传。
窗体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 }
View Code
窗体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 }
View Code