您好,登錄后才能下訂單哦!
C#中怎么生成自定義事件,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創建一個事件類型:
1.新建一個窗體應用程序,添加一個button和lebelInfo,name分別為buttonRaise和labelInfo。
2.定義一個委托:
在窗體類的聲明部分添加
public delegate void ActionEventHandler(object sender, ActionCancelEventArgs e);
這里我們聲明了一個新的委托類型ActionEventHandler,原因是我們后面要自己定制EventArg類(上面可見就是ActionCancelEventArgs類),方法名必須和委托匹配。
3.定義一個C#自定義事件:
在上面代碼后面加上,
public static event ActionEventHandler Action;
我們定義了一個叫Action的事件,事件定義的語法要求指定與事件相關的委托。
4.創建自己定義的EventArg類:
在程序中定義一個類代碼如下:
namespace WindowsApplication1 { public class ActionCancelEventArgs : System.ComponentModel.CancelEventArgs { string message = String.Empty; public ActionCancelEventArgs() : base() { } public ActionCancelEventArgs(bool cancel) : base(cancel) { } public ActionCancelEventArgs(bool cancel, string message) : base(cancel) { this.message = message; } public string Message { get { return message; } set { message = value; } } } }
這個新類ActionCancelEventArgs實際上派生于CancelEventArgs,而CancelEventArgs派生于EventArgs。CancelEventArgs添加了Cancel屬性,是一個bool類型,它通知sender對象,接收器希望取消或者停止事件的處理。我們為ActionCancelEventArgs添加一個message屬性,包含事件處理時候傳遞一個事件處理狀態的字符串。
所有的基于EventArgs的類都負責在發送器和接收器之間來回傳送事件的信息。大多情況下,EventArgs類中使用的信息都被事件處理程序中的接收器對象(這里后來的ActionCancelEventArgs ev)所使用。但是有時候,事件處理程序可以把信息添加到EventArg類中,使之可以用于發送器。我們這里就是這樣做的其實(接收器根據狀態把信息傳給發送器中的message屬性了)。
引發事件:
1.通過一種動作來激活Action事件(我們就用點擊按鈕buttonRaise):
先為buttonRaise按鈕添加一個點擊事件處理程序:
private void buttonRaise_Click(object sender, EventArgs e)
2.再在處理程序中用正確的參數調用事件:添加如下代碼,
ActionCancelEventArgs cancelEvent = new ActionCancelEventArgs(); OnAction(this, cancelEvent);
就是先創建一個新的事件數據類型ActionCancelEventArgs,再把它當作參數傳遞給前面定義的那個Action事件的處理程序(引發事件是通過Action(this, cancelEvent)的,但是我們通過OnAction()來調用之)。這里我們的Action事件就相當我們.Net中的Move,Click事件一樣的了,但是目前它還是空的,如果引發了這個事件就會產生一個空引用異常,所以我們如果在其他的類中把Action事件定義為基事件,則只要引發了Action就要定義相關的事件處理程序的。
3.我們定義一個叫OnAction的函數引發事件,(加上On是命名約定)
protected void OnAction(object sender, ActionCancelEventArgs e) { if (Action != null) //捕獲空引用錯誤 Action(sender, e); }
如果派生一個包含該方法和事件的新類,就必須重寫OnAction方法,并且在重寫代碼中調用base.OnAction(),引發此事件。
接受事件,并且處理之:
1.下面就是定義一個新類BusEntity了:
namespace WindowsApplication1 { public class BusEntity { string time = String.Empty; public BusEntity() { Form1.Action += new Form1.ActionEventHandler(Form1_Action); } private void Form1_Action(object sender, ActionCancelEventArgs e) { e.Cancel = !DoActions(); if (e.Cancel) e.Message = "Wasn't the right time."; } private bool DoActions() { bool retVal = false; DateTime tm = DateTime.Now; if (tm.Second < 30) { time = "The time is " + DateTime.Now.ToLongTimeString(); retVal = true; } else time = ""; return retVal; } public string TimeString { get { return time; } } } }
其中關鍵代碼:
1.構造函數中聲明了Form1.Action事件的處理程序(注冊事件):
Form1.Action += new Form1.ActionEventHandler(Form1_Action);
注意這里注冊的是Form1中定義的那個Action事件,不是其它地方定義的。
2.Action事件的處理程序(在前面Form1類中通過OnAction()引發的):
private void Form1_Action(object sender, ActionCancelEventArgs e)
其中的處理是通過調用DoAction函數來的。它返回一個bool值,并且將狀態信息賦值給事件數據類型ActionCancelEventArgs的參數的message成員。
3.完善Form1程序:
(1)類中要先新建成員private BusEntity busEntity;
(2)構造函數中初始化之:busEntity = new BusEntity();
(3)完善點擊按鈕的事件處理,引發并且處理Action事件:
private void buttonRaise_Click(object sender, EventArgs e) { ActionCancelEventArgs cancelEvent = new ActionCancelEventArgs(); OnAction(this, cancelEvent); if (cancelEvent.Cancel) labelInfo.Text = cancelEvent.Message; else labelInfo.Text = busEntity.TimeString; }
在補充說明:這里創建了ActionCancelEventArgs對象,接著引發了Action事件,并且傳遞了新建的ActionCancelEventArgs對象cancelEvent。在調用OnAction方法,引發事件的時候,BusEntity對象中Action事件處理程序的代碼就會執行。如果還有其他對象注冊了事件,它們同樣會執行。記住:如果其他對象也處理了事件Action,它們也會看到同一個ActionCancelEventArgs對象。如果需要確定是哪個對象取消了事件,而且如果多個對象取消了事件,就要在ActionCancelEventArgs類中再包含某種基于列表的數據結構。
取消事件:
在與委托一起注冊的處理程序執行完之后,就可以查詢ActionCancelEventArgs對象,并且確定它是否被取消了。也就是下面代碼:
if (cancelEvent.Cancel) labelInfo.Text = cancelEvent.Message; else labelInfo.Text = busEntity.TimeString;
關于C#中怎么生成自定義事件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。