当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET 2.0 服务器控件之复合控件事件

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 107 ::
收藏到网摘: n/a

    在上面一篇文章中,我们讨论了有关创建复合控件的基本理论,并且通过一个典型应用掌握了复合控件的呈现方法。本文将继续讲解有关创建复合控件的内容,重点是为复合控件实现事件的具体方法。
  
    复合控件的事件处理简介
  
    谈到自定义控件的事件处理问题,这在前面的系列文章中已经进行讲解。由前文可知,实现控件事件的核心主要是定义事件属性结构和事件处理程序等。然而,这些内容是构建所有自定义服务器控件的基础。仅仅依靠这些方法是无法实现复合控件的事件的。因为,复合控件中包含子控件,这就使得复合控件的事件处理变得复杂起来。显而易见,在复合控件的事件实现过程中,需要面临的最大问题是:由于不允许开发人员直接访问子控件(虽然通过Controls集合访问的方法可以实现,但是破坏了程序的封装性,因此是不被允许的),如果子控件的事件不能作为顶级事件引发,那么将无法实现子控件的事件处理。简单的说,即如何实现子控件的事件上传。所谓事件上传是指把子控件的事件暴露为顶级事件,这样父控件可以检查到事件,并按照定义来执行相关事件处理程序。
  
    由以上内容可知,复合控件的事件处理,主要是实现子控件事件上传的过程。下面将介绍两种常用的事件上传实现方法:包含法和冒泡法。这两种方法实现机理不同,然而,完成了同样的功能。在下文中,我们将通过理论结合示例的方法展开讲解。
  
    包含法
  
    包含法的核心是,通过在子控件的事件处理程序中调用复合控件的顶层事件处理程序,以完成子控件的事件上传。在执行过程中,当引发子控件事件后,子控件的事件处理程序将自动调用相关顶层事件处理程序。
  
    包含法的关键步骤如下:
  
    · 在CreateChildControls方法中,为子控件添加事件处理程序。
  
    · 定义顶层事件及其事件处理程序OnEventName。
  
    · 在子控件的事件处理程序中调用OnEventName。
  
    · 定义事件属性结构。
  
    由以上内容可知,包含法的步骤与前面文章中介绍的实现控件的方法基本类似。关键是多出了一个在CreateChildControls方法中,为子控件添加事件处理程序的步骤。为了读者能够更加清晰的理解包含法,下文列举了一个利用包含法为复合控件实现事件的示例。
  
    首先,利用上一篇文章中介绍的复合控件呈现方法,创建一个由文本框和按钮组成的复合控件,然后,使用上文所述的包含法,将按钮的Click事件上传为顶层事件Submit。下面列举了该控件的源代码。
  
  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 {
     get {
      EnsureChildControls();
      return _button.Text;
     }
     set {
      EnsureChildControls();
      _button.Text = value;
     }
    }
    //定义属性Text,表示文本框的输入
  
    [
     Bindable(true), Category("Appearance"), DefaultValue(""), Description("获取或设置文本框输入文本")
    ]
    public string Text {
     get {
      EnsureChildControls();
      return _textBox.Text;
     }
     set {
      EnsureChildControls();
      _textBox.Text = value;
     }
&nb