ASP.NET 2.0 服务器控件之复合控件事件

时间:2008-03-27 13:30:12  来源:  作者:
4UN第一天空网络

  需要读者注意的是其内部执行过程。控件定义的顶层事件是Submit,其对应事件处理程序是OnSubmit,而不是 _button_Click._button_Click是复合控件的子控件的Click事件处理程序。由于在控件实现的代码中定义了子控件的事件处理程序_button_Click,所以,当用户单击按钮后,将首先执行_button_Click,该方法要求调用顶层事件Submit的事件处理程序 OnSubmit.从外部来看,子控件的事件即暴露为顶层事件。4UN第一天空网络

  从以上实现过程来看,包含法使用的是程序代码上的小技巧来实现事件上传功能。下面介绍的冒泡法则与此不同,它使用。net框架提供的事件上传机制来完成子控件的事件上传。4UN第一天空网络

  冒泡法4UN第一天空网络

  冒泡法也称"事件冒泡",其核心是使用ASP.net 2.0框架提供的事件上传机制。这种机制允许子控件将事件沿其包容层次结构向上传播到合适的位置引发,并且允许将事件处理程序附加到原始控件以及公开冒泡的事件的控件上。4UN第一天空网络

  冒泡法的实现,使用Control基类中专门用于事件上传的两个方法:OnBubbleEvent和RaiseBubbleEvent.它们的声明如下所示。   4UN第一天空网络

// OnBubbleEvent方法定义 4UN第一天空网络
  protected virtual bool OnBubbleEvent(object source,EventArgs args){ return false;} 4UN第一天空网络
  // RaiseBubbleEvent方法定义 4UN第一天空网络
  protected void RaiseBubbleEvent(object source,EventArgs args){ 4UN第一天空网络
  Control currentTarget = _parent; 4UN第一天空网络
  while(currentTarget != null) { 4UN第一天空网络
  if(currentTarget.OnBubbleEvent(source,args) { return; } 4UN第一天空网络
  currentTarget = currentTarget.Parent; 4UN第一天空网络
  } 4UN第一天空网络
  }
  OnBubbleEvent方法用于确定子控件的事件是否沿复合控件层次结构向上传递。在该方法中,参数source表示事件源,参数args表示包含事件数据的EventArgs对象。如果子控件的事件向上传递,则为true;否则为false.默认值为false.RaiseBubbleEvent 方法用于将所有事件源及其信息分配给控件的父级,并且不能被重写。尽管无法重写此方法,但创作的控件可以通过重写 OnBubbleEvent 方法处理或引发冒泡事件。

  复合控件的事件冒泡主要存在以下两种情况:4UN第一天空网络

  情况一:控件停止事件冒泡并引发和/或处理该事件。引发事件需要调用将事件调度给侦听器的方法。若要引发冒泡的事件,控件必须重写OnBubbleEvent以调用引发此冒泡的事件的OnEventName方法。引发冒泡的事件的控件通常将冒泡的事件公开为顶级事件。以下代码引发一个冒泡的事件。4UN第一天空网络

 protected override bool OnBubbleEvent(object sender,EventArgs e){ 4UN第一天空网络
  bool handled = false; 4UN第一天空网络
  if(e is CommandEventArgs) { 4UN第一天空网络
  CommandEventArgs ce = (CommandEventArgs)e; 4UN第一天空网络
  if(ce.CommandName == "ButtonClick") { 4UN第一天空网络
  OnButtonClick(EventArgs.Empty); 4UN第一天空网络
  handled =true; 4UN第一天空网络
  } 4UN第一天空网络
  } 4UN第一天空网络
  return handled; 4UN第一天空网络
  }

  情况二:控件进行一些处理并继续使事件冒泡。若要实现这一点,控件必须重写OnBubbleEvent,并从OnBubbleEvent调用RaiseBubbleEvent.以下代码在检查事件参数的类型后使事件冒泡。 4UN第一天空网络

 protected override bool OnBubbleEvent(object sender,EventArgs e){ 4UN第一天空网络
  if(e is CommandEventArgs) { 4UN第一天空网络
  CommandEventArgs ce = (CommandEventArgs)e; 4UN第一天空网络
  RaiseBubbleEvent(this,ce); 4UN第一天空网络
  return true; 4UN第一天空网络
  } 4UN第一天空网络
  return false; 4UN第一天空网络
  }

  为了使读者能够更好的理解冒泡法,下面利用冒泡法对上一小节示例进行了重新实现。控件类的源代码如下所示,其中没有改变的部分使用省略号表示。  4UN第一天空网络

using System; 4UN第一天空网络
  using System.Web.UI; 4UN第一天空网络
  using System.Web.UI.WebControls; 4UN第一天空网络
  using System.ComponentModel; 4UN第一天空网络
  using System.ComponentModel.Design; 4UN第一天空网络
  namespace WebControlLibrary{ 4UN第一天空网络
  public class CompositeEvent : CompositeControl { 4UN第一天空网络
  //声明变量 4UN第一天空网络
  private Button _button; 4UN第一天空网络
  private TextBox _textBox; 4UN第一天空网络
  private static readonly object EventSubmitKey = new object(); 4UN第一天空网络
  //定义属性ButtonText,用于指定按钮上的文字 4UN第一天空网络
  [ 4UN第一天空网络
  Bindable(true), Category("Appearance"), DefaultValue(""), Description("获取或设置显示显示在按钮上的文字") 4UN第一天空网络
  ] 4UN第一天空网络
  public string ButtonText { …… }

  //定义属性Text,表示文本框的输入 4UN第一天空网络

文章评论

共有 位天空网友发表了评论 查看完整内容

特别推荐
  • 文字广告
  • 文字广告
  • 文字广告
  • 文字广告
站长黑板报