C#事件机制归纳(下)
2024-07-21 02:19:34
供稿:网友
3.c#中预定义事件处理方式
学习事件,我觉得最不好理解的就是c#中预定义了事件,使我才开始学习事件时一头雾水。在查了些资料后,终于弄明白了一些,如下:
eventargs是包含事件数据的类的基类,用于传递事件的细节。
eventhandler是一个委托声明如下(其在.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;
}
}