ASP.NET 2.0 服务器控件之复合控件事件 3
点击次数:20 次 发布日期:2008-11-26 11:12:35 作者:源代码网
|
源代码网推荐 源代码网推荐 冒泡法也称"事件冒泡",其核心是使用ASP.net 2.0框架提供的事件上传机制。这种机制允许子控件将事件沿其包容层次结构向上传播到合适的位置引发,并且允许将事件处理程序附加到原始控件以及公开冒泡的事件的控件上。 源代码网推荐 源代码网推荐 冒泡法的实现,使用Control基类中专门用于事件上传的两个方法:OnBubbleEvent和RaiseBubbleEvent。它们的声明如下所示。 源代码网推荐 源代码网推荐 // OnBubbleEvent方法定义 源代码网推荐 protected virtual bool OnBubbleEvent(object source,EventArgs args){ return false;} 源代码网推荐 // RaiseBubbleEvent方法定义 源代码网推荐 protected void RaiseBubbleEvent(object source,EventArgs args){ 源代码网推荐 Control currentTarget = _parent; 源代码网推荐 while(currentTarget != null) { 源代码网推荐 if(currentTarget.OnBubbleEvent(source,args) { return; } 源代码网推荐 currentTarget = currentTarget.Parent; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 OnBubbleEvent方法用于确定子控件的事件是否沿复合控件层次结构向上传递。在该方法中,参数source表示事件源,参数args表示包含事件数据的EventArgs对象。如果子控件的事件向上传递,则为true;否则为false。默认值为false。RaiseBubbleEvent方法用于将所有事件源及其信息分配给控件的父级,并且不能被重写。尽管无法重写此方法,但创作的控件可以通过重写 OnBubbleEvent 方法处理或引发冒泡事件。 源代码网推荐 源代码网推荐 复合控件的事件冒泡主要存在以下两种情况: 源代码网推荐 源代码网推荐 情况一:控件停止事件冒泡并引发和/或处理该事件。引发事件需要调用将事件调度给侦听器的方法。若要引发冒泡的事件,控件必须重写OnBubbleEvent以调用引发此冒泡的事件的OnEventName方法。引发冒泡的事件的控件通常将冒泡的事件公开为顶级事件。以下代码引发一个冒泡的事件。 源代码网推荐 源代码网推荐 protected override bool OnBubbleEvent(object sender,EventArgs e){ 源代码网推荐 bool handled = false; 源代码网推荐 if(e is CommandEventArgs) { 源代码网推荐 CommandEventArgs ce = (CommandEventArgs)e; 源代码网推荐 if(ce.CommandName == "ButtonClick") { 源代码网推荐 OnButtonClick(EventArgs.Empty); 源代码网推荐 handled =true; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 return handled; 源代码网推荐 } 源代码网推荐 源代码网推荐 情况二:控件进行一些处理并继续使事件冒泡。若要实现这一点,控件必须重写OnBubbleEvent,并从OnBubbleEvent调用RaiseBubbleEvent。以下代码在检查事件参数的类型后使事件冒泡。 源代码网推荐 源代码网推荐 protected override bool OnBubbleEvent(object sender,EventArgs e){ 源代码网推荐 if(e is CommandEventArgs) { 源代码网推荐 CommandEventArgs ce = (CommandEventArgs)e; 源代码网推荐 RaiseBubbleEvent(this,ce); 源代码网推荐 return true; 源代码网推荐 } 源代码网推荐 return false; 源代码网推荐 } 源代码网推荐 源代码网推荐 为了使读者能够更好的理解冒泡法,下面利用冒泡法对上一小节示例进行了重新实现。控件类的源代码如下所示,其中没有改变的部分使用省略号表示。 源代码网推荐 源代码网推荐 using System; 源代码网推荐 using System.Web.UI; 源代码网推荐 using System.Web.UI.WebControls; 源代码网推荐 using System.ComponentModel; 源代码网推荐 using System.ComponentModel.Design; 源代码网推荐 namespace WebControlLibrary{ 源代码网推荐 public class CompositeEvent : CompositeControl { 源代码网推荐 //声明变量 源代码网推荐 private Button _button; 源代码网推荐 private TextBox _textBox; 源代码网推荐 private static readonly object EventSubmitKey = new object(); 源代码网推荐 //定义属性ButtonText,用于指定按钮上的文字 源代码网推荐 [ 源代码网推荐 Bindable(true), Category("Appearance"), DefaultValue(""), Description("获取或设置显示显示在按钮上的文字") 源代码网推荐 ] 源代码网推荐 public string ButtonText { ...... } 源代码网推荐 //定义属性Text,表示文本框的输入 源代码网推荐 源代码网推荐 [ 源代码网推荐 Bindable(true), Category("Appearance"), DefaultValue(""), Description("获取或设置文本框输入文本") 源代码网推荐 ] 源代码网推荐 源代码网推荐 public string Text { ...... } // 实现事件属性结构 源代码网推荐 public event EventHandler Submit 源代码网推荐 { 源代码网推荐 add { 源代码网推荐 Events.AddHandler(EventSubmitKey, value); 源代码网推荐 } 源代码网推荐 remove { 源代码网推荐 Events.RemoveHandler(EventSubmitKey, value); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 // 实现OnSubmit 源代码网推荐 源代码网推荐 protected virtual void OnSubmit(EventArgs e) { 源代码网推荐 EventHandler SubmitHandler = (EventHandler)Events[EventSubmitKey]; 源代码网推荐 if (SubmitHandler != null) { SubmitHandler(this, e); } 源代码网推荐 } 源代码网推荐 // 删除_button_Click 源代码网推荐 // 重写ICompositeControlDesignerAccessor接口的RecreateChildContrls方法 源代码网推荐 protected override void RecreateChildControls() { ...... } 源代码网推荐 //重写CreateChildControls方法,将子控件添加到复合控件中 源代码网推荐 protected override void CreateChildControls() { 源代码网推荐 Controls.Clear(); 源代码网推荐 _button = new Button(); 源代码网推荐 _textBox = new TextBox(); 源代码网推荐 _button.ID = "btn"; 源代码网推荐 _button.CommandName = "Submit"; 源代码网推荐 this.Controls.Add(_button); 源代码网推荐 this.Controls.Add(_textBox); 源代码网推荐 } 源代码网推荐 // 重写OnBubbleEvent方法,执行事件冒泡 源代码网推荐 protected override bool OnBubbleEvent(object source, EventArgs e) { 源代码网推荐 bool handled = false; 源代码网推荐 if (e is CommandEventArgs) { 源代码网推荐 CommandEventArgs ce = (CommandEventArgs)e; 源代码网推荐 if (ce.CommandName == "Submit") { 源代码网推荐 OnSubmit(EventArgs.Empty); 源代码网推荐 handled = true; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 return handled; 源代码网推荐 } 源代码网推荐 //重写Render方法,呈现控件中其他的HTML代码 源代码网推荐 protected override void Render(HtmlTextWriter output) { ...... } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 本例的CompositeEvent类与上小节中的CompositeEvent类实现了同一功能。就控件呈现方面,两个类没有任何差别,差别主要表现在对于复合控件的事件实现方面。差别一:在本例的CreateChildControl方法中,为子控件_button设置了CommandName属性,其属性值为Submit。差别二:删除了_button_Click事件处理程序。差别三:重写了Control基类的OnBubbleEvent方法,检查事件参数是否是CommandEventArgs类的实例。如果是,使用事件参数的CommandName成员确定是否需要引发事件处理程序OnSubmit,并返回true。 源代码网推荐 源代码网推荐 小结 源代码网推荐 源代码网推荐 本文重点介绍了复合控件的事件实现方法,并通过典型示例说明了这些实现方法的具体应用。总体而言,为复合控件实现事件并不是特别困难的事情。关键是开发人员必须在领会为普通控件实现事件的基础之上,掌握包含法和冒泡法的实现要点。 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
