C#許多事情都和事件有關系,大部分的事情我們可以通過C#自己的事件來完成,但如果我們自己新建了一個自定義控件,我們該如何定義自己想要的事件呢?下面我就來為大家粗略的講解一番。
假設我們自定義了一個控件,它的類名是MyControl,我們在test類(test也是一個窗體)中使用它,我們要在test中寫方法,在MyControl中寫事件,這該怎么做?如何在test中捕獲Mycontrol中的事件,如何讓事件綁定test中的方法?
假設MyControl是一個組合控件,假設有一個按鈕btn_Ok,它在組合控件System.Windows.Forms.
ToolStrip
中,假設這個容器叫toolstrip,當我們點擊了之后需要響應一個事件,提示我們數據保存了,這個事件我們起個名字叫Btn_Ok_Clicked(當然也可以叫datasaved或者其它),下面要定義這個事件,我們這么定義:
private static readonly object Event_Btn_Ok_Clicked = new object();
public event EventHandler Btn_Ok_Clicked
{
add { base.Events.AddHandler(Event_Btn_Ok_Clicked , value); }
remove { base.Events.RemoveHandler(Event_Btn_Ok_Clicked , value); }
}
然后我們需要定義一個方法,用來引發這個事件
protected virtual void OnBtn_OK_Click(EventArgs e)
{
EventHandler handler =
base.Events[Event_Btn_Ok_Clicked ] as EventHandler;
if (handler != null)
{
handler(this, e);
}
}
該方法定義完了之后,我們需要通過捕獲原本的事件,然后引發該事件
點擊btn_Ok會引發toolstrip的click事件,我們在捕獲click事件后對數據進行處理
private void ToolStripItemClicked(
object sender, ToolStripItemClickedEventArgs e)
{
switch (e.ClickedItem.Name)
{
case "btn_Ok":
OnBtn_OK_Click(e);
break;
}
}
以上方法定義在MyControl類中
到這里,MyControls中的事件和方法就都定義和實現完了,下面我們來講在test中如何對這個事件的引用。
以下代碼都在test類中
我們通過拖控件或者代碼的方式在test窗體中添加控件
private MyControl control;
在窗體初始化的時候為剛才我們自定義的事件添加方法,方法名是functiontest
control. Btn_Ok_Clicked += new EventHandler(functiontest);
現在我們來定義functiontest方法,假設我們就是為了提示“數據已保存”
private void functiontest(object sender, EventArgs e)
{
MessageBox.Show("數據已保存");
}
到這里,我們從 自定義控件 -> 自定義事件 -> 觸發事件 -> 綁定方法 的步驟已經全部完成了。有不明白的請通過回復的方式提問,對講的不好的,也歡迎指出~