今天一朋友問我在程序中怎麼實現事件。於是我總結了哈發出來。要明白事件,首先要知道什麼是委託。在C#中委託允許開發人員
將一個對象中的方法傳遞給另一個能調用該方法的類的某個對象。比如:可以將類AC中的一個方法ADD[前提是這個方法以被包含在某個委託中了]傳遞給另一個類WMS。此時類WMS就能調用類AC中的ADD了。當然不管你是以什麼方式實現方法的傳遞了,可以是靜態的,也可以是實例化的。。要實現一個委託,需要按照這樣的不揍:
A:申明委託對象。注意:參數一定要和你想要包含的方法的參數形式一致。
public delegate void NeweggDelegate(string values)
B:定義方法
class NeweggClass1{
public viod NeweggMethod1(string values){}
public viod NeweggMethod2(string values){}
....}
C:創建一個委託對象此時將這個方法包含在該委託對象中
class NeweggClass2{
public NeweggDelegate createDelegate()
{NeweggClass1 obj1=new NeweggClass1();
NeweggDelegate dele1=new NeweggDelegate(obj1.NeweggMethod1);
NeweggDelegate dele2=new NeweggDelegate(obj1.NeweggMethod2);
NeweggDelegate dele3=dele1+dele2;//屬於多點委託了
return dele3;
}
}
D:再調用包含在委託中的方法。
class NeweggClass3
{
public void NeweggCallDelegate(NeweggDelegate de,string values)
{de(values);}
}
class test
{
static void Main(string[] args)
{
NeweggClass2 cls2=new NeweggClass2();
NeweggDelegate delel=cls2.createDelegate();
NeweggClass3 cls3=new NeweggClass3();
cls3.NeweggCallDelegate(delel,"deleagte is used");
}
}
而事件是具有特定參數的委託對象而已。格式象:public delegate void NeweggEventHandler(object sender,NeweggEventArgs e);
sender表示觸發該事件的對象,e表示在事件處理函數裏可以被使用的一些數據象NeweggEventArgs可以繼承自EvenetArgs類。當然有的時候不需要派生自己的類想一些GUI的程序,裏面有很多縣城的事件使用如:MouseEventArgs。否則必須從EventArgs類派生。
現在舉例如下:
using System;
public delegate void MyHandler1(object sender,MyEventArgs e);
public delegate void MyHandler2(object sender,MyEventArgs e);
//步驟2:創建事件處理函數的方法
class A{
public const string m_id="Class A";
public void OnHandler1(object sender,MyEventArgs e){
Console.WriteLine("I am in OnHandler1 and MyEventArgs is {0}",
e.m_id);
}
public void OnHandler2(object sender,MyEventArgs e){
Console.WriteLine("I am in OnHandler2 and MyEventArgs is {0}",
e.m_id);
}
//步驟3:創建委託對象,並事件處理函數包含在其中同時設置好將要觸發事件的對象
public A(B b){
MyHandler1 d1=new MyHandler1(OnHandler1);
MyHandler2 d2=new MyHandler2(OnHandler2);
b.Event1 +=d1;
b.Event2 +=d2;
}
}
//步驟4:通過委託對象(也就是觸發事件)來調用被包含的方法
class B{
public event MyHandler1 Event1;
public event MyHandler2 Event2;
public void FireEvent1(MyEventArgs e){
if(Event1 != null){
Event1(this,e);
}
}
public void FireEvent2(MyEventArgs e){
if(Event2 != null){
Event2(this,e);
}
}
}
public class MyEventArgs EventArgs{
public string m_id;
}
public class Driver{
public static void Main(){
B b= new B();
A a= new A(b);
MyEventArgs e1=new MyEventArgs();
MyEventArgs e2=new MyEventArgs();
e1.m_id ="Event args for event 1";
e2.m_id ="Event args for event 2";
b.FireEvent1(e1);
b.FireEvent2(e2);
}
}
轉自http://www.codes51.com/article/detail_35140.html