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

ASP.NET
asp.net 使用Silverlight操作ASPNETDB数据库
ASP.NET 前后台调用方法
ASP.NET中等安全模式的一些经验分享
asp.net 打印控件使用方法
网站开发技术:ASP.NET 2.0搭建网站
ASP.NET实例教程:创建数据透视表
ASP.NET 4进行SEO优化提高网站排名和权重
ASP.NET实例教程:订阅 GeoRSS 订阅源
ASP.NET页面间数据传递的9种方法
ASP.NET教程:网页表单多个按钮完成不同功能
Asp.net的服务器推技术 (Server Push)
asp.net 无刷新附件上传实现方法
ASP.NET 定制简单的错误处理页面实现代码
c# 在WebBrowser中用SendMessage模拟鼠标点击
asp.net 表单验证新思路
.NET从优酷专辑中采集所有视频及信息(VB.NET代码)
VS2005 水晶报表在时部署时遇到的问题
ASP.NET 输出图片简单代码
一天精通asp.net的学习经验小结
DataGridView中绑定DataTable数据及相关操作实现代码

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 110 ::
收藏到网摘: 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