解 自己關於 C# Button的Click事件的疑惑


先說說C#中事件的用法,從事件的用法中,我自己會產生一個疑惑

C#事件

    class Program
    {  
        static void Main(string[] args)
        {
            EventClass ec = new EventClass();
            ec.hd += new EventClass.HandleDelegate(ec_hd);
            string str = ec.OnClick("aaaaaaaaaaaaaaa");//我的困惑出現在這里
            Console.WriteLine(str);
            Console.ReadKey();
        }
        public static string ec_hd(string str)
        {
            return str;
        }
    }
    class EventClass
    {
        public delegate string HandleDelegate(string str);
        public event HandleDelegate hd;

        public string OnClick(string str)
        {
            return hd(str);
        }
    }
}

以前,Button對象添加事件,也就是btn.Click+=Button1_Click;這樣就完事了,但是不理解到底是誰調用了這個委托,也就是像上述代碼中“  string str = ec.OnClick("aaaaaaaaaaaaaaa");//我的困惑出現在這里 ”的這行。

通過反編譯工具,知道了這個是如何調用的,反編譯Button類就能看到,以下簡要說明:

以下是執行Click事件添加的代碼:

    // Events
    [WebCategory("Action"), WebSysDescription("Button_OnClick")]
    public event EventHandler Click
    {
        add
        {
            base.Events.AddHandler(EventClick, value);
        }
        remove
        {
            base.Events.RemoveHandler(EventClick, value);
        }
    }

這段代碼就是+=操作調用的代碼,將Click事件添加到Events集合中

關於Events集合,它是一個屬性,就返回一個events對象,這個events對象是EventHandlerList類型的,集合的鍵是object類型的,值當然就是EventHandle。

然后解惑的代碼如下:

  protected virtual void OnClick(EventArgs e)
    {
       //在事件集合中,返回Click事件對象,然后調用
        EventHandler handler = (EventHandler) base.Events[EventClick];
        if (handler != null)
        {
            handler(this, e);//這段代碼就是類似第一段代碼中的ec.OnClick("aaaaaaaaaaaaaaa");      
     }
  }

至於OnClick方法是如何調用的, 涉及到更深層的操作,比如按鈕是怎么點擊的,這些沒必要了解。

本文只是為了解決本人的一些疑惑。

但也給出調用OnClick的代碼:

 protected virtual void RaisePostBackEvent(string eventArgument)
    {
        base.ValidateEvent(this.UniqueID, eventArgument);
        if (this.CausesValidation)
        {
            this.Page.Validate(this.ValidationGroup);
        }
        this.OnClick(EventArgs.Empty);
        this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument));
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM