C#事件機制歸納(下)
2024-07-21 02:19:34
供稿:網(wǎng)友
3.c#中預定義事件處理方式
學習事件,我覺得最不好理解的就是c#中預定義了事件,使我才開始學習事件時一頭霧水。在查了些資料后,終于弄明白了一些,如下:
eventargs是包含事件數(shù)據(jù)的類的基類,用于傳遞事件的細節(jié)。
eventhandler是一個委托聲明如下(其在.net類庫中如下聲明的)
public delegate void eventhandler( object sender , eventargs e )
所以,所有形如:
void 函婁名(object 參數(shù)名,eventargs 參數(shù)名);
的函數(shù)都可以作為control類的click事件響應方法了。如下面所定義的一個事件響應方法:
private void button1_click(object sender, system.eventargs e)
參數(shù)object sender表示引發(fā)事件的對象,(其實這里傳遞的是對象的引用,如果是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事件所對應的方法。注意方法的參數(shù)符合委托中的簽名(既參數(shù)列表)。那我們怎么把這個方法和事件聯(lián)系起來呢,請看下面的代碼。
this.button1.click += new system.eventhandler(this.button1_click); (其實button1.click 為system.eventhandler委派的實例事件。與委派中委派實例委托給某一方法非常相似)
把this.button1_click方法綁定到this.button1.click事件。
4.事件的參數(shù)的使用。
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方法一執(zhí)行,觸發(fā)registerok事件
//registerok事件一觸發(fā),然后執(zhí)行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;
}
}