走进C 走进朝鲜全集
创始人
2024-07-26 20:20:26
0

事件,是C#编程模型中重要的一个概念,通过对事件的理解,可以更好的了解C#程序运行机制。C#中的事件,可以简单的理解为类或者对象发生了一件事,并且把这件事通知给了其他的类或者对象,其他的类或者对象可以根据事件的消息有所反应。这非常类似设计模式中的观察者模式。

引发事件的类或对象,可以称之为事件源,注册并对处理事件的类或者对象可以称为事件订阅者或者事件监听者,我比较喜欢称之为事件监听者。

比如:构建一个winform应用,在窗体Form1简单放置一个按钮控件,然后,双击按钮,则可以进入代码视图中按钮click事件处理程序。

  1. private void button1_Click(object sender, EventArgs e)        
  2.           
  3.  ///sender即表示事件源,e表示通过事件传递过来的消息     
  4.   } 

这时,还可以打开Form1.designer.cs,还可以找到如下代码:

  1. this.button1.Click += new System.EventHandler(this.button1_Click); 

这行代码表明,当前窗体注册了click事件(click就是Button对象的一个事件),并且用 button1_Click方法进行了处理。EventHandler是一个委托,关于委托可参见我的上一篇文章C#基础概念之委托

以上是对C#事件的一些简单的解释。当然,我们也可以自定义事件。

自定义事件,分为如下几步:

第一步:首先在事件源对象定义事件

  1. //定义事件        
  2.  public event EventHandler myevnet; 

第二步:在事件监听者,订阅事件

  1. //事件注册            
  2. this.myevnet+=new EventHandler(MyEventHandler); 

第三步:在事件监听者,编写事件处理代码:

  1. ///         
  2. /// 事件的处理     
  3.    ///         
  4. ///         
  5. ///        
  6.  private void MyEventHandler(object sender, EventArgs e)        
  7. {             
  8. essageBox.Show("myevent is raised.......");     
  9.    } 

第四步:在事件源对象引发事件

  1. //判断事件是否被注册           
  2.   if (myevnet != null)          
  3.    {                 
  4. //引发事件              
  5.    myevnet(this.button1, new EventArgs());         
  6.     } 

这仅是个演示,供各位参考,下面给出完整代码,方便测试

简单自定义事件,完整代码

  1.  public partial class Form1 : Form   
  2.  {   
  3.      //定义事件   
  4.       public event EventHandler myevnet;  
  5.          public Form1()  
  6.     {   
  7.        InitializeComponent();   
  8.       //事件注册  
  9.         this.myevnet+=new EventHandler(MyEventHandler);  
  10.          }  
  11. private void button1_Click(object sender, EventArgs e)  
  12.    {  
  13.         MessageBox.Show("button1_Click");  
  14.         //判断事件是否被注册  
  15.          if (myevnet != null)  
  16.          {  
  17.             //引发事件  
  18.               myevnet(this.button1, new EventArgs());  
  19.           }  
  20.       }  
  21.         ///   
  22.      /// 事件的处理      
  23.  ///   
  24.         ///   
  25.      ///   
  26.   private void MyEventHandler(object sender, EventArgs e)  
  27.       {  
  28.           MessageBox.Show("myevent is raised.......");  
  29.       }  
  30.   } 

当然,真环境下,自定义事件要比这个复杂一些,下面再举一个例子,在事件引发时,传递自定义的消息。

首先要自定义一个事件消息类,这个类继承于EventArgs

然后自定义委托,来处理事件。完整代码如下:

事件源方面:

事件源代码

  1.  ///自定义事件委托  
  2. public delegate void MyeventHandler(object sender, MyEventArgs e);  
  3. public partial class AddGrade : Form   
  4.  {   
  5.       //声明事件   
  6.    public event MyeventHandler myCustomevent;   
  7.           public AddGrade()   
  8.         {  
  9.         InitializeComponent();  
  10.    }  
  11.      private void button1_Click(object sender, EventArgs e)  
  12.   {  
  13.         //dosomthing  
  14.            //事件引发  
  15.             if (myCustomevent != null)  
  16.            {  
  17. myCustomevent(this, new MyEventArgs() {
  18.  Message = this.textBox1.Text });  
  19.           }  
  20.       }  
  21.   }  
  22. ///自定义事件消息类  
  23.     public class MyEventArgs : EventArgs  
  24.    {  
  25.       public string Message { set; get; }  
  26.    } 

事件监听者方面:

事件监听

  1.    public partial class EventDemo : Form  
  2.   {   
  3.     public EventDemo()   
  4.       {   
  5.            InitializeComponent();   
  6.         }   
  7. private void button1_Click(object sender, EventArgs e)  
  8.         {  
  9.        AddGrade addGrad = new AddGrade();  
  10.              //注册事件  
  11. addGrad.myCustomevent += new MyeventHandler(addGrad_myCustomevent);  
  12.            addGrad.Show();            
  13.      }  
  14.       void addGrad_myCustomevent(object sender, MyEventArgs e)  
  15.        {  
  16.             //dosomthing  
  17.            MessageBox.Show(e.Message);  
  18.        }  
  19.       } 

原文链接:http://www.cnblogs.com/yangyancheng/archive/2011/04/24/2026240.html

【编辑推荐】

  1. .NET不用控件实现文件夹监测系统
  2. 详解C#中不同类的类型
  3. 浅谈C#中标准Dispose模式的实现
  4. C#图片处理的3种高级实用方法
  5. C# 4.0新特性:协变与逆变中的编程思想

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...