1、 用户控件和自定义控件 学习目的与要求 除在 ASP.NET 网页中使用Web 服务器控件外,还可以使用用于创建 ASP.NET 网页的相同技术创建可重复使用的自定义控件,这些控件称作用户控件。本章主要内容 用户控件:包括什么是用户控件和如何创建用户控件。将Web窗体转换成用户控件。自定义控件的开发。用户控件和自定义控件的异同。1 用户控件 用户控件是一种复合控件,工作原理非常类似于ASP.NET网页。可以向用户控件添加现有的Web服务器控件和标记,并定义控件的属性和方法。然后可以将控件嵌入ASP.NET 网页中充当一个单元。1.1 用户控件概述 用户控件使开发人员能够根据应用程序的需求,方便
2、的定义和编写控件。开发所使用的编程技术将与编写Web窗体的技术相同,只要开发人员对控件进行修改,就可以将使用该控件的页面的所有控件都进行更改。1.1 用户控件概述 用户控件与 ASP.NET 网页有以下区别:(1)用户控件的文件扩展名为.ascx。(2)用户控件中没有 Page指令,而是包含 Control指令,该指令对配置及其他属性进行定义。(3)用户控件不能作为独立文件运行。而必须像处理任何控件一样,将它们添加到 ASP.NET页中。(4)用户控件中没有html、body 或form元素。这些元素必须位于宿主页中。1.2 将Web窗体页转换为用户控件 1将单文件 ASP.NET 网页转换为
3、用户控件 将单文件ASP.NET网页转换为用户控件的步骤如下:(1)重命名控件使其文件扩展名为.ascx。(2)从该页面中移除html、body、head 和 form元素。(3)将 Page指令更改为 Control指令。(4)移除 Control指令中除Language、AutoEventWireup(如果存在)、CodeFile 和 Inherits之外的所有特性。(5)在 Control指令中包含className特性。这允许将用户控件添加到页面时对其进行强类型化。1.2 将Web窗体页转换为用户控件 2将代码隐藏 ASP.NET 网页转换为用户控件 将代码隐藏 ASP.NET 网页转
4、换为用户控件的步骤如下:(1)重命名.aspx 文件,使其文件扩展名为.ascx。(2)根据代码隐藏文件使用的编程语言,重命名代码隐藏文件使其文件扩展名为.ascx.vb 或.ascx.cs。(3)打开代码隐藏文件并将该文件继承的类从 Page 更改为 UserControl。(4)针对每个.aspx 文件,按照将单文件ASP.NET网页转换为用户控件的步骤操作。(5)在 Control指令中包含className特性。这允许将用户控件添加到页面时对其进行强类型化。1.2 将Web窗体页转换为用户控件 3将Web窗体转换成用户控件 首先,需要删除、等标记。对于Web窗体,其标记方式的代码参见w
5、ebPage.aspx页面文件。而对于用户控件,声明代码参见webPageUserControl.ascx文件。1.3 用户控件的开发 1建立用户控件 在Visual Studio 2008中,首先打开或新建一个网站项目,新建用户控件。1.3 用户控件的开发 用户控件创建完毕后,会生成一个WebUserControl1.ascx页面,然后它将在设计器中打开。用户控件创建完成后,.ascx页面的代码如下所示。1.3 用户控件的开发 2完善用户控件 ASP.NET用户控件能够封装一个单元中多个子控件的功能。用户控件由一个或多个 ASP.NET服务器控件(Button 控件、TextBox 控件等)
6、以及控件执行功能所需的任何代码组成。用户控件还可以包括自定义属性或方法,这些属性或方法向容器(通常为ASP.NET页)显示用户控件的功能。用户控件 实例 编写一个用户登录控件2 自定义控件 用户控件能够执行很多操作。并实现一些功能,但是在复杂的环境下,用户控件并不能够达到开发人员的要求,是因为用户控件大部分都是使用现有的控件进行组装,编写事件来达到目的。于是,ASP.NET允许开发人员编写自定义控件实现复杂的功能。2.1 简单的自定义控件 自 定 义 控 件 是 编 写 的 一 个 类,此 类 从 C o n t r o l 或WebControl派生。Control类提供了将其放在Page类
7、的控件树中的基本功能。自定义控件需要定义一个直接或间接从Control类派生的类,并重写Render方法。WebControl 类将功能添加到基本的控件类,用于在客户端计算机上显示可视的内容。例如可以使用WebControl类以控制外观和样式通过诸如字体、颜色和高度等属性。简单自定义控件 实例 首先,需要创建一个自定义控件ServerControl1。简单自定义控件 实例 自定义控件创建完成后,会自动生成一个类和相应的方法,用户能够在源代码中编写属性,示例代码如下所示。private int noOfTimes;public int NoOfTimes /编写属性 get return thi
8、s.noOfTimes;/获取属性 set this.noOfTimes=value;/设置属性 简单自定义控件 实例然后,开发人员可以在源代码中编写和添加属性。当需要呈现给HTML页面输出时,只需要重写Render方法即可。接着,需要将自定义控件编译成DLL文件。还需要打开现有的或创建一个新的 ASP.NET Web 应用程序项目。在该webApp7-2项目中添加自定义控件的引用。单击【确定】按钮完成引用的添加后,就可以在页面中使用此自定义控件。若需要在页面中需要使用此自定义控件,同样与用户控件一样需要在头部声明自定义控件,示例代码如下所示。简单自定义控件 实例 自定义注册完毕后,在工具栏中
9、也会呈现自定义控件,如图7-11所示。就可以直接拖动自定义控件到页面,并且配置相应的属性 简单自定义控件 实例 用户拖动自定义页面到控件后,页面会生成相应的自定义控件的HTML代码如下所示。详细源代码参见ServerControl1的ServerControl1.cs文件,项目WebApp7-2中的Default.aspx文件2.2 复合自定义控件 最常见的复杂功能控件就是SqlDataSource控件。SqlDataSource控件是数据源控件,通过SqlDataSource控件能够配置数据源,并且实现分页、插入、删除等功能。复合自定义控件就类似这样一个功能复杂的控件。3 用户控件和自定义控件比较 对比用户控件和自定义控件,很多人或认为用户控件更加容易开发,而自定义控件的门槛较高,不方便应用程序的开发。通常用户控件在一个项目中经常使用,而自定义控件用来在通用的程序中使用,当网站应用程序开发中,导航控件如果使用用户控件实现,是非常方便的。但是通过自定义控件实现,可能并不能适合所有的应用场合,当需要适应其他场合时,可能需要重新开发和编译。3 用户控件和自定义控件比较总结 用户控件的应用始终贯彻着一个高级的设计思想,即“模块化设计,模块化应用”的原则。本章着重讲解了.NET中代码复用的相关内容,即用户控件和自定义控件。