事件,MSDN解释:类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
有关事件的理论与好处,在这里就不再废话了,感兴趣的可以参考MSDN的讲解。这里就通过有一个demo演示一下如何一步步实现标准的事件处理过程。可以做为以后代码中的事件编写参考。要运用事件,需要了解委托与事件,可以去学习相关教程。
模拟有一个恐怖的军火提供商要我们实现一个火箭炮的订单管理程序。效果图:
第一步:基本实践
从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,例如:
privatevoid btnStandard_Click(object sender, EventArgs e)
加上去就行了,对于系统的类事件,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 }
 
总结:通过一步步进化,在第三个实践中已经是一个相对“标准”的事件处理过程了。
命名规范:
参数后缀EventArgs,例如 :StandardBookEventArgs
委托后缀EventHandler,例如:StandardBookEventHandler
事件后缀Event,例如:StandardBookEvent
处理方法前缀On,例如:OnStandardBook()
大致步骤:
1,      定义参数
2,      定义委托
3,      定义事件
4,      注册事件
5,      实现事件处理程序
6,      触发事件
这个可以作为以后写类似代码的参考。

点击下载源码

C#三步实现标准事件处理程序的更多相关文章

  1. javascript事件处理程序的3个阶段

    第一阶段:HTML事件处理阶段.就是在元素里面添加onclick之类的属性来调用某个函数. <input type="button" value="单击" ...

  2. [转]javascript指定事件处理程序包括三种方式:

    javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn" ...

  3. javaScript事件(二)事件处理程序

    一.事件 二.事件流 以上内容见:javaScript事件(一)事件流 三.事件处理程序 前面提到,事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字.响应 ...

  4. 探究JavaScript中的五种事件处理程序

    探究JavaScript中的五种事件处理程序 我们知道JavaScript与HTML之间的交互是通过事件实现的.事件最早是在IE3和Netscape Navigator 2中出现的,当时是作为分担服务 ...

  5. 注册事件处理程序onclick和addEventListener、attachEvent

    一.设置HTML标签属性为事件处理程序(注意和下面的设置javascript对象属性为事件处理程序是不同的) 用于设置文档元素事件处理程序属性也能化成对应的HTML标签的属性.如果这样做,属性值应该是 ...

  6. JavaScript 事件 事件流 事件对象 事件处理程序 回调函数 error和try...catch和throw

    参考资料: 慕课网 DOM事件探秘    js事件对象 处理 事件驱动: JS是采用事件驱动的机制来响应用户操作的,也就是说当用户对某个html元素进行操作的时候,会产生一个时间,该时间会驱动某些函数 ...

  7. 《JAVASCRIPT高级程序设计》事件处理程序和事件类型

    一.事件流 谈到事件,首要要理解事件流的概念:事件流是指从页面接受事件的顺序:“DOM2级事件”规定事件流包括三个阶段:事件捕获阶段.处于目标阶段和事件冒泡阶段.目前大部分的浏览器的事件流是事件冒泡, ...

  8. Android艺术开发探索第三章——View的事件体系(上)

    Android艺术开发探索第三章----View的事件体系(上) 我们继续来看这本书,因为有点长,所以又分了上下,你在本片中将学习到 View基础知识 什么是View View的位置参数 Motion ...

  9. JavaScript Event 事件 事件流 事件对象 事件处理程序 回调函数 error和try...catch和throw

    参考资料: 慕课网 DOM事件探秘    js事件对象 处理 事件驱动: JS是采用事件驱动的机制来响应用户操作的,也就是说当用户对某个html元素进行操作的时候,会产生一个事件,该事件会驱动某些函数 ...

随机推荐

  1. 21.Linux-写USB键盘驱动(详解)

    本节目的: 根据上节写的USB鼠标驱动,来依葫芦画瓢写出键盘驱动 1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以 ...

  2. Linux-fdisk磁盘分区命令(16)

    名称: fdisk 使用: fdisk [块设备磁盘] 说明: 将一个块设备(磁盘)分成若干个块设备(磁盘),并将分区的信息写进分区表.  fdisk命令菜单常用参数如下所示: d:(del)删除一个 ...

  3. nodejs+express-实现文件上传下载管理的网站

    Nodejs+Express-实现文件上传下载管理的网站 项目Github地址(对你有帮助记得给星哟):https://github.com/qcer/updo 后端:基于nodejs的express ...

  4. Java IO编程全解(一)——Java的I/O演进之路

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7419117.html JDK1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O ...

  5. php中数组相关

    <?php//参数默认值function abc($a,$b,$c = 0){ echo $a,$b,$c;}abc(1,3);结果为:130:echo "<br>&quo ...

  6. Chloe.ORM框架应用实践

    Chloe.ORM 是国人开发的一款数据库访问组件,很是简单易用.目前支持四种主流数据库:SqlServer.MySQL.Oracle,以及Sqlite,作者为这四种数据库划分出了各自对应的组件程序集 ...

  7. 组件 layui 表单抓取数据四步走

    注意事项: layui 中提交按钮是基于"监听"机制实现的. form.on() 的调用需置于 layui.use 的回调函数中. 末尾的 'return false' 不可或缺, ...

  8. ubuntu6.04下安装Eclipse for C/C++ Development

    ubuntu6.04下安装Eclipse for C/C++ Development 首先安装gcc/g++ 需要安装jdk,有的可以尝试安装openjdk. sudo apt-get install ...

  9. 输入3行字符串/定义flag/while/字符串后要加空格符

    int i = 0,j = 0; for(; i < 3; i++) { gets(a[i]); }//输入3行字符串 bool flag = true; while语句的语义是:计算表达式的值 ...

  10. wpf GifBitmapDecoder 解析 gif 格式

    在网上有很多图片都是gif,那么如何在 wpf 解析 gif? 本文告诉大家如何使用 GifBitmapDecoder 把gif分开为一张一张,获得他的信息. 如果需要把一个 gif 分开,使用的代码 ...