2013年9月17日 星期二

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


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;
        }
    }
}

*******************************************************************************************
利用委派進階叫用函式。
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

沒有留言:

張貼留言