其他分享
首页 > 其他分享> > Button控件Click和OnClick不的不说的故事

Button控件Click和OnClick不的不说的故事

作者:互联网

原文链接:http://www.cnblogs.com/liuxun/archive/2011/08/02/2124413.html

用Reflector打开System.Web查看Button类的OnClick,代码如下:

protected virtual void OnClick(EventArgs e)
{
EventHandler handler = (EventHandler) base.Events[EventClick];
if (handler != null)
{
handler(this, e);
}
}

Click,代码如下:

[WebCategory("Action"), WebSysDescription("Button_OnClick")]
public event EventHandler Click
{
add
{
base.Events.AddHandler(EventClick, value);
}
remove
{
base.Events.RemoveHandler(EventClick, value);
}
}

这里很明显可以看出来Click是一个事件,而OnClick是一个受保护的虚方法,是用来调用Click事件的。

注册Button控件的Click事件一般有两种方法,第一种在前台注册:

<asp:Button ID="Button1" OnClick="Button1_Click" runat="server" Text="Button" />

第二种在后台注册:

protected void Page_Load(object sender, EventArgs e)
{
Button1.Click += new EventHandler(Button1_Click);
}

void Button1_Click(object sender, EventArgs e)
{
//Do something
}

  这里,问题就来了,根据前面的了解,OnClick是一个方法,是不可能在前台被赋值的。带着疑惑,翻了翻MSDN,找到一段关于前台注册事件的文字(查看原文):

Web 窗体应用程序开发人员可以按照所示以声明方式处理事件,而不必直接使用委托。ASP.NET 页框架生成创建 EventHandler 实例的代码,EventHandler 引用 Button_Click 并将此委托实例添加到 Button 实例的 Click 事件。

只看这句话还是有点模糊,其实答案就在VS里面,如图所示,

这个前台的OnClick不是方法而是一个事件,它和Button类里面那个OnClick不是同一个东西,这种注册事件的写法是在页面设计视图的一种简洁写法。


个人愚见,欢迎指正。

转载于:https://www.cnblogs.com/liuxun/archive/2011/08/02/2124413.html

标签:EventHandler,控件,Button,事件,OnClick,Click,前台
来源: https://blog.csdn.net/weixin_30248399/article/details/99954182