分分鍾用上C#中的委托和事件之窗體篇


上次以鴻門宴的例子寫了一篇名為《分分鍾用上C#中的委托和事件》的博文,旨在幫助C#初學者邁過委托和事件這道坎,能夠用最快的速度掌握如何使用它們。如果覺得意猶未盡,或者仍然不知如何在實際應用中使用它們,那么,這篇窗體篇,將在Winform場景中,用最簡潔的方式,幫助大家真正用上C#中的委托和事件。

今天,咱們不講場景,直接上真實的例子!

委托和事件,在Winform中最有代表性的應用,就是,一個窗體A發生某件事情的時候,其他窗體如果訂閱了窗體A的某個事件,就會按照各自的方式,執行相關操作。

先上最終結果:

夠簡單吧。主窗體FormMain一共三個控件:btNew(Button, 新建窗體), txMsg(TextBox), btSend(Button, 發送指令);子窗體FormSub就一個有效控件:txExecute(TextBox)

要實現的功能是:在主窗體中,每單擊一次“新建窗體”按鈕,就會動態新建一個子窗體,子窗體的Text為"Form"+生成順序。此功能與委托和事件無關啊。在主窗體中單擊“發送指令”按鈕,子窗體會接收主窗體中txMsg中的指令,並以各自的方式執行指令。為簡化起見,子窗體的執行方式為,在txMsg前加上各自的生成順序,然后顯示。

就這么簡單的功能,咱們就能徹底弄清楚在Winform中使用委托和事件的方法啦~

先排除干擾,在Winform工程中,拖拽生成FormMain和FormSub窗體及其控件,並編寫主窗體中新建窗體按鈕的點擊事件,生成子窗體,並動態設置子窗體的Text屬性(若這個不會,此文並不適合你,請先去看入門書籍。)此處略去若干字。。。。。。

下面將關鍵點:

還記得鴻門宴的例子嗎?要子窗體(部下)聽從主窗體(首領)的命令,應該在主窗體中按照規則寫委托和事件:

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項目中,要用好委托和事件,也不是那么容易的。有時,還需要在自定義類中用上委托和事件,作為窗體間交互的紐帶。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM