這裡,稍稍說明一下控制項中事件的宣告。事件的宣告需使用關鍵字 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 程式的事件視窗中被自動識別。也就是說,即使不用事件,純用委派,事件的機制一樣可以實現,問題只是這樣的委派物件無法輕易被外界識別罷了。