解 自己关于 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));
}
上一篇:Linux / UNIX create soft link with ln command


下一篇:关于struts2 Could not find action or result错误