透過委派 (Delegate) 方式,取得對應的作用按鈕,引發相關的 Click 事件

2012040915:34

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test_WebForm._Default" %>

<html>
   <body>                 
      <form id="Form1"  runat="server">                       
      <asp:Button ID="Button1" runat="server" Text="Button1" CommandName="按鍵 1" /> 
      <asp:Button ID="Button2" runat="server" Text="Button2" CommandName="按鍵 2" />
      <br>
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>                            
      </form>                            
   </body>                   
</html>

 

Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Test_WebForm
{
    public partial class _Default : System.Web.UI.Page
    {
        #region 透過委派 (Delegate) 方式,取得對應的作用按鈕,引發相關的 Click 事件
        //委派宣告
        public delegate void ClickEventHandler(object sender, EventArgs e);

        protected void Button_Click(object sender, EventArgs e)
        {
            //判斷哪個鍵被按
            switch (((Button)sender).ID)
            {
                case "Button1":
                    Click(sender);
                    TextBox1.BackColor = System.Drawing.Color.SkyBlue;
                    break;
                case "Button2":
                    Click(sender);
                    TextBox1.BackColor = System.Drawing.Color.Yellow;
                    break;
            }
        }
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            Button1.Click += new EventHandler(Button_Click);
            Button2.Click += new EventHandler(Button_Click);
        }

        protected void Click(object sender)
        {
            TextBox1.Text = "You clicked the " + ((Button)sender).CommandName;
        }
    }
}

*******************************************************************************************

利用委派進階叫用函式。

[原創]Callback與Delegate原理

.NET 事件與委派詳論

1. 委派可以將方法當成參數來進行傳遞

委派宣告:
[public|private|proected] Delegate [void | 回傳資料型態] 委派名稱 ([參數群一]);

2. 委派是事件的基礎(event),可以利用委派來呼叫不同的事件,以便觸發其他控制項事件來完成互動性強大的應用程式。

事件宣告:
public event ClickEventHandler ClickEvent;
[存取修飾詞] event 委派方法 事件名稱 ;

3. Delegate方法,可用於向某個Class傳遞註冊過的方法(註冊的Method的參數必須和Delegate方法完全一致

4. VB已有WithEvents不使用委派也能達到觸發事件的功能,但在C#必須自己宣告委派才能使用事件,C#在使用事件還真麻煩呢。

 

如何使用委派傳遞方法

1.建立方法;一個有回傳值,一個沒有。

public int InstanceMethod(int a, int b)
{
     Console.WriteLine("Call InstanceMethod ");
     Console.WriteLine("First parametre is {0},second parametre is {1}", a, b);
     return 0;
}
     static public void StaticMethod()
{
     Console.WriteLine("Call Static Method");        
}

 

2.宣告委派;委派參數,需要與被呼叫的方法一樣,包含回傳型別。

private delegate void MyDelegate();
private delegate int MeDelegatePara(int a, int b);

3.引用委派(實體化),後指定方法

MyDelegate D = new MyDelegate(MyClass.StaticMethod);

4.呼叫函數

D.Invoke();

可省略成

D();

 

如何使用事件傳遞方法

1.建立事件函數

修飾詞最好使用protected virtual這樣子類別就可以直接覆寫事件觸發的定義

private void MyButton_Click(object sender, EventArgs e)
{
    Console.WriteLine("事件發生了喔");
}

2.委派宣告

public delegate void ClickEventHandler(object sender, EventArgs e);

 

3.創建MyBottom類別
4.宣告MyBottom的事件
5.建立MyButton成員方法
6.拋出事件,給所有相應者

//3.創建MyBottom類別
public class MyButton
{
    //4.宣告MyBottom的事件
    public event ClickEventHandler ClickEvent;
    //5.建立MyButton成員方法
    public void Click()
    {
        if (ClickEvent != null)
        {
            Console.WriteLine("事件開始");
            //6.拋出事件,給所有相應者
            ClickEvent(this, null);
        }
    }
}

7.引用類別實體化

public MyButton myButton = new MyButton();

8.事件實體化,註冊事件

myButton.ClickEvent += new ClickEventHandler(MyButton_Click);

9.使用方式

private void Form1_Load(object sender, EventArgs e)
{
    //引用
    Form1 form = new Form1();
    form.myButton.Click();
}
 
範例下載:C#.NET 委派事件用法.rar