首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0017. 兩個WindowsForm 相互溝通傳值的方法 - 使用委派

日期:2018年 09月 15日

標籤: C# Asp.NET Framework Windows Forms

摘要:C# 學習筆記


情境:說明兩個From.cs的檔案如何相互溝通,並且傳直到另一個Form上
基本介紹:本篇分為3大部分。
範例檔案下載:下載
第一部分:兩個Form的程式專案結構與展示
第二部分:代碼解釋-使用Delegate (委派)的方式
第三部分:代碼解釋-依照第二部分簡化為Action (另個語法糖委派)的方式




第一部分: 程式結構與展示

Step 1: 專案的結構,有Form1.cs 與 Form2.cs兩個檔案



Step 2: 執行程式後,預期有Form1 與 Form2 的畫面



Step 3: 頁面操作

當點擊Form2的按鈕時,可以將值傳給Form1 字串 => “123456”


第二部分:代碼解釋-使用Delegate (委派)的方式

Step 1: Form1.cs 的完整代碼如下,可參閱裡面註解的說明:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    //1. 宣告Form2的物件
    Form2 ReturnCallback = new Form2();

    //4. 再載入時,將變數ReturnCallback的ReturnCallback 函式掛載Form1中的韓函式 Data()
    private void Form1_Load(object sender, EventArgs e)
    {
        //讓MyMailWork掛載事件回傳Identifier的事件
        ReturnCallback.ReturnCallback += new Form2.ReturnDelegate(this.Data);
    }
    //3. 點擊Form1上的 "點擊新增Form2" 按鈕
    private void button1_Click(object sender, EventArgs e)
    {
        ReturnCallback.Show();
    }
    //2. 在Form1建立得到Form2的回傳值得Function
    private void Data(string GetStream)
    {
        //將傳回的字串放進Form1上的文字顯示
        this.label1.Text = $@"接收到的值:""{GetStream}""";
    }
}



Step 2: Form2.cs 的完整代碼如下,可參閱裡面註解的說明:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    //1. 建立Form2中的委派物件宣告
    public delegate void ReturnDelegate(string Stream);
    
    //2. 接著建立此宣告的變數,提供回傳給主類別叫用
    public event ReturnDelegate ReturnCallback;
    //3. 點擊Form1上的 "點擊新增Form2" 按鈕
    private void button1_Click(object sender, EventArgs e)
    {
        //將Form2上的文字,透過委派傳給Form1
        ReturnCallback(this.textBox1.Text);
    }
}



第三部分:代碼解釋-依照第二部分簡化為Action (另個語法糖委派)的方式

Step 1: 簡化後的 Form1.cs 的完整代碼如下,有標記數字的是異動的地方:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    //宣告Form2的物件
    Form2 ReturnCallback = new Form2();

    //再載入時,將變數ReturnCallback的ReturnCallback 函式掛載Form1中的韓函式 Data()
    private void Form1_Load(object sender, EventArgs e)
    {
        //1. 改成Action的呼叫
        ReturnCallback.ConvertMethod += Data;
    }

    //點擊Form1上的 "點擊新增Form2" 按鈕
    private void button1_Click(object sender, EventArgs e)
    {
        ReturnCallback.Show();
    }

    //在Form1建立得到Form2的回傳值得Function
    private void Data(string GetStream)
    {
        //將傳回的字串放進Form1上的文字顯示
        this.label1.Text = $@"接收到的值:""{GetStream}""";
    }
}



Step 2: Form2.cs 的完整代碼如下,有標記數字的是異動的地方:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    //1. 建立Action的變數,Action<string> 表示傳入參數為(string paramater1)
    public Action<string> ConvertMethod;

    //點擊Form1上的 "點擊新增Form2" 按鈕
    private void button1_Click(object sender, EventArgs e)
    {
        //2. 將Form2上的文字,透過委派傳給Form1
        ConvertMethod(this.textBox1.Text);
    }
}