首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> ASP.NET >> 正文

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

  复合控件的事件冒泡主要存在以下两种情况:

  情况一:控件停止事件冒泡并引发和/或处理该事件。引发事件需要调用将事件调度给侦听器的方法。若要引发冒泡的事件,控件必须重写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.

  小结

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

上一页  [1] [2] [3] [4] 

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航