上次以鴻門宴的例子寫了一篇名爲《分分鐘用上C#中的委託和事件》的博文,旨在幫助C#初學者邁過委託和事件這道坎,可以用最快的速度掌握如何使用它們。若是以爲意猶未盡,或者仍然不知如何在實際應用中使用它們,那麼,這篇窗體篇,將在Winform場景中,用最簡潔的方式,幫助你們真正用上C#中的委託和事件。html
今天,我們不講場景,直接上真實的例子!函數
委託和事件,在Winform中最有表明性的應用,就是,一個窗體A發生某件事情的時候,其餘窗體若是訂閱了窗體A的某個事件,就會按照各自的方式,執行相關操做。this
先上最終結果:spa
夠簡單吧。主窗體FormMain一共三個控件:btNew(Button, 新建窗體), txMsg(TextBox), btSend(Button, 發送指令);子窗體FormSub就一個有效控件:txExecute(TextBox)code
要實現的功能是:在主窗體中,每單擊一次「新建窗體」按鈕,就會動態新建一個子窗體,子窗體的Text爲"Form"+生成順序。此功能與委託和事件無關啊。在主窗體中單擊「發送指令」按鈕,子窗體會接收主窗體中txMsg中的指令,並以各自的方式執行指令。爲簡化起見,子窗體的執行方式爲,在txMsg前加上各自的生成順序,而後顯示。orm
就這麼簡單的功能,我們就能完全弄清楚在Winform中使用委託和事件的方法啦~htm
先排除干擾,在Winform工程中,拖拽生成FormMain和FormSub窗體及其控件,並編寫主窗體中新建窗體按鈕的點擊事件,生成子窗體,並動態設置子窗體的Text屬性(若這個不會,此文並不適合你,請先去看入門書籍。)此處略去若干字。。。。。。blog
下面將關鍵點:事件
還記得鴻門宴的例子嗎?要子窗體(部下)遵從主窗體(首領)的命令,應該在主窗體中按照規則寫委託和事件:get
public delegate void SendEventHandler(string msg); public event SendEventHandler SendEvent;
而後,在主窗體的「發送指令」按鈕事件中,直接調用事件。那麼,全部訂閱了該事件的子窗體,都會各自執行相關操做。
固然,子窗體中須要聲明一個主窗體,並在子窗體的構造函數中,須要帶上主窗體做爲形參,用該形參來實例化聲明的主窗體(依然參考鴻門宴的例子,部下心中要有首領)
這個例子實在太簡單了。下面直接上代碼。對於弄懂了鴻門宴例子的朋友們,應該一看就懂。
FormMain.cs 代碼以下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace FormEventExample { public delegate void SendEventHandler(string msg); public partial class FormMain : Form { public event SendEventHandler SendEvent; int num = 0; public FormMain() { InitializeComponent(); } private void btNew_Click(object sender, EventArgs e) { FormSub formSub = new FormSub(this, ++num); formSub.Show(); } private void btSend_Click(object sender, EventArgs e) { if (this.SendEvent!=null) { this.SendEvent(txMsg.Text); } } } }
FormSub.cs 代碼以下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace FormEventExample { public partial class FormSub : Form { FormMain formMain; int num; public FormSub(FormMain formMain, int num) { InitializeComponent(); this.formMain = formMain; this.num = num; this.Text = "Form" + num; this.formMain.SendEvent += new SendEventHandler(formMain_SendEvent); } void formMain_SendEvent(string msg) { txExecute.Text = this.num.ToString() + ":" + msg; } } }
各個控件的拖放,見本文開頭的「最終結果」,我已將控件的Name寫在那三張截圖中。
剩下的事情,就是你們本身領悟,舉一反三了。在較大的Winform項目中,要用好委託和事件,也不是那麼容易的。有時,還須要在自定義類中用上委託和事件,做爲窗體間交互的紐帶。