這裡,稍稍說明一下控件中事件的聲明。事件的聲明需使用關鍵字event,大致的形式是event +(某委托類型)+ 一個實例對象。
而後我建立一個Demo程序,來調用這個用戶控件,代碼如下:
namespace EventDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void userControl11_MyEvent()
{
MessageBox.Show("委托事件調用成功!");
}
}
}
在工程中引入用戶控件,打開其事件窗口可以找到我們事先定義的事件MyEvent,雙擊就可以在其中寫入代碼。這裡,我用一個MessageBox來進行測試。
編譯通過後,單擊控件上的button就會彈出我們的MessageBox,事件調用成功!
呵呵……發現了嗎?這段代碼所隱含事件機制的雛形實際上就是第三段代碼中所實現的效果。只不過這裡我們是用一個具體的窗口類控制了其所引入控件類中的委托對象。
看到類構造方法中的InitializeComponent()方法了嗎?雙擊轉到定義,在Windows窗體設計器生成的代碼中,在你所引入的控件屬性初始化模塊下有這樣一句代碼:this.userControl11.MyEvent += new Ctrleven.UserControl1.MyEventHander(this.userControl11_MyEvent); 你可以拿來跟第三段代碼中的那句 objcls.MyObjdelegate += new ObjCls.MyDelegete(DelegateFun); 對比一下,發現了嗎?是一樣的!
所以,C#中的事件本身就是一種(多重)委托機制,憑借關鍵字event,使得我們在控件中定義好的事件專用委托實例對象在頂層的Demo程序的事件窗口中被自動識別。也就是說,即使不用事件,純用委托,事件的機制一樣可以實現,問題只是這樣的委托對象無法輕易被外界識別罷了。