走进C#基础概念之事件

我们将要讲述的是C#编程模型中的一个重要概念——事件,通过对事件的理解,可以更好的了解C#程序运行机
首页 新闻资讯 行业资讯 走进C#基础概念之事件

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

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

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

复制

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

  • 2.

  • 3.

  • 4.

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

复制

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

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

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

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

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

复制

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

  • 2.

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

复制

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

  • 2.

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

复制

/// <summary>        /// 事件的处理        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void MyEventHandler(object sender, EventArgs e)        {             essageBox.Show("myevent is raised.......");        }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

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

复制

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

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

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

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

复制

 public partial class Form1 : Form    {        //定义事件         public event EventHandler myevnet;           public Form1()      {          InitializeComponent();         //事件注册          this.myevnet+=new EventHandler(MyEventHandler);           }  private void button1_Click(object sender, EventArgs e)     {          MessageBox.Show("button1_Click");          //判断事件是否被注册           if (myevnet != null)           {              //引发事件                myevnet(this.button1, new EventArgs());            }        }          /// <summary>       /// 事件的处理       /// </summary>          /// <param name="sender"></param>       /// <param name="e"></param>    private void MyEventHandler(object sender, EventArgs e)        {            MessageBox.Show("myevent is raised.......");        }    }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

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

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

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

事件源方面:

事件源代码

复制

 ///自定义事件委托  public delegate void MyeventHandler(object sender, MyEventArgs e);  public partial class AddGrade : Form    {         //声明事件      public event MyeventHandler myCustomevent;             public AddGrade()           {          InitializeComponent();     }       private void button1_Click(object sender, EventArgs e)    {          //dosomthing             //事件引发              if (myCustomevent != null)             {  myCustomevent(this, new MyEventArgs() { Message = this.textBox1.Text });            }        }    }  ///自定义事件消息类      public class MyEventArgs : EventArgs     {        public string Message { set; get; }     }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

事件监听者方面:

事件监听

复制

   public partial class EventDemo : Form    {       public EventDemo()         {              InitializeComponent();           }   private void button1_Click(object sender, EventArgs e)          {         AddGrade addGrad = new AddGrade();               //注册事件  addGrad.myCustomevent += new MyeventHandler(addGrad_myCustomevent);             addGrad.Show();                 }        void addGrad_myCustomevent(object sender, MyEventArgs e)         {              //dosomthing             MessageBox.Show(e.Message);         }        }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 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新特性:协变与逆变中的编程思想



14    2011-04-26 08:56:31    C#