C#事件处理

一、什么是事件

定义一个事件,意味着类型主要提供以下能力:

1.方法可订阅该事件

2.方法可取消该事件

3.只有事件发生的时候,才会通知方法

委托结构中存在的缺陷可能造成程序员不经意的引入一个BUG。这个问题和封装有关,即无论事件的订阅还是发布,都不能得到充分的控制。

event关键字的目的就是提供额外的封装,避免不小心的取消其他的订阅者。

二、C#自定义事件的几个步骤

事件是和委托紧密相关的一个东西,在发展过程中首先出现了委托,由于委托存在事件的订阅和取消可能导致编码中轻易订阅或取消其他的事件,所以引入事件Event用于对这种有缺陷的委托进一步封装,把存在的问题进行排除。

细分了一下关于自定义一个事件的5个步骤:

1.定义一个委托,委托中自定义需要参数。

2.定义一个Event事件,该事件触发相应的方法。

3.定义触发事件的方法。

4.定义事件要处理的方法。

5.主调函数用户调用触发事件的方法。

三、使用子用户控件里面“自定义事件”

下面分享一个示例,该示例是在子用户控件里面定义了一个方法,然后子用户控件触发事件方法,然后通过挂在在父页面的方法执行相应的函数。

1.定义一个委托,这个委托里面包含需要传递的数据

public delegate void SelectWorkHandler(int ID, string Name, string Month);
2.定义一个事件对象

public event SelectWorkHandler SelectWorkEvent;

3.定义触发事件的方法,必须要判断事件是否为空,如果不判断会导致空引用异常

protected void labDetial_Click(object sender, EventArgs e)  //例如,页面的点击事件触发这个事件。
        {
            if (SelectWorkEvent != null)
            {
                SelectWorkEvent(this.WorkID,this.Name,this.Month); //给事件对象赋值
            }
        }

4.把子用户控件的时间挂载在父页面上面

<uc1:uc_CheckWork ID="uc_CheckWork1" runat="server" OnSelectWorkEvent="uc_CheckWork1_Select" />

5.在父页面定义这个事件的处理方法

public void uc_CheckWork1_Select(int ID, string Name, string Month){//TODO:}

四、使用.NET Framework 自带的事件

(1.) public event EventHandler SelectedNodeChangedEvent;//在需要使用事件的时候实例化一个事件对象
(2.) 在给事件传参数的时候需要传入一个对象和一个EventArgs对象。//
SelectedNodeChangedEvent(org, new EventArgs());//如果没有EventArgs参数就传入一个空的参数。
(3.) 挂在事件方法,同上
(4.) 定义事件处理方法,函数带有两个对象,object sender,EventArgs e

定义一个类并定义相应的委托和相应的event事件

class My
		{
			public delegate void mytest(string a);

			public event mytest Myevent;

			public void Test()
			{
				
				if (Myevent != null)  //在这里触发事件之前对Myevent进行检查,可以避免NullReferenceException的发生。(调用一个委托之前,要检查它的值是不是空值。)
				{
					Myevent("a");
				}
			}
		}
定义一个事件处理方法

class MyEVENT
		{
			public void Myevent(string a)
			{
				Console.WriteLine("aaa");
			}
		}

主调函数指定事件之间订阅关系

My m = new My();
				MyEVENT me = new MyEVENT();
				m.Myevent += me.Myevent;
				m.Test();           
				Console.ReadLine();



五、定义泛型委托,可以在多个位置使用同一个委托

使用泛型,就可以在多个位置使用相同的委托数据类型,并在支持多个不同的参数类型的同时保持强类型。

同样在使用泛型定义委托的时候我们可以使用where条件对泛型类型进行限制

public deleagate void EventHandler<T>(object sender,T e)
		where T : EventArgs;

表明泛型的类型必须接受EventArgs作为类型的参数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scalzdp

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值