中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么生成自定義事件

發布時間:2021-07-07 16:03:12 來源:億速云 閱讀:609 作者:Leah 欄目:編程語言

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#中怎么生成自定義事件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红安县| 花垣县| 遂昌县| 浦城县| 道真| 辽宁省| 乌苏市| 阳东县| 山西省| 洪雅县| 巴塘县| 特克斯县| 越西县| 教育| 莎车县| 启东市| 珲春市| 稻城县| 辉县市| 淮阳县| 萝北县| 台湾省| 涪陵区| 泌阳县| 枣强县| 遵义县| 旌德县| 彭水| 颍上县| 和政县| 柘城县| 左云县| 江北区| 兴隆县| 西林县| 青龙| 嘉兴市| 泸州市| 屏东县| 东乌珠穆沁旗| 新宁县|