C#如何在自定義事件里傳遞自定義數(shù)據(jù)
相信很多小伙伴都知道傳值的一些方式,比如構(gòu)造方法傳值、屬性傳值、Tag傳值、委托傳值、窗體傳值等,今天給大家分享的一種方式,是通過自定義事件來傳值。
對于一般的系統(tǒng)事件,是有兩個參數(shù)的,一個是sender,一個是EventArgs,對于sender,我們可能用得還比較多一些,它表示這個事件的觸發(fā)者,一般指向的是一個控件,但是對于EventArgs,我們一般用得會比較少,今天分享的自定義事件傳值就是通過EventArgs來實現(xiàn)。
基礎(chǔ)篇
通過EventArgs來實現(xiàn)傳值,我們首先需要創(chuàng)建一個類,繼承EventArgs,我們可以將需要傳遞的數(shù)據(jù),直接在類里面定義成屬性,這里以傳遞一個布爾、一個浮點數(shù)為例,代碼如下所示:
public class MyEventArgs : EventArgs{ public bool BoolValue { get; set; } public float FloatValue { get; set; } }
然后我們創(chuàng)建一個類,類里面創(chuàng)建一個事件,并激發(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; }
我們在主窗體中,實例化類,并進行事件綁定,看看能不能獲取到傳遞的數(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()+";浮點值:" +args.FloatValue.ToString()); } }
運行結(jié)果如下所示:
進階篇
在上面知識掌握的基礎(chǔ)上,我們可以做進一步優(yōu)化,在定義事件時,可以不用EventHandler,可以自己定義參數(shù)來實現(xiàn),我們再創(chuàng)建一個類——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; }
這樣我們在事件處理中,就可以直接獲取屬性了,而不需要對EventArgs進行強制轉(zhuǎn)換,代碼如下:
private void T2 myEvent(object arg1, MyEventArgs arg2) { MessageBox.Show("布爾值:"+ arg2.BoolValue.ToString()+";浮點值:" + arg2.FloatValue.ToString()); }
高級篇
如果繼續(xù)深入的話,我們可以將傳遞的參數(shù)改成泛型,這樣就可以輕松傳遞單個參數(shù)了,對于多個參數(shù)的情形,我們可以使用對象,單一參數(shù)比較簡單,這里就不贅述了,主要針對對象傳遞進行說明,首先創(chuàng)建一個參數(shù)實體類,這里創(chuàng)建三個屬性,代碼如下:
///<summary> /// 傳遞參數(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)建一個類——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)用并進行事件處理,代碼如下:
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); }
運行結(jié)果如下:
到此這篇關(guān)于C#如何在自定義事件里傳遞自定義數(shù)據(jù)的文章就介紹到這了,更多相關(guān)C#自定義事件傳遞自定義數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實現(xiàn)的微信網(wǎng)頁授權(quán)操作邏輯封裝示例
這篇文章主要介紹了C#實現(xiàn)的微信網(wǎng)頁授權(quán)操作邏輯封裝,分析了微信網(wǎng)頁授權(quán)操作的原理、步驟并給出了C#實現(xiàn)的網(wǎng)頁授權(quán)操作邏輯封裝類,需要的朋友可以參考下2016-10-10c# 9.0新特性nint和Pattern matching的使用方法
這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細致,幫助你更好的學(xué)習(xí)c# 9.0,有需求的朋友可以參考下2020-06-06C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn)
本文主要介紹了C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C#實現(xiàn)數(shù)字字符串左補零的六種方式技巧
在編程旅程中,常常會遇到需要將數(shù)字字符串左補齊 0 的情況,這種格式化需求在實際開發(fā)中相當(dāng)普遍,在 C# 中,實現(xiàn)數(shù)字字符串左補齊 0 主要有這 6 種方法,我們一起來看看吧,需要的朋友可以參考下2024-12-12