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

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

 [
  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.

  小结

  本文重点介绍了复合控件的事件实现方法,并通过典型示例说明了这些实现方法的具体应用。总体而言,为复合控件实现事件并不是特别困难的事情。关键是开发人员必须在领会为普通控件实现事件的基础之上,掌握包含法和冒泡法的实现要点。 

文章评论

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