1. 程式人生 > >C#委託學習:委託實現窗體之間簡單傳值

C#委託學習:委託實現窗體之間簡單傳值

實現功能描述:

從窗體點選按鈕,並記錄點選次數,將點選的次數傳遞給主窗體展示。

UI設計:

主窗體:拖放兩個Label:label1和lblCounter,label1的Text屬性設定為“從窗體被點選次數:”,lblCounter的Text屬性設定為“0”。從窗體:拖放一個Button:btnAddOne,Dock屬性設定為“Fill”。

 

功能實現:

【1】宣告委託

    /// <summary>
    /// 【1】宣告委託
    /// </summary>
    /// <param name="counter"></param>
    public delegate void AddOneDelegate(string counter);

【2】定義一個實際委託呼叫的方法,結構和被呼叫的委託一致

        /// <summary>
        /// 【2】定義一個實際委託呼叫的方法,結構和被呼叫的委託一致
        /// </summary>
        /// <param name="counter"></param>
        private void SetValueToUI(string counter)
        {
            lblCounter.Text = counter;
        }

【3】定義一個委託變數,並將實際執行的方法繫結在一起

        public FrmOther(AddOneDelegate addone)
        {
            InitializeComponent();
            //【3】定義一個委託變數,並將實際執行的方法繫結在一起
            this.addOne = addone;
        }   

    
        /// <summary>
        /// 【3】定義一個委託變數
        /// </summary>
        private AddOneDelegate addOne;

【4】呼叫

        /// <summary>
        /// 點我按鈕
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAddOne_Click(object sender, EventArgs e)
        {
            counter++;
            //【4】呼叫
            this.addOne.Invoke(counter.ToString());
        }

在FrmOther中定義計數器counter,點選的時候,記錄一次。並將記錄的值通過委託呼叫的方式傳遞給主窗體。

        /// <summary>
        /// 計數器
        /// </summary>
        private int counter = 0;

修改FrmOther建構函式的定義,新增一個AddOneDelegate委託引數,並將引數賦值給委託變數

        public FrmOther(AddOneDelegate addone)
        {
            InitializeComponent();
            //【3】定義一個委託變數,並將實際執行的方法繫結在一起
            this.addOne = addone;
        }  

FrmMain窗體在載入的時候,新建一個從窗體FrmOther,並將UI展示的方法例項傳給從窗體。

        public FrmMain()
        {
            InitializeComponent();
            FrmOther objFrm = new FrmOther(SetValueToUI);
            objFrm.Show();
        }

 

完整原始碼

///-------------------------------------------------------------------------------------------------------
/// Project:使用委託實現窗體間簡單通訊
/// Description:主窗體:委託宣告和定義委託實際執行的方法
/// Author:Mef
/// Source:Mef Studio
/// Date:2018-11-27
///-------------------------------------------------------------------------------------------------------

using System.Windows.Forms;

namespace PassingValueWindows
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
            FrmOther objFrm = new FrmOther(SetValueToUI);
            objFrm.Show();
        }

        
        /// <summary>
        /// 【2】定義一個實際委託呼叫的方法,結構和被呼叫的委託一致
        /// </summary>
        /// <param name="counter"></param>
        private void SetValueToUI(string counter)
        {
            lblCounter.Text = counter;
        }
    }

    /// <summary>
    /// 【1】宣告委託
    /// </summary>
    /// <param name="counter"></param>
    public delegate void AddOneDelegate(string counter);
}
///-------------------------------------------------------------------------------------------------------
/// Project:使用委託實現窗體間簡單通訊
/// Description:從窗體:委託變數和實際方法的繫結、呼叫
/// Author:Mef
/// Source:Mef Studio
/// Date:2018-11-27
///-------------------------------------------------------------------------------------------------------

using System;
using System.Windows.Forms;

namespace PassingValueWindows
{
    public partial class FrmOther : Form
    {
        public FrmOther(AddOneDelegate addone)
        {
            InitializeComponent();
            //【3】定義一個委託變數,並將實際執行的方法繫結在一起
            this.addOne = addone;
        }

        /// <summary>
        /// 計數器
        /// </summary>
        private int counter = 0;

        /// <summary>
        /// 點我按鈕
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAddOne_Click(object sender, EventArgs e)
        {
            counter++;
            //【4】呼叫
            this.addOne.Invoke(counter.ToString());
        }

        /// <summary>
        /// 【3】定義一個委託變數
        /// </summary>
        private AddOneDelegate addOne;
    }
}

實現演示

為點選之前,

點選多次之後,

Over

每次記錄一小步...點點滴滴人生路...