• 解 自己关于 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));
        }
  • 相关阅读:
    1657: [Usaco2006 Mar]Mooo 奶牛的歌声
    1610: [Usaco2008 Feb]Line连线游戏
    1660: [Usaco2006 Nov]Bad Hair Day 乱发节
    bzoj1207 [HNOI2004]打鼹鼠
    bzoj1046 [HAOI2007]上升序列
    bzoj3594 [Scoi2014]方伯伯的玉米田
    bzoj1878 [SDOI2009]HH的项链
    bzoj1293 [SCOI2009]生日礼物
    bzoj3211 花神游历各国
    bzoj3038 上帝造题的七分钟2
  • 原文地址:https://www.cnblogs.com/LJP-JumpAndFly/p/4694893.html
Copyright © 2020-2023  润新知