• 解 自己关于 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));
        }
  • 相关阅读:
    c3p0、dbcp、proxool、BoneCP比较
    velocity的一些优化记录
    JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    Deployment failure on Tomcat 7.x. Could not copy all resources to
    Spring3.2.3+Quartz2.2.1 整合配置
    mysql批量insert速度超慢
    Fine Uploader + Spring3.2.2(Java+html5上传) SpringMVC+jquery-fineuploader 文件上传
    实现工资的按天统计(X:日期 Y:姓名)
    Java发邮件带附件(且重命名附件)
    微信小程序wx.switchTab传参问题
  • 原文地址:https://www.cnblogs.com/LJP-JumpAndFly/p/4694893.html
Copyright © 2020-2023  润新知