3 . C# 中预定义事件处理方式
学习事件 , 我觉得最不好理解的就是 C# 中预定义了事件 , 使我才开始学习事件时一头雾水。在查了些资料后,终于弄明白了一些,如下:
**_ EventArgs _ ** 是包含事件数据的类的基类 , 用于传递事件的细节。
**_ EventHandle _ ** _ r _ 是一个委托声明如下 ( 其在 .Net 类库中如下声明的)
public delegate void EventHandler( object sender , EventArgs e )
所以,所有形如 :
void 函娄名 (object 参数名 ,EventArgs 参数名 );
的函数都可以作为 Control 类的 Click 事件响应方法了。如下面所定义的一个事件响应方法:
** private void button1_Click(object sender, System.EventArgs e) **
** 参数 ** ** object sender ** ** 表示引发事件的对象,(其实这里传递的是对象的引用,如果是 ** ** button1 ** ** 的 ** ** click ** ** 事件则 ** ** sender ** ** 就是 ** ** button1 ** ** ) ** ** System.EventArgs e ** ** 代表事件的相应信息,如鼠标的 ** ** x,y ** ** 值等。 **
下面我们研究一下 Button 类看看其中的事件声明,以 Click 事件为例。
** public event EventHandler Click; **
这里定义了一个 EventHandler 类型的事件 Click
private void button1_Click(object sender, System.EventArgs e)
{
...
}
这是我们和button1_click事件所对应的方法。注意方法的参数符合委托中的签名(既参数列表)。那我们怎么把这个方法和事件联系起来呢,请看下面的代码。
this.button1.Click += new System.EventHandler(this.button1_Click); ( ** 其实 button1.Click 为System.EventHandler委派的实例事件。与委派中委派实例委托给某一方法非常相似 ** )
把this.button1_Click方法绑定到this.button1.Click事件。
** 4 .事件的参数的使用。 **
** using System; **
** class Class1 **
** { **
** static void Main () **
** { **
** Student s1=new Student(); **
** s1.Name ="Student1"; **
** Student s2=new Student(); **
** s2.Name ="Student2"; **
** s1.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); **
** s2.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); **
** // 当 Register 方法一执行,触发 RegisterOK 事件 **
** //RegisterOK 事件一触发,然后执行 Student_RegisterOK 方法 **
** s1.Register(); **
** s2.Register(); **
** Console.ReadLine(); **
** } **
** static void Student_RegisterOK( RegisterOkArgs e ) **
** { **
** Console.WriteLine( e.EventInfo ); **
** } **
** } **
** class Student **
** { **
** public delegate void DelegateRegisterOkEvent(RegisterOkArgs e); **
** public event DelegateRegisterOkEvent RegisterOK; **
** public string Name; **
** public void Register() **
** { **
** Console.WriteLine("Register Method"); **
** RegisterOK( new RegisterOkArgs("Student Name: "+Name) ); **
** } **
** } **
** class RegisterOkArgs:EventArgs **
** { **
** public string EventInfo; **
** public RegisterOkArgs(string eventInfo):base() **
** { **
** this.EventInfo =eventInfo; **
** } **
** } **