前面几篇文章讲解了与利用
ASP.NET 2.0技术创建自定义服务器控件属性有关的内容。从本文开始,包括随后的几篇文章将探讨创建自定义服务器控件事件的方法。本文重点对实现控件事件的基本概念进行介绍,这些概念对于帮助开发人员为服务器控件创建事件有着重要意义。
1. 事件基本概念 事件是当有动作发生或者状态改变时,类发出的信息或者通知。通常情况下,状态的发生或者改变由用户界面动作初始化,例如,单击按钮,或者由于其他的
程序逻辑引起。产生事件的类或者说发送通知的类叫做事件源sender,接收事件的类叫做事件接收者receiver。二者之间通过委托(delegate)实现关联。下面列举了一段常见的应用事件代码。
// 声明事件 ClickcustomControl.Click += new EventHandler(this.customControl1_Clicked); // 实现事件处理程序 customControl1_Clicked(object sender,EventArgs e){......} |
如上代码列举了服务器控件声明事件和实现事件处理程序的过程。由于这个过程非常简单,在此将不多做解释。另外,在实际应用中,开发人员通过为服务器控件实现事件机制,可以不采用以上的声明事件方式,而是在控件声明标记中仅仅列出"OnClick = customControl1_Clicked"即可。实际上,事件的声明和具体事件处理程序的实现都是比较简单易用的。然而,为控件实现事件机制却不是一件容易的事情。
从服务器控件开发的角度而言,
控件事件(仅指服务器端事件,而不包括客户端事件)可能来自两个方面:一是从基类继承的事件。例如,假设自定义控件从Button类继承,那么该控件将继承基类的Click事件。二是根据开发需求而创建的自定义事件。下面分别对这两种事件进行介绍。
2. 实现从基类继承的事件 众所周知,自定义服务器控件归根结底是从System.Web.UI.Control派生而来。该基类中已经定义了一些事件。因此,在创建服务器控件过程中,很可能需要重写以下继承的多个事件。
·DataBinding事件:该事件当服务器控件绑定到数据源时发生,其对应事件处理程序为OnDataBinding。
·Disposed事件:该事件当从内存释放服务器控件资源时发生,其对应的事件处理程序为OnDisposed。这是服务器控件生命周期的的最后阶段。
·Init事件:该事件当服务器控件初始化时发生,其对应的事件处理程序为OnInit。Init事件是控件生命周期的第一步。
·Load事件:该事件当服务器控件加载到Page对象中时发生,其对应的事件处理程序为OnLoad。
·PreRender事件:该事件在加载Control对象之后、呈现之前发生,其对应的事件处理程序为OnPreRender。
·Unload事件:该事件当服务器控件从内存中卸载时发生,其对应的事件处理程序为OnUnload。
以上内容针对Control基类的几个事件进行了简要说明。由于服务器控件均继承自Control基类(WebControl也是继承自Control类),因此,开发人员完全可以重写事件所对应的事件处理程序,这样便可以实现一些自定义内容。
若要实现自定义继承的
事件,需要重写从基类继承的受保护的OnEventName方法,而不必附加委托(EventHandler)。通常情况下,重写的事件处理程序应该调用基类的OnEventName方法,以确保调用附加到事件的委托(除非不想调用这些委托)。以下代码片段说明自定义控件重写继承的DataBinding事件的处理过程。
protected override void OnDataBinding(EventArgs e) { //添加一些自定义逻辑代码 //调用基类方法 base.OnDataBinding(e); } |
如上代码所示,在重写事件处理程序OnDataBinding过程中,首先需要添加一些根据应用需求而实现的自定义逻辑代码,然后,一定要牢记需调用基类方法。
以上内容对Control基类的事件和派生类重写对应事件处理程序的过程进行了介绍。需要读者注意的是,上文并非说明自定义服务器控件仅能够重写以上几个来自Control基类事件的事件处理程序。如果自定义控件继承自其他原本带有事件的基类,例如,Button、DataList等(归根到底,它们也是从Control基类继承),那么继承的事件处理程序仍然可以被重写,例如,继承自Button类的控件自然获得Click事件,并且可以重写OnClick事件处理程序。
查看本文来源