通过委托实现跨窗体传值
前言
在本文中主要介绍 如何通过委托实现跨窗体传值,并以简单的示例进行展示。
正文
1、委托及事件
- 委托:委托是方法的抽象,与类一样是一种用户自定义类型,存储的是一系列具有相同签名和返回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行;
- 委托类型声明 :委托是类型,与类class 处于同一个级别,委托类型必须在被用来创建变量之前声明:a、以deleagate关键字开头 b、返回类型+委托类型名+参数列表(可以为空):修饰符 delegate 返回类型 委托类型名(参数列表)
- 委托与方法的区别:委托只是一个命令,做事情的是方法,在代码世界中委托只是存储了各个方法的地址,而它自己是什么也不做的;
- 委托的开发步骤:a、定义一个委托 b、定义一个委托类型的变量 c、给委托赋值(绑定方法) d、调用委托;
- 事件:事件是基于委托的,为委托提供一个订阅或发布的机制;事件是一种特殊的委托,调用事件和委托是一样的;
- 事件声明 :事件可以被看作是委托类型的一个变量,通过事件注册、取消多个委托和方法;修饰符 event 委托类型 事件名称;
2、通过委托实现跨窗体传值的步骤
1.在子窗体中定义委托
csharp
public delegate void 委托类型名(参数列表);
2.在子窗体中声明一个委托类型的事件
csharp
public event 委托类型名 事件名称;
3.调用委托类型事件
csharp
private void button1_Click(object sender, EventArgs e)
{
事件名称(参数列表);
}
4.在实例化子窗体后,子窗体订阅事件接受方法
csharp
private void button2_Click(object sender, EventArgs e)
{
f2 = new Form2();
f2.Show();
f2.事件名称 += new Form2.委托类型名(方法名);
}
5.实现具体的事件
csharp
public void 方法名(参数列表)
{
具体方法
}
3、具体示例
-
在子窗体中定义定义一个委托,委托类型名为SendValue,需要传递2个参数
csharp//1、先在子窗体中定义一个委托,根据实际需求定义委托;这个SendValue委托中需要传递2个参数 public delegate void SendValue(int a,int b);
-
在子窗体中声明一个委托类型的事件,委托类型为SendValue,事件名称为SendVauleEvent
csharp//2、在子窗体中声明一个委托类型的事件,将委托与事件相关联 public event SendValue SendVauleEvent;
-
在button1的Click事件中,调用委托类型事件SendVauleEvent
csharpprivate void button1_Click(object sender, EventArgs e) { //3、调用(实现)委托类型事件,并传递相关参数 SendVauleEvent(1, 5); }
-
在实例化子窗体后,子窗体订阅事件接受方法,相当于子窗体委托主窗体做了一个事情
csharpprivate void button2_Click(object sender, EventArgs e) { //实例化窗体2 f2 = new Form2(); f2.Show(); //4、在实例化子窗体后,声明子窗体的事件,即初始化事件 //子窗体订阅事件接受方法,相当于子窗体委托主窗体做了一个事情 f2.SendVauleEvent += new Form2.SendValue(Add);//接受的方法 :Add }
-
实现具体的事件Add(),实现简单的加法运算
csharp/// <summary> /// 5、实现具体的事件,定义一个方法 /// </summary> /// <param name="a">参数1</param> /// <param name="b">参数2</param> public void Add(int a,int b) { label1.Text = (a + b).ToString(); }
4、完整代码
-
主窗体代码
csharpusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace DelegatePractice { public partial class Form1 : Form { public Form2 f2; public Form1() { InitializeComponent(); ///跨界面传值 ///1、主界面处理只需要实例化其他界面即可 ///2、在需要的界面申明委托和事件 ///3、在主界面订阅事件和接受方法即可 } /// <summary> /// 5、实现具体的事件,定义一个方法 /// </summary> /// <param name="a">参数1</param> /// <param name="b">参数2</param> public void Add(int a,int b) { label1.Text = (a + b).ToString(); } private void button2_Click(object sender, EventArgs e) { //实例化窗体2 f2 = new Form2(); f2.Show(); //4、在实例化子窗体后,声明子窗体的事件,即初始化事件 //子窗体订阅事件接受方法,相当于子窗体委托主窗体做了一个事情 f2.SendVauleEvent += new Form2.SendValue(Add);//接受的方法 :Add } private void button1_Click(object sender, EventArgs e) { Add(1, 2); } } }
-
子窗体代码
csharpusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace DelegatePractice { public partial class Form2 : Form { public Form2() { InitializeComponent(); } //1、先在子窗体中定义一个委托,根据实际需求定义委托;这个SendValue委托中需要传递2个参数 public delegate void SendValue(int a,int b); //2、在子窗体中声明一个委托类型的事件,将委托与事件相关联 public event SendValue SendVauleEvent; private void button1_Click(object sender, EventArgs e) { //3、调用(实现)委托类型事件,并传递相关参数 SendVauleEvent(1, 5); } } }