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