分分鐘用上C#中的委託和事件之窗體篇

上次以鴻門宴的例子寫了一篇名爲《分分鐘用上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項目中,要用好委託和事件,也不是那麼容易的。有時,還須要在自定義類中用上委託和事件,做爲窗體間交互的紐帶。

相關文章
相關標籤/搜索