解 自己关于 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));
}
解 自己关于 C# Button的Click事件的疑惑的更多相关文章
- Xamarin for android:为button设置click事件的几种方法
原文:Xamarin for android:为button设置click事件的几种方法 在Xamarin中一个最基础的事情,就是为一个button指定click事件处理方法,可是即使是这么一件事也有 ...
- Button的Click事件与js函数的两种不同顺序触发方式
先运行js.或者先运行Click事件,近期就遇到了这个问题,開始弄了两个button分别运行,那才叫一个蛋疼... 1.先运行js,再运行Button的Click函数 <asp:Button I ...
- Silverlight 后台利用代码触发 Button 的Click事件
页面上一个查询按钮,当用户点击 回车键 的时候 处罚查询按钮的onclick事件 public MainPage() { InitializeComponent(); this.KeyDown += ...
- 【原】相煎何太急——input的blur事件与button的click事件
先来一段引子,最近在写手机h5页面,主要是一些登陆注册方面的,最绕不开的就是表单元素. 我想实现的是:在输入框后边有一个删除图标,当输入东西的时候触发事件,显示删除图标,点击该图标会删除之前输入的内容 ...
- Silverlight中使用MVVM:DataGrid中触发Button的Click事件
方法1.使用RelativeSource向上查找DataContext中的命令,但是需要注意的是命令绑定需要写全 类似: DataContext.ReLoadCommand<Button Gri ...
- 在Button的click事件中引起客户端JavaScript
void action1_Execute(object sender, SimpleActionExecuteEventArgs e) { WebWindow.CurrentRequestWindow ...
- js动态绑定click事件时function传参问题
今天碰到了这样一个问题,我在javascript中动态创建了一个button, 然后我想给改button添加click事件,绑定的function想要传入一个变量参数, 一开始我想直接通过函数传参传进 ...
- Asp.Net回车键触发Button的OnClick事件解决方案
在aspx页面有textbox文本框,还有三个button按钮.启用textbox的TextChanged事件和button的click事件. 问题: 现在在textbox文本框输入完数据按“回车”后 ...
- Jquery/js引入的button的onclik事件只触发一次
目标描述 我要实现的是:通过监听button的click事件,从而通过ajax向servlet发送请求获取数据库中的数据,然后返回的页面,并要求局部刷新 一次页面的加载是html直接页面初始化本身的 ...
随机推荐
- 工商管理硕士(MBA)-北大国际MBA
工商管理硕士(MBA)-北大国际MBA [EMBA校友跨届晚会]不管风雨彩虹 我们永远在一起
- rollback的作用
#pragma mark - 以队列的形式添加 // 以队列的形式添加数据FMDB比较常用的添加方式 // FMDB不支持多个线程同时操作,所以一般以串行的方式实现相关操作 - (IBAction)i ...
- hdu4405概率dp入门
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 解析带有命名空间问题web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...
- sql substring charindex
substring(s1,int,int) 截取字符串,起始位置,截取个数,返回截取后的字符串 charindex(s1,s2)查找字符s1在s2中的位置.返回int位置 SELECT substri ...
- 【QT相关】QT+opencv环境配置
在qt msvc2010版软件中使用opencv2.4.9进行库函数配置.仅适用于windows下. INCLUDEPATH += $$PWD/../../../opencv/build/includ ...
- 生成pdf文件
- 编译原理Tiny语言的定义
Here is the definition for Tiny language The Tiny lexicon is as follows: Keywords: IF ELSE WRITE R ...
- OGG同构(ORACLE-ORACLE)、异构(ORACLE-MYSQL)同步配置及错误解析
环境:11.2.0.3(已安装数据库实例)+OEL5.7 192.168.1.55 zlm sid:zlm11g 192.168.1.60 zlm2 sid:zlm11g 一.安装软件,配置环境,创建 ...
- cocos2d-x游戏开发系列教程-超级玛丽01-前言
前言 上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实现,并以一些篇幅来详细讲述遇到的具体问题和具体的 ...