C#如何在自定義事件里傳遞自定義數(shù)據(jù)
相信很多小伙伴都知道傳值的一些方式,比如構(gòu)造方法傳值、屬性傳值、Tag傳值、委托傳值、窗體傳值等,今天給大家分享的一種方式,是通過自定義事件來傳值。
對(duì)于一般的系統(tǒng)事件,是有兩個(gè)參數(shù)的,一個(gè)是sender,一個(gè)是EventArgs,對(duì)于sender,我們可能用得還比較多一些,它表示這個(gè)事件的觸發(fā)者,一般指向的是一個(gè)控件,但是對(duì)于EventArgs,我們一般用得會(huì)比較少,今天分享的自定義事件傳值就是通過EventArgs來實(shí)現(xiàn)。
基礎(chǔ)篇
通過EventArgs來實(shí)現(xiàn)傳值,我們首先需要?jiǎng)?chuàng)建一個(gè)類,繼承EventArgs,我們可以將需要傳遞的數(shù)據(jù),直接在類里面定義成屬性,這里以傳遞一個(gè)布爾、一個(gè)浮點(diǎn)數(shù)為例,代碼如下所示:
public class MyEventArgs : EventArgs{ public bool BoolValue { get; set; } public float FloatValue { get; set; } }
然后我們創(chuàng)建一個(gè)類,類里面創(chuàng)建一個(gè)事件,并激發(fā)事件,這里傳遞的值為True和123.0,代碼如下:
public class Test{ public void AckEvent() { //激發(fā)事件 myEvent?.Invoke(this, new MyEventArgs() { BoolValue = true, FloatValue =123.0f }): } //創(chuàng)建事件 public event EventHandler myEvent; }
我們?cè)谥鞔绑w中,實(shí)例化類,并進(jìn)行事件綁定,看看能不能獲取到傳遞的數(shù)據(jù),代碼如下:
public partial class Form1 : Form { public Form1() { InitializeComponent(); t= new Test(); t.myEvent +=T myEvent; t.AckEvent(); } Test t; private void T_myEvent(object sender, EventArgs e) { MyEventArgs args = e as MyEventArgs; MessageBox.Show("布爾值:"+args.BoolValue.ToString()+";浮點(diǎn)值:" +args.FloatValue.ToString()); } }
運(yùn)行結(jié)果如下所示:
進(jìn)階篇
在上面知識(shí)掌握的基礎(chǔ)上,我們可以做進(jìn)一步優(yōu)化,在定義事件時(shí),可以不用EventHandler,可以自己定義參數(shù)來實(shí)現(xiàn),我們?cè)賱?chuàng)建一個(gè)類——Test2,代碼如下:
public class Test2 { public void AckEvent() { //激發(fā)事件 myEvent?.Invoke(this,new MyEventArgs() { BoolValue = true, FloatValue =123.0f }); } //創(chuàng)建事件 public event Action<object, MyEventArgs> myEvent; }
這樣我們?cè)谑录幚碇?,就可以直接獲取屬性了,而不需要對(duì)EventArgs進(jìn)行強(qiáng)制轉(zhuǎn)換,代碼如下:
private void T2 myEvent(object arg1, MyEventArgs arg2) { MessageBox.Show("布爾值:"+ arg2.BoolValue.ToString()+";浮點(diǎn)值:" + arg2.FloatValue.ToString()); }
高級(jí)篇
如果繼續(xù)深入的話,我們可以將傳遞的參數(shù)改成泛型,這樣就可以輕松傳遞單個(gè)參數(shù)了,對(duì)于多個(gè)參數(shù)的情形,我們可以使用對(duì)象,單一參數(shù)比較簡單,這里就不贅述了,主要針對(duì)對(duì)象傳遞進(jìn)行說明,首先創(chuàng)建一個(gè)參數(shù)實(shí)體類,這里創(chuàng)建三個(gè)屬性,代碼如下:
///<summary> /// 傳遞參數(shù)實(shí)體類 /// </summary> public class Param { public string Param1 { get; set; } public string Param2 { get; set; } public string Param3 { get; set; } }
創(chuàng)建事件參數(shù)類,代碼如下:
///<summary> /// 事件參數(shù)類 /// </summary> /// <typeparam name="T"></typeparam> public class MyTEventArgs<T>:EventArgs { public MyTEventArgs(T t) { Param =t; } public T Param; }
再創(chuàng)建一個(gè)類——Test3,代碼如下:
public class Test3 { public void AckEvent() { //激發(fā)事件 myEvent?.Invoke(this, new MyTEventArgs<Param>(new Param() { Param1 = "1", Param2 = "2", Param3 = "3", })); } //創(chuàng)建事件 public event Action<object, MyTEventArgs<Param>> myEvent; }
主窗體調(diào)用并進(jìn)行事件處理,代碼如下:
public Form() { InitializeComponent(); t3 = new Test3(); t3.myEvent +=T3 myEvent; t3.AckEvent(); } private void T3_myEvent(object arg1, MyTEventArgs<Param> arg2) { var data = arg2.Param; MessageBox.Show("值1:"+ data.Param1 +";值2:"+ data.Param2 + ";值3:"+ data.Param3); }
運(yùn)行結(jié)果如下:
到此這篇關(guān)于C#如何在自定義事件里傳遞自定義數(shù)據(jù)的文章就介紹到這了,更多相關(guān)C#自定義事件傳遞自定義數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法,涉及C#桌面程序設(shè)計(jì)中時(shí)間操作的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Unity接入百度AI實(shí)現(xiàn)通用物體和場景識(shí)別
這篇文章主要介紹了在Unity中接入百度AI接口,從而實(shí)現(xiàn)通用物體和場景的識(shí)別,其中接口返回大類及細(xì)分類的名稱,并支持獲取識(shí)別結(jié)果對(duì)應(yīng)的百科信息。感興趣的可以學(xué)習(xí)一下2022-01-01C#實(shí)現(xiàn)的微信網(wǎng)頁授權(quán)操作邏輯封裝示例
這篇文章主要介紹了C#實(shí)現(xiàn)的微信網(wǎng)頁授權(quán)操作邏輯封裝,分析了微信網(wǎng)頁授權(quán)操作的原理、步驟并給出了C#實(shí)現(xiàn)的網(wǎng)頁授權(quán)操作邏輯封裝類,需要的朋友可以參考下2016-10-10C#實(shí)現(xiàn)繪制隨機(jī)噪點(diǎn)和直線
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)繪制隨機(jī)噪點(diǎn)和直線,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01c# 9.0新特性nint和Pattern matching的使用方法
這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細(xì)致,幫助你更好的學(xué)習(xí)c# 9.0,有需求的朋友可以參考下2020-06-06C#中WPF內(nèi)存回收與釋放LierdaCracker的實(shí)現(xiàn)
本文主要介紹了C#中WPF內(nèi)存回收與釋放LierdaCracker的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C#實(shí)現(xiàn)數(shù)字字符串左補(bǔ)零的六種方式技巧
在編程旅程中,常常會(huì)遇到需要將數(shù)字字符串左補(bǔ)齊 0 的情況,這種格式化需求在實(shí)際開發(fā)中相當(dāng)普遍,在 C# 中,實(shí)現(xiàn)數(shù)字字符串左補(bǔ)齊 0 主要有這 6 種方法,我們一起來看看吧,需要的朋友可以參考下2024-12-12