描述C 描述c罗的句子诗句
创始人
2024-04-28 19:51:32
0次

C#事件处理程序

我们可以把事件编程简单地分成两个部分:事件发生的类(书面上叫事件发生器)和事件接收处理的类。事件发生的类就是说在这个类中触发了一个事件,但这个类并不知道哪个个对象或方法将会加收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(delegate)。在事件接收处理的类中,我们需要有一个处理事件的方法。好了,我们就按照这个顺序来实现一个捕获键盘按键的程序,来一步一步说明如何编写事件应用程序。

1、首先创建一个自己的EventArgs类。
引自MSDN:
EventArgs是包含事件数据的类的基类,此类不包含事件数据,在事件引发时不向C#事件处理程序传递状态信息的事件会使用此类。如果C#事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。
因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,来保存按键信息,好让后面知道按了哪个键。

  1. internalclassKeyEventArgs:EventArgs  
  2. {  
  3. privatecharkeyChar;  
  4. publicKeyEventArgs(charkeyChar):base()  
  5. {  
  6. this.keyChar=keyChar;  
  7. }  
  8.  
  9. publiccharKeyChar  
  10. {  
  11. get  
  12. {  
  13. returnkeyChar;  
  14. }  
  15. }  
  16. } 

2、再创建一个事件发生的类KeyInputMonitor,这个类用于监控键盘按键的输入并触发一个事件:

  1. internalclassKeyInputMonitor  
  2. {  
  3. //创建一个委托,返回类型为void,两个参数  
  4. publicdelegatevoidKeyDown(objectsender,KeyEventArgse);  
  5. //将创建的委托和特定事件关联,在这里特定的事件为OnKeyDown  
  6. publiceventKeyDownOnKeyDown;  
  7.  
  8. publicvoidRun()  
  9. {  
  10. boolfinished=false;  
  11. do  
  12. {  
  13. Console.WriteLine("Inputachar");  
  14. stringresponse=Console.ReadLine();  
  15.  
  16. charresponseChar=(response=="")?'':char.ToUpper(response[0]);  
  17. switch(responseChar)  
  18. {  
  19. case'X':  
  20. finished=true;  
  21. break;  
  22. default:  
  23. //得到按键信息的参数  
  24. KeyEventArgskeyEventArgs=newKeyEventArgs(responseChar);  
  25. //触发事件  
  26. OnKeyDown(this,keyEventArgs);  
  27. break;  
  28. }  
  29. }while(!finished);  
  30. }  
  31. } 

这里注意OnKeyDown( this, KeyEventArgs );一句,这就是触发事件的语句,并将事件交由KeyDown这个委托来处理,委托指定事件处理方法去处理事件,这就是事件接收方的类的事情了。参数this是指触发事件的对象就是本身这个对象,keyEventArgs包含了按键信息。

3、最后创建一个事件接收方的类

这个类先产生一个委托实例,再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。然后提供一个方法回显按键信息。

  1. internalclassEventReceiver  
  2. {  
  3. publicEventReceiver(KeyInputMonitormonitor)  
  4. {  
  5. //产生一个委托实例并添加到KeyInputMonitor产生的事件列表中  
  6. monitor.OnKeyDown+=newKeyInputMonitor.KeyDown(this.Echo);  
  7. }  
  8. privatevoidEcho(objectsender,KeyEventArgse)  
  9. {  
  10. //真正的事件处理函数  
  11. Console.WriteLine("Capturekey:{0}",e.KeyChar);  
  12. }  
  13. } 

4、看一下如何调用

  1. publicclassMainEntryPoint  
  2. {  
  3. publicstaticvoidStart()  
  4. {  
  5. //实例化一个事件发送器  
  6. KeyInputMonitormonitor=newKeyInputMonitor();  
  7. //实例化一个事件接收器  
  8. EventReceivereventReceiver=newEventReceiver(monitor);  
  9. //运行  
  10. monitor.Run();  
  11. }  
  12. } 

总结:

C#中使用事件需要的步骤:
1.创建一个委托
2.将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联C#事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名)
3.编写C#事件处理程序
4.利用编写的C#事件处理程序生成一个委托实例
5.把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件

C#中事件产生和实现的流程:
1.定义A为产生事件的实例,a为A产生的一个事件
2.定义B为接收事件的实例,b为处理事件的方法
3.A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
4.A通过事件列表中的委托对象将这个事件通知给B
5.B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
6.调用B.b方法完成事件处理

【编辑推荐】

  1. 定义C#接口学习经验
  2. C# ListBox学习笔记
  3. 操作C# Dataset介绍
  4. C# ODBC访问MySQL数据库
  5. 浅析C#和Java不同点

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...