前言:
前面讲到了复合控件的视图,今天将进入其复合控件的事件机制世界
本节将讲述:
- 为什么要事件冒泡(事件上传)
- 什么是复合控件事件冒泡(事件上传)
- 复合控件事件的实现原理
- 实现事件冒泡(事件上传)的步骤。
正文:
(一)为什么要事件上传
复合控件中包含子控件,这就使得复合控件的事件处理变得复杂起来。显而易见,在复合控件的事件实现过程中,需要面临的最大问题是:由于不允许开发人员直接访问子控件(虽然通过Controls集合访问的方法可以实现,但是破坏了程序的封装性,因此是不被允许的),如果子控件的事件不能作为顶级事件引发,那么将无法实现子控件的事件处理。简单的说,即如何实现子控件的事件上传。所谓事件上传是指把子控件的事件暴露为顶级事件,这样父控件可以检查到事件,并按照定义来执行相关事件处理程序.
(二) 什么是复合控件事件冒泡(事件上传)
其核心是使用ASP.NET 2.0框架提供的事件上传机制。这种机制允许子控件将事件沿其包容层次结构向上传播到合适的位置引发,并且允许将事件处理程序附加到原始控件以及公开冒泡的事件的控件上
(三)复合控件的实现原理
页面框架提供了一个事件上传架构,通过它控件可能把某个事件上传(bubble)到控件层次,一个上传事件可能在引发它时或其他时候来处理,更方便的处理时机是在控件树的高层,复合控件可能用这个特征把子控件上传的事件暴露为顶层事件。例如:DataList控件把包含在ItemTemplate 中的Button控件的Command事件暴露为顶层的ItemCommand事件。而command事件(
它的事件数据类派生自CommandEventArgs)由asp.net的内建控件上传的惟一事件,也可以实现初始化上传的其他事件。
事件上传由OnBubbleEvent 和RaiseBubbleEvent方法来启动的,这些方法在Control类中的定义如下:
|
// 将所有事件源及其信息分配给控件的父级。
默认的情况下,初始化上传事件自动被上传通过控件层次,就像RaiseBubbleEvent方法定 为了处某个已经上传的事件,应该重载OnBubbleEvent 方法,复合控个把通常包含 处理上传事件的方法之一是根据上传的事件来引发新的事件,这样页面开发者可以 示例程序: 通过捕获Button子控件的Command事件,并引发自已的Logon事件:
那么我怎么知道OnBubbleEvent被初始化呢。如何把一个button事件上上传到顶层事件 在button中OnCommand的内部实现。
|
(四) 实现事件冒泡(事件上传)的步骤。
只要在自定义控件中,重写OnBubbleEvent方法,就能实现事件冒泡。因为在其子控件内部有一个OnCommand方法,它调用了RaiseBubbleEvent方法。而RaiseBubbleEvent调用了OnBubbleEvent方法。
示例:
本节用到的示例控件代码: