C#事件机制归纳(下)

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; **

** } **

** } **


Published At
Categories with Web编程
Tagged with
comments powered by Disqus