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
