C#三步实现标准事件处理程序
2014-02-26 19:38
281 查看
事件,MSDN解释:类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。有关事件的理论与好处,在这里就不再废话了,感兴趣的可以参考MSDN的讲解。这里就通过有一个demo演示一下如何一步步实现标准的事件处理过程。可以做为以后代码中的事件编写参考。要运用事件,需要了解委托与事件,可以去学习相关教程。模拟有一个恐怖的军火提供商要我们实现一个火箭炮的订单管理程序。效果图:
第一步:基本实践从MSDN上看了事件的讲解,我们可能想实践一下,来编写一个简单的事件处理,无参数,也不怎么规范,但已经达到的实现事件的功能。
代码
下面看看客户程序的注册与调用。
代码
代码
代码
第一步:基本实践从MSDN上看了事件的讲解,我们可能想实践一下,来编写一个简单的事件处理,无参数,也不怎么规范,但已经达到的实现事件的功能。
代码
1 publicclass BookBomb 2 { 3 ///<summary> 4 /// 定义委托 5 ///</summary> 6 publicdelegatevoid BookBombs(); 7 ///<summary> 8 /// 定义事件 9 ///</summary> 10 publicevent BookBombs Book; 11 publicevent BookBombs Booking; 12 publicevent BookBombs Booked; 13 14 ///<summary> 15 /// 预定 16 ///</summary> 17 publicvoid OnBook() 18 { 19 if (Book !=null) 20 { 21 Book(); 22 } 23 } 24 ///<summary> 25 /// 正在处理 26 ///</summary> 27 publicvoid OnBooking() 28 { 29 if (Booking !=null) 30 { 31 Booking(); 32 } 33 } 34 ///<summary> 35 /// 装配完毕 36 ///</summary> 37 publicvoid OnBooked() 38 { 39 if (Booked !=null) 40 { 41 Booked(); 42 } 43 } 44 } 45 }这是一个很基本也不规范的事件示例,实现了火箭炮的订单预定,装配处理,装配完毕三个环节。注册事件很简单 事件名后输入+=后会提示按Tab键自动导入每个事件相关的处理程序。
下面看看客户程序的注册与调用。
代码
1 //声明 2 BookBomb _bookBomb =null; 3 _bookBomb =new BookBomb(); 4 //分别注册三个事件 5 _bookBomb.Book +=new BookBomb.BookBombs(_bookBomb_Book); 6 _bookBomb.Booking +=new BookBomb.BookBombs(_bookBomb_Booking); 7 _bookBomb.Booked +=new BookBomb.BookBombs(_bookBomb_Booked); 8 void _bookBomb_Booked() 9 { 10 txtMsg.AppendText("装配完毕 型号:NB-250 数量:10 \r\n\r\n"); 11 } 12 13 void _bookBomb_Booking() 14 { 15 txtMsg.AppendText("正在装配 型号:NB-250 数量:10 \r\n"); 16 } 17 18 void _bookBomb_Book() 19 { 20 txtMsg.AppendText("预定炸弹 型号:NB-250 数量:10 \r\n"); 21 } 22 //模拟订单处理流程的有三次调用 23 _bookBomb.OnBook(); 24 _bookBomb.OnBooking(); 25 _bookBomb.OnBooked();简单的实现就完成了。事件处理的结果是在消息框内输出相关订单的简要信息。第二步:带参数事件处理在第一步实践中,事件处理的时候并没有传入参数,而我们实际程序中会提供参数做相应处理,并且会根据业务的不同执行不同事件处理。并且上一实践中的命名也不太规范,似乎跟我们在IDE中看到的按钮等其他处理程序不太一样。这一实践,我们进行改革完善。给事件提供参数,要求我们的参数要符合.net规范里的参数定义。我们继承.net的参数类EventArgs 来自定义我们自己的参数类型:
代码
1 ///<summary> 2 /// 事件参数 3 ///</summary> 4 publicclass SimpleBookEventArgs : EventArgs 5 { 6 privateint _count =0; 7 publicint Count 8 { 9 get { return _count; } 10 set { _count = value; } 11 } 12 13 privatestring _model; 14 publicstring Name 15 { 16 get { return _model; } 17 set { _model = value; } 18 } 19 } 20 21 publicclass SimpleBookBomb 22 { 23 publicdelegatevoid SimpleBookEventHandler(SimpleBookEventArgs e); 24 publicevent SimpleBookEventHandler SimpleBookEvent; 25 publicevent SimpleBookEventHandler SimpleBookingEvent; 26 publicevent SimpleBookEventHandler SimpleBookedEvent; 27 ///<summary> 28 /// 预定 29 ///</summary> 30 ///<param name="e"></param> 31 publicvoid OnSimpleBook(SimpleBookEventArgs e) 32 { 33 if (SimpleBookEvent !=null) 34 { 35 this.SimpleBookEvent(e); 36 } 37 } 38 ///<summary> 39 /// 正在处理 40 ///</summary> 41 publicvoid OnSimpleBooking(SimpleBookEventArgs e) 42 { 43 if (SimpleBookingEvent !=null) 44 { 45 this.SimpleBookingEvent(e); 46 } 47 } 48 ///<summary> 49 /// 装配完毕 50 ///</summary> 51 publicvoid OnSimpleBooked(SimpleBookEventArgs e) 52 { 53 if (SimpleBookedEvent !=null) 54 { 55 this.SimpleBookedEvent(e); 56 } 57 } 58 }第三步:标准的事件实现通过以上两个实践,细心的你会发现怎么看上去跟系统的那些事件“样式”还不太一样呢,如果按钮事件的参数是两个,还有类似sender,例如:[align=left]privatevoid btnStandard_Click(object sender, EventArgs e)[/align]加上去就行了,对于系统的类事件,Sender参数只是简单地传递了指向引发事件的那个类的实例的一个引用,e依然是事件处理的参数。看一个相对标准的示例:参数定义:
代码
1 ///<summary> 2 /// 事件参数 3 ///</summary> 4 publicclass StandardBookEventArgs : EventArgs 5 { 6 privateint _count =0; 7 publicint Count 8 { 9 get { return _count; } 10 set { _count = value; } 11 } 12 13 privatestring _name; 14 publicstring Name 15 { 16 get { return _name; } 17 set { _name = value; } 18 } 19 } 20 21 publicclass StandardBookBomb 22 { 23 publicdelegatevoid StandardBookEventHandler(object sender, StandardBookEventArgs e); 24 publicevent StandardBookEventHandler StandardBookEvent; 25 publicevent StandardBookEventHandler StandardBookingEvent; 26 publicevent StandardBookEventHandler StandardBookedEvent; 27 ///<summary> 28 /// 预定 29 ///</summary> 30 publicvoid OnStandardBook(object sender, StandardBookEventArgs e) 31 { 32 if (StandardBookEvent !=null) 33 { 34 this.StandardBookEvent(sender, e); 35 } 36 } 37 ///<summary> 38 /// 正在处理 39 ///</summary> 40 publicvoid OnStandardBooking(object sender, StandardBookEventArgs e) 41 { 42 if (StandardBookingEvent !=null) 43 { 44 this.StandardBookingEvent(sender, e); 45 } 46 } 47 ///<summary> 48 /// 装配完毕 49 ///</summary> 50 publicvoid OnStandardBooked(object sender, StandardBookEventArgs e) 51 { 52 if (StandardBookedEvent !=null) 53 { 54 this.StandardBookedEvent(sender, e); 55 } 56 } 57 }总结:通过一步步进化,在第三个实践中已经是一个相对“标准”的事件处理过程了。命名规范:[align=left]参数后缀EventArgs,例如 :StandardBookEventArgs[/align][align=left]委托后缀EventHandler,例如:StandardBookEventHandler[/align][align=left]事件后缀Event,例如:StandardBookEvent[/align][align=left]处理方法前缀On,例如:OnStandardBook()[/align]大致步骤:1, 定义参数2, 定义委托3, 定义事件4, 注册事件5, 实现事件处理程序6, 触发事件这个可以作为以后写类似代码的参考。点击下载源码
相关文章推荐
- 编写高质量代码改善C#程序的157个建议——建议41:实现标准的事件模型
- 事件处理程序实现的另一种方法:浏览器的事件监听机制实现“1事件对应n事件处理程序”(Javascript)
- 改善C#程序的建议4:C#中标准Dispose模式的实现
- 改善C#程序的建议4:C#中标准Dispose模式的实现
- 改善 C#程序的建议4:C#中标准Dispose模式的实现
- C#事件处理程序的写法
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- 利用反射绑定事件处理程序(C#)
- 利用反射绑定事件处理程序(C#)
- C#控制台程序中处理2个关闭事件的代码实例
- VB.NET之旅(十三)—标准事件处理程序
- C#中动态创建控件及事件处理程序
- C#中动态创建控件及事件处理程序
- 改善C#程序的建议4:C#中标准Dispose模式的实现
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- 在C# WinForm程序中创建控件数组及相应的事件处理
- C#中共享事件处理程序
- Henry的VB.NET之旅(十三)—标准事件处理程序
- asp.net2.0实现自定义Web处理类(迁移事件处理程序到SQL Server200中)
- C# 实现 HTML+一般处理程序图片上传功能如图!