事件是类在发生其关注的事情时用来提供通知的一种方式。例如,封装用户界面控件的类可以定义一个在用户单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。然后,派生类可选择如何响应。
事件使用委托来为触发时将调用的方法提供类型安全的封装。委托可以封装命名方法和匿名方法。
CLR类型中可以定义的一个要素,定义了事件成员的类型允许类型或类型的实例在某些特定的事情发生时通知其他对象。最常见的如Button类的Click事件,当单击Button对象时,应用程序其他的一个或多个对象可能希望能收到关于这个事件的通知,从而执行一些动作(响应事件)。
事件实用的是发布者\订阅者机制,发布者在事件发生时发出通知,订阅者收到通知之后执行一些响应操作。CLR的事件模型建立在委托(Delegate)机制上。委托是一种类型安全的回调方法(callback method)的方式。CLR中类型的静态方法或者对象的实例方法可以订阅\注销类型事件。事件其实就是一种委托,订阅者实现的时候将委托定义的形式的方法实现,再将发布者的委托实例上+=一下把定义的处理方法加进去,事件一来发布者调用委托实例执行,那么订阅了该事件的对象定义的处理方法都能执行了。
设计一个对外提供事件的类型步骤:
step1 定义一个类型用于存放所有需要发送给事件订阅者的附加信息,应该继承自System.EventArgs;如果不传递额外信息,直接使用EventArgs.Empty,无需定义新的EventArgs对象;
step2 定义事件成员,遵循事件定义模式,如
public event EventHandler<SomeEventArgs> eventname;
而EventHandler的原型为
public delegate void EventHandler<TEventArgs>
(Object sender,TEventArgs e) where TEventArgs:EventArgs
所以根据委托的使用形式,事件必须定义为void MethodName(Object sender, SomeEventArgs e)。
step3 定义一个负责引发事件的方法来通知订阅者事件已经发生
一般定义为Oneventname(SomeEventArgs e)
如邮件通知事件:
protected void OnNewMail(NewMailEventArgs e)
{
EventHandler<NewMailEventArgs> temp=NewMail;
if(temp!=null) temp(this,e);
}
将事件成员定义为一个临时变量在于线程安全的考虑。
step4 定义一个方法,将输入转化为期望事件
发布者中要实现事件对应的动作发生之后,要引发事件通知程序即step4中定义的方法。
事件具有以下特点:
such as:
通知:
public event System.EventHandler ComNavCommandEvent;//定义
CommNav1.Item = GetLeftItem(strCurPar);
CommNav1.ComNavCommandEvent += new EventHandler(CommNav1_ComNavCommandEvent);
void CommNav1_ComNavCommandEvent(object sender, EventArgs e)
{
ManageLeft(CommNav1.CommandName, CommNav1.CommandArgument);
}
事件具体动作:
public void ManageLeft(string strCommandName, string strCommandArgument) {
int intStart = strCurUrl.LastIndexOf('/');
int intEnd = strCurUrl.LastIndexOf('.');
string strTemp = strCurUrl.Substring(intStart+1, intEnd - intStart-1);
switch (strCommandName)
{
case "All Blogs":
Response.Redirect(strTemp + ".aspx?MemberID="+strCurUserID);
break;
case "TypeID":
Response.Redirect(strTemp + ".aspx?TypeID=" + strCommandArgument+"&MemberID="+strCurUserID);
break;
case "Folder":
Response.Redirect(strTemp + ".aspx?FolderID=" + strCommandArgument);
break;
}
}
分享到:
相关推荐
C#事件event:妈妈喊儿子回家吃饭
sap中ABAP开发常用事件的定义及调用 文档展示了逻辑关系
NT驱动程序与用户层程序基于事件EVENT实现同步通信
C++ CLI 江苏大学计算机学院 曹汉清 §1 5 2 组件成员 事件 event zip 源代码
(1).每天凌晨12点对数据库进行定时备份,结算和汇总 (2).每天凌晨2点删除数据库前三天的数据 (3).插入某个数据超过一定时间改变某个值的状态,比如预警系
那么什么是事件呢?所谓事件,就是由某个对象发出的消息,这个消息标志着某个特定的行为...那个触发(raise)事件的对象称为事件的发送者(event sender),捕获并响应事件的对象称为事件的接收者(event receiver)
VB用户自定义事件绕来绕去的,翻了半天书也不好弄清楚,最后还是仔细翻看MSDN的事例弄有了。我把它贴成了VB可运行工程,试运行一下就很有体验感了,学起来省时省力。取之于MSDN用之于需要的学习,不需要消耗积分。
本文实例讲述了Yii Framework框架中的事件event原理与应用。分享给大家供大家参考,具体如下: 再谈Yii Framework中的事件event,我写过的关于Yii事件event的另一篇文章 Yii Framework 中事件和行为的区别和应用 ...
javascript键盘事件大全,最全的键盘事件event.keycode
event绑定即为事件绑定,即当触发相关DOM事件的时候回调函数,这篇文章主要介绍了KnockoutJS 3.X API 第四章之事件event绑定的相关知识,感兴趣的朋友一起看看吧
linux input /dev/input/event0 设备消息解析 如健盘事件,触摸屏事件. C语言编写,GCC编译.
背景消息机制是使用消息通知的方式,解耦生产者与消费者。编程上体现的是职责分割,使得消息处理的扩展性得到增强,符合设计原则中的单一职责以及开闭原则。Java 提供
本篇文章主要介绍了浅谈html5之sse服务器发送事件EventSource介绍,具有一定的参考价值,有兴趣的可以了解一下
event 事件机制, 游戏或者各种操作行为的事件。
pb中 的 Event ID 含义浅析,比较详细,对于新手很有用的
本篇文章主要介绍了python多线程之事件Event的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
资源下载 event事件大全!请支持啊资源下载 event事件大全!请支持啊
很好的arcgis事件说明,用户看完之后即可学会事件的使用