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

时间:2008-01-02 10:48:28  来源:站长资讯收集整理  作者:

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

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

  冒泡法

  冒泡法也称"事件冒泡",其核心是使用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,表示文本框的输入 

文章评论

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