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不是同一个东西,这种注册事件的写法是在页面设计视图的一种简洁写法。
个人愚见,欢迎指正。