C#中委托与事件的使用-以Winform中跨窗体传值为例
場(chǎng)景
委托(Delegate)
委托是對(duì)存有某個(gè)方法的引用的一種引用類型變量。
委托特別用于實(shí)現(xiàn)事件和回調(diào)方法。
聲明委托
public delegate int MyDelegate (string s);實(shí)例化委托
聲明了委托類型,委托對(duì)象必須使用new關(guān)鍵字來(lái)創(chuàng)建,且與一個(gè)特定的方法相關(guān)。
當(dāng)創(chuàng)建委托時(shí),傳遞到 new 語(yǔ)句的參數(shù)就像方法調(diào)用一樣書(shū)寫,但是不帶有參數(shù)。例如:
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen);示例代碼
using System;delegate int NumberChanger(int n); namespace DelegateAppl {class TestDelegate{static int num = 10;public static int AddNum(int p){num += p;return num;}public static int MultNum(int q){num *= q;return num;}public static int getNum(){return num;}static void Main(string[] args){// 創(chuàng)建委托實(shí)例NumberChanger nc1 = new NumberChanger(AddNum);NumberChanger nc2 = new NumberChanger(MultNum);// 使用委托對(duì)象調(diào)用方法nc1(25);Console.WriteLine("Value of Num: {0}", getNum());nc2(5);Console.WriteLine("Value of Num: {0}", getNum());Console.ReadKey();}} }事件
事件在類中聲明且生成,且通過(guò)使用同一個(gè)類或其他類中的委托與事件處理程序關(guān)聯(lián)。包含事件的類用于發(fā)布事件。這被稱為 發(fā)布器(publisher) 類。其他接受該事件的類被稱為 訂閱器(subscriber) 類。事件使用 發(fā)布-訂閱(publisher-subscriber) 模型。
發(fā)布器(publisher) 是一個(gè)包含事件和委托定義的對(duì)象。事件和委托之間的聯(lián)系也定義在這個(gè)對(duì)象中。發(fā)布器(publisher)類的對(duì)象調(diào)用這個(gè)事件,并通知其他的對(duì)象。
訂閱器(subscriber) 是一個(gè)接受事件并提供事件處理程序的對(duì)象。在發(fā)布器(publisher)類中的委托調(diào)用訂閱器(subscriber)類中的方法(事件處理程序)。
聲明事件
在類的內(nèi)部聲明事件嗎,首先必須先聲明該事件的委托類型。
public delegate void BoilerLogHandler(string status);然后聲明事件本身。
public event BoilerLogHandler BoilerEventLog;跨窗體傳值示例
效果
實(shí)現(xiàn)
首先在彈窗的窗體CurveCompare中聲明委托
?public delegate void ChangeTextDelegete(string s);然后基于此委托定義事件
?public static event ChangeTextDelegete changeBoxTextEvent;然后是按鈕的具體的點(diǎn)擊事件中的處理
?private void button1_Click(object sender, EventArgs e){string aa = "hello";if(changeBoxTextEvent != null){changeBoxTextEvent(aa);}}完整彈窗窗體代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace ZedGraphTest {public partial class CurveCompare : Form{//委托的定義public delegate void ChangeTextDelegete(string s);//事件聲明public static event ChangeTextDelegete changeBoxTextEvent;public CurveCompare(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string aa = "hello";if(changeBoxTextEvent != null){changeBoxTextEvent(aa);}}} }然后再到要改變值的窗體中。
在其初始化方法中
?CurveCompare.changeBoxTextEvent += new CurveCompare.ChangeTextDelegete(changeText);然后編寫改變值的方法
?public void changeText(string s){this.textBox1.Text = s;}Form1完整示例代碼
?public partial class Form1 : Form{public Form1(){InitializeComponent();CurveCompare.changeBoxTextEvent += new CurveCompare.ChangeTextDelegete(changeText);}public void changeText(string s){this.textBox1.Text = s;}?
總結(jié)
以上是生活随笔為你收集整理的C#中委托与事件的使用-以Winform中跨窗体传值为例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Winform中实现Excel导入、表格
- 下一篇: DevExpress的TextEdit限