欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#如何在自定義事件里傳遞自定義數(shù)據(jù)

 更新時(shí)間:2024年12月25日 10:06:46   作者:dotNet工控上位機(jī)  
相信很多小伙伴都知道傳值的一些方式,比如構(gòu)造方法傳值,屬性傳值等,這篇文章主要來給大家分享的另一種方式,通過自定義事件來傳值,感興趣的可以了解下

相信很多小伙伴都知道傳值的一些方式,比如構(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#清除字符串內(nèi)空格的方法

    C#清除字符串內(nèi)空格的方法

    這篇文章主要介紹了C#清除字符串內(nèi)空格的方法,是C#操作字符串非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法

    C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法,涉及C#桌面程序設(shè)計(jì)中時(shí)間操作的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Unity接入百度AI實(shí)現(xiàn)通用物體和場景識(shí)別

    Unity接入百度AI實(shí)現(xiàn)通用物體和場景識(shí)別

    這篇文章主要介紹了在Unity中接入百度AI接口,從而實(shí)現(xiàn)通用物體和場景的識(shí)別,其中接口返回大類及細(xì)分類的名稱,并支持獲取識(shí)別結(jié)果對(duì)應(yīng)的百科信息。感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • C#實(shí)現(xiàn)的微信網(wǎng)頁授權(quán)操作邏輯封裝示例

    C#實(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-10
  • C#實(shí)現(xiàn)繪制隨機(jī)噪點(diǎn)和直線

    C#實(shí)現(xiàn)繪制隨機(jī)噪點(diǎn)和直線

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)繪制隨機(jī)噪點(diǎn)和直線,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C#實(shí)現(xiàn)影院售票系統(tǒng)

    C#實(shí)現(xiàn)影院售票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)影院售票系統(tǒng),解析了售票系統(tǒng)的難點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • c# 9.0新特性nint和Pattern matching的使用方法

    c# 9.0新特性nint和Pattern matching的使用方法

    這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細(xì)致,幫助你更好的學(xué)習(xí)c# 9.0,有需求的朋友可以參考下
    2020-06-06
  • C#中WPF內(nèi)存回收與釋放LierdaCracker的實(shí)現(xiàn)

    C#中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-07
  • C#實(shí)現(xiàn)數(shù)字字符串左補(bǔ)零的六種方式技巧

    C#實(shí)現(xiàn)數(shù)字字符串左補(bǔ)零的六種方式技巧

    在編程旅程中,常常會(huì)遇到需要將數(shù)字字符串左補(bǔ)齊 0 的情況,這種格式化需求在實(shí)際開發(fā)中相當(dāng)普遍,在 C# 中,實(shí)現(xiàn)數(shù)字字符串左補(bǔ)齊 0 主要有這 6 種方法,我們一起來看看吧,需要的朋友可以參考下
    2024-12-12
  • C#中PuppeteerSharp庫的應(yīng)用詳解

    C#中PuppeteerSharp庫的應(yīng)用詳解

    PuppeteerSharp是一個(gè)針對(duì)Google Chrome瀏覽器的高級(jí)API庫,這篇文章主要為大家詳細(xì)介紹了PuppeteerSharp庫在C#中的具體應(yīng)用,需要的小伙伴可以了解下
    2024-01-01

最新評(píng)論