C#如何在自定义事件里传递自定义数据
作者:dotNet工控上位机
相信很多小伙伴都知道传值的一些方式,比如构造方法传值、属性传值、Tag传值、委托传值、窗体传值等,今天给大家分享的一种方式,是通过自定义事件来传值。
对于一般的系统事件,是有两个参数的,一个是sender,一个是EventArgs,对于sender,我们可能用得还比较多一些,它表示这个事件的触发者,一般指向的是一个控件,但是对于EventArgs,我们一般用得会比较少,今天分享的自定义事件传值就是通过EventArgs来实现。
基础篇
通过EventArgs来实现传值,我们首先需要创建一个类,继承EventArgs,我们可以将需要传递的数据,直接在类里面定义成属性,这里以传递一个布尔、一个浮点数为例,代码如下所示:
public class MyEventArgs : EventArgs{ public bool BoolValue { get; set; } public float FloatValue { get; set; } }
然后我们创建一个类,类里面创建一个事件,并激发事件,这里传递的值为True和123.0,代码如下:
public class Test{ public void AckEvent() { //激发事件 myEvent?.Invoke(this, new MyEventArgs() { BoolValue = true, FloatValue =123.0f }): } //创建事件 public event EventHandler myEvent; }
我们在主窗体中,实例化类,并进行事件绑定,看看能不能获取到传递的数据,代码如下:
public partial class Form1 : Form { public Form1() { InitializeComponent(); t= new Test(); t.myEvent +=T myEvent; t.AckEvent(); } Test t; private void T_myEvent(object sender, EventArgs e) { MyEventArgs args = e as MyEventArgs; MessageBox.Show("布尔值:"+args.BoolValue.ToString()+";浮点值:" +args.FloatValue.ToString()); } }
运行结果如下所示:
进阶篇
在上面知识掌握的基础上,我们可以做进一步优化,在定义事件时,可以不用EventHandler,可以自己定义参数来实现,我们再创建一个类——Test2,代码如下:
public class Test2 { public void AckEvent() { //激发事件 myEvent?.Invoke(this,new MyEventArgs() { BoolValue = true, FloatValue =123.0f }); } //创建事件 public event Action<object, MyEventArgs> myEvent; }
这样我们在事件处理中,就可以直接获取属性了,而不需要对EventArgs进行强制转换,代码如下:
private void T2 myEvent(object arg1, MyEventArgs arg2) { MessageBox.Show("布尔值:"+ arg2.BoolValue.ToString()+";浮点值:" + arg2.FloatValue.ToString()); }
高级篇
如果继续深入的话,我们可以将传递的参数改成泛型,这样就可以轻松传递单个参数了,对于多个参数的情形,我们可以使用对象,单一参数比较简单,这里就不赘述了,主要针对对象传递进行说明,首先创建一个参数实体类,这里创建三个属性,代码如下:
///<summary> /// 传递参数实体类 /// </summary> public class Param { public string Param1 { get; set; } public string Param2 { get; set; } public string Param3 { get; set; } }
创建事件参数类,代码如下:
///<summary> /// 事件参数类 /// </summary> /// <typeparam name="T"></typeparam> public class MyTEventArgs<T>:EventArgs { public MyTEventArgs(T t) { Param =t; } public T Param; }
再创建一个类——Test3,代码如下:
public class Test3 { public void AckEvent() { //激发事件 myEvent?.Invoke(this, new MyTEventArgs<Param>(new Param() { Param1 = "1", Param2 = "2", Param3 = "3", })); } //创建事件 public event Action<object, MyTEventArgs<Param>> myEvent; }
主窗体调用并进行事件处理,代码如下:
public Form() { InitializeComponent(); t3 = new Test3(); t3.myEvent +=T3 myEvent; t3.AckEvent(); } private void T3_myEvent(object arg1, MyTEventArgs<Param> arg2) { var data = arg2.Param; MessageBox.Show("值1:"+ data.Param1 +";值2:"+ data.Param2 + ";值3:"+ data.Param3); }
运行结果如下:
到此这篇关于C#如何在自定义事件里传递自定义数据的文章就介绍到这了,更多相关C#自定义事件传递自定义数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!