zoukankan      html  css  js  c++  java
  • 解 自己关于 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));
        }
  • 相关阅读:
    quartz 定时调度持久化数据库配置文件
    springboot项目下mvnw文件的作用
    mysql安装版卸载,解压版安装
    idea提示,格式化代码,清除不使用的包快捷键,maven自动导jar包
    JavaScript中call,apply,bind方法
    彻底理解js中this的指向
    Gradle系列之从init.gradle说起
    响应式网页设计简单入门
    开启MySQL远程访问权限 允许远程连接
    https原理
  • 原文地址:https://www.cnblogs.com/LJP-JumpAndFly/p/4694893.html
Copyright © 2011-2022 走看看