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

用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不是同一个东西,这种注册事件的写法是在页面设计视图的一种简洁写法


个人愚见,欢迎指正。

posted @ 2011-08-02 00:01  Little Prince  阅读(1590)  评论(1编辑  收藏  举报