问题描述
namespaceMyButton{[DefaultProperty("Text")][ToolboxData("<{0}:MyButtonrunat=server></{0}:MyButton>")]publicclassMyButton:WebControl,IPostBackEventHandler{privatestaticreadonlyobjectClickKey=newobject();publiceventEventHandlerClick//定义事件的委托{add{Events.AddHandler(ClickKey,value);}remove{Events.RemoveHandler(ClickKey,value);}}protectedvirtualvoidOnClick(EventArgse)//定义单击事件的处理程序{EventHandlerclickEventDelegate=(EventHandler)Events[ClickKey];if(clickEventDelegate!=null){clickEventDelegate(this,e);}}publicvoidRaisePostBackEvent(stringeventArgument)//处理回发事件{OnClick(newEventArgs());}protectedoverridevoidRenderContents(HtmlTextWriteroutput){output.Write("<INPUTTYPE=submitname="+this.UniqueID+"Value='这是自己定制的按钮!'/>");}}}
下面这一片代码有什么用呢publiceventEventHandlerClick//定义事件的委托{add{Events.AddHandler(ClickKey,value);}remove{Events.RemoveHandler(ClickKey,value);}}
解决方案
解决方案二:
类似get/set。
解决方案三:
事件是一个多播的委托链。你看到的Click+=EventHandler其实就是Click.Add(EventHandler)
解决方案四:
在功能上,它很你在类型中写这样的代码是等价的:publicEventHandlerClick;
然后客户程序就可以使用MyButton1.Click+=......;MyButton1.Click-=......;
方法来注册、撤销事件处理程序了。但是,系统类库中的控件普遍都有很多事件。假设平均每个控件有30个事件,假设一个窗口里有1000个控件,那么一个窗口里就有30000个事件对象。尽管客户程序没有向其注册事件处理程序,也要占用30000个事件对象的存储空间。为了少占用一点空间,也是因为.net一开始就是这样在它们内部推广的原因吧,它们不使用上面比较标准和简单的事件定义方法。而是在控件的父类中定了一个Events列表。这样,从其继承的子控件,每一个对象都会有一个Events列表。当客户程序没有向其注册事件事件处理程序,那么就不占用空间。注册了事件处理程序,相应的事件对象才会被加入Events列表中,占用空间。当然,每个控件的Events列表中的每个单元声明时都是父类EventHandler,而要有一个标记说明它是具体对应哪个具体事件,所以使用static的对象(比如对于Click事件就是ClickKey)来做为标记。这些static的对象在类型中创建,而不是在控件对象中创建。所以最终,当窗体上有很多控件时,这种机制可以少为事件预先分配许多空间。这是.net中控件的事件机制的一个基本知识。我们自己设计自定义控件,我倒是觉得不一定有必要学.net类库设计,使用简单标准的publiceventEventHandlerClick;
似乎也不会对程序性能和空间造成什么伤害。。
解决方案五:
第一个代码写错了,少写了一个event单词。参见最下边的一行。