[C#] 使用 Delegate 於 WinForm 中傳遞與接收訊息

說明 委派(Delegate) 的運作方式,以在 WinForm 中該如何使用 Delegate 傳遞與接收訊息的方式為例。

前言


  說明 委派(Delegate) 的運作方式,以在 WinForm 中該如何使用 Delegate 傳遞與接收訊息的方式為例,當我們在多個視窗的情況下需要進行 A 視窗呼叫 B 視窗事件或是 B 視窗的值需要傳到 A 視窗的情況時,我們可以使用委派的方式處理這種訊息的傳送。

 

委派 Delegate


  Delegate 是什麼呢? 我們可以把 Delegate 當作一個容器,裡面存放的就是需要去呼叫的方法參考,要使用委派的話一般會搭配 事件(Event) 或 Invoke() 方法,其實我們每點擊一個按鈕的背後其實都是交由委派去決定要使用哪一個方法,.NET 是事件導向的程式語言,是透過觸發事件後再交由其指定的委派方法處理。

 

  實際開啟 *.Designer.cs 檔案就能夠發現那些 Click 事件都已經自動幫你加入了 EventHandler 委派,如下:

// 
// button1
// 
this.button1.Location = new System.Drawing.Point(118, 12);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(133, 23);
this.button1.TabIndex = 0;
this.button1.Text = "OpenFormRetrunValue";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);

 

  在 .NET 中所有的委派都是繼承 MulticastDelegate ,而 MulticastDelegate 則繼承自 Delegate ,所以我們可以在一個事件使用 += 上加入多個委派或使用 -= 刪除委派,如下:

button1.Click += new EventHandler(OtherHandler1);
button1.Click += new EventHandler(OtherHandler2);
button1.Click -= new EventHandler(OtherHandler2);

 

  委派的宣告方式如下,並且可視情況加入參數:

public delegate void MyDelegate(string str);

 

  宣告好委派後,就必須產生委派指向的對應方法,並且將此方法傳入 Delegate 中,如下:

MyDelegate myDelegate = new MyDelegate(ShowMsg);

private void ShowMsg(string pMsg)
{
    MessageBox.Show(pMsg);
}

 

  最後,只需要呼叫 Invoke() 方法進行呼叫即可。

myDelegate.Invoke("Hello");

 

 

讓 A 視窗與 B 視窗傳遞資料


  基本的委派使用方式看完後,接下來就來使用委派讓 A 、 B 視窗透過委派來傳遞參數,在這裡舉兩個例子

  1.  A 視窗開啟一個 B 視窗,並且透過 B 視窗的按鈕事件將直傳回 A 視窗接收
  2.  A 視窗的值帶入新開啟的 B 視窗中顯示。

 

範例一: B 回傳 A

  首先要先在 B 視窗宣告一個委派供存放之後要呼叫的方法的指標

public delegate void ReturnValueDelegate(string pValue);

 

  接著繼續在 B 視窗宣告一個回調的事件

public event ReturnValueDelegate ReturnValueCallback;

 

  最後在 B 視窗我們要透過一個按鈕的觸發呼叫回調的事件並將要回傳的參數傳入

private void button1_Click(object sender, EventArgs e)
{
    ReturnValueCallback(textBox1.Text);
}

 

  在 B 視窗中完成回調的設定後接著就要在 A 視窗中連結 B 視窗的事件,先加入一個回調的方法,請注意傳入的參數型態與個數必須要與當初宣告的委派一樣

private void SetReturnValueCallbackFun(string pValue)
{
    textBox1.Text = pValue;
}

 

  最後在 A 視窗開啟 B 視窗的事件中綁定指定的委派事件,傳入事件觸發後委派所要回調的方法

private void button1_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    frm2.ReturnValueCallback += new Form2.ReturnValueDelegate(this.SetReturnValueCallbackFun);
    frm2.ShowDialog();
}

 

  現在可以看看執行結果

 

  在範例一中透過了 B 視窗委派回調呼叫了 A 視窗的 SetReturnValueCallbackFun 方法,將參數回傳回去 A 視窗。

 

範例二: A 傳入 B

  首先要先在 A 視窗宣告一個委派供存放之後要呼叫的方法的指標

public delegate void SendValueDelegate(string pValue);

 

  接著繼續在 A 視窗宣告一個回調的事件

public event SendValueDelegate SendValueCallback;

 

  跳到 B 視窗,在 B 視窗中加入一個接收傳入參數的方法,讓 SendValueDelegate 委派指向此方法

public void ReceiveValueCallbackFun(string pValue)
{
    textBox1.Text = pValue;
}

 

  最後在 A 視窗按鈕點擊開啟 B 視窗的事件中,綁定此回調事件指向 B 視窗的 ReceiveValueCallbackFun 方法,在調用此回調事件傳入參數

private void button2_Click(object sender, EventArgs e)
{
    Form3 frm3 = new Form3();
    this.SendValueCallback += new SendValueDelegate(frm3.ReceiveValueCallbackFun);
    this.SendValueCallback(textBox2.Text);
    frm3.ShowDialog();
}

 

  看看執行結果

 

  在範例二中,一樣透過了委派將參數從 A 視窗傳遞到了 B 視窗,當然除了傳遞傳送的用途外也可能作為其他事件觸發之用,在 WinForm  中也能使用委派取帶全域變數的使用,以上就是一個委派與事件的使用範例。

 

範例程式碼


TWinFormDelegate.rar

 

參考資料


一般型別系統中的委派

Delegate 類別

事件 (C# 程式設計手冊)

EventHandler 委派

Using Delegates to Communication Between Windows Forms

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)