解 自己关于 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));
    }
时间: 2024-10-16 13:57:16

解 自己关于 C# Button的Click事件的疑惑的相关文章

Button的Click事件与js函数的两种不同顺序触发方式

先执行js,或者先执行Click事件,最近就遇到了这个问题,开始弄了两个按钮分别执行,那才叫一个蛋疼... 1.先执行js,再执行Button的Click函数 <asp:Button ID="btn_delete" runat="server" Text="提交" onclick="button1_Click"/> 前台js为 <script language="javascript"&g

【原】相煎何太急——input的blur事件与button的click事件

先来一段引子,最近在写手机h5页面,主要是一些登陆注册方面的,最绕不开的就是表单元素. 我想实现的是:在输入框后边有一个删除图标,当输入东西的时候触发事件,显示删除图标,点击该图标会删除之前输入的内容,离开输入框,该图标消失. <div class="wrapper"> <div class="count"> <label for="person">手机号</label> <input id=

在Button的click事件中引起客户端JavaScript

void action1_Execute(object sender, SimpleActionExecuteEventArgs e) { WebWindow.CurrentRequestWindow.RegisterClientScript("test", "alert('test');"); }

从Listview与Button点击事件冲突看安卓点击事件分发机制

题目有点长.其实实现Listview的时候大家都可能会碰到这样的一个问题,那就是Listview的OnItemClickListener点击事件与Button(或者checkbox)的touch(或者click)事件冲突的问题. 声明一下,非常感谢郭大师的这篇blog: http://blog.csdn.net/guolin_blog/article/details/9097463 原理参考了这篇blog,事实上也是本人功力不够不能阅读源码的缺陷啊. 下面说下自己的解决步骤: 1)首先先set一

js动态绑定click事件时function传参问题

今天碰到了这样一个问题,我在javascript中动态创建了一个button, 然后我想给改button添加click事件,绑定的function想要传入一个变量参数, 一开始我想直接通过函数传参传进来,然而不知道为什么,click事件无法正常响应, 最后发现可以这么做,将需要传入的参数加入button的属性中,然后通过getAttribute()获得: 1 function add_book_panel(infor){ 2 //在这个函数中进行DOM元素操作,需要传入参数infor 3 - 4

WPF TreeviewItem Click 事件

[转载]WPF TreeviewItem Click 事件 标签:              C#WPFTreeviewItemClickPreviewMouseUp .embody { padding: 10px 10px 10px; margin: 0 -20px; border-bottom: solid 1px #ededed } .embody_b { margin: 0; padding: 10px 0 } .embody .embody_t,.embody .embody_c {

Asp.Net回车键触发Button的OnClick事件解决方案

在aspx页面有textbox文本框,还有三个button按钮.启用textbox的TextChanged事件和button的click事件. 问题: 现在在textbox文本框输入完数据按“回车”后,会触发TextChanged事件,但同时还会触发该页面第一个button按钮的Click事件. 解决方法一: 当在文本框中敲回车的时候,表单提交.因为在.net中一个Page只有一个form表单.所以也就有一个Sumbit事件. 当UseSubmitBehavior的属性是True的时候,表单的提

jquery的click事件对象试解

在写这篇文档的时候,我并没有深入的去了解jquery的事件对象是什么样的构造,不过以我以往的经验,相信能说道说道,并且可能有百分之八十是正确的,所以我并不建议这篇文档具备一定的权威性,不过可以当成饭后茶点,稍微品味一番,看看我是如何理解这个对象的.当然这之前我肯定是了解了js原生的事件对象,否则也不会突然想发表一篇jquery的. 我们一般通过访问click事件的事件处理函数的第一个参数来访问这个事件对象,也就是人们常说的event对象,下面来看一下javascript原生的事件对象(chrom

jquery中click事件重复绑定问题

在最近的项目中遇到这样一个问题: 从心愿单中删除产品,1.如果直接确定删除,则删除成功,2.如果先取消删除,再次点击再确认删除,则会出现问题,测试发现: 对未来元素(类名为deleteFav的对象)绑定click事件中,如果function中还包含有元素(简称A)的click事件,在点击两次删除按钮时会出现A 元素的click事件重复绑定的情况 $("body").on("click",".deleteFav",function(){//点击删除