日期:2014-01-22  浏览次数:20405 次


下载实例

简介
当创建数据驱动的 Web 站点时,Web 开发人员遇到的最常见的任务之一就是创建数据输入窗体。数据输入窗体是为系统用户提供数据输入方法的 Web 页。创建特定数据输入窗体的任务通常应该先从需求分析入手,即,明确指出需要从用户收集何种信息。需求确定之后,下一步是设计数据输入 Web 窗体,包括创建图形用户界面以及编写根据用户输入更新数据库的代码。

当数据输入窗体需求事先已知,并且此数据输入窗体对系统中所有用户都一样时,创建这样的输入窗体就毫无挑战性。然而,如果需要动态的数据输入窗体,任务就会变得更艰巨。例如,考虑一个公司的 Internet Web 应用程序,其目的是收集客户购买的产品的信息;一种产品在线注册系统。对于这样的应用程序,向用户提出的问题可能会因购买不同产品而异,或者因从店铺购买还是从公司 Web 站点购买而异。

如上面提到的例子,当遇到需要提供动态数据输入用户界面时,一种选择可能是“强加”一种解决方案。您可以为公司销售的每种产品创建独立的 Web 页,每张页面包含需要的特定数据输入元素。这种原始方法的问题是当发布新产品时,就需要添加新的页面。虽然创建这些新页面可能不会很困难,但是却很耗时,而且如果没有充分的调试和测试时间就很容易出错。

理想情况下,当发布新产品时,应由某个非技术人员通过易用的、基于 Web 的界面来指定需要提出什么问题。这样的系统对 ASP.NET 来说是可以实现的,因为它具备在运行时往 ASP.NET Web 页动态加载控件的能力。只需要在开发和测试时投入少量的初期投资,您就可以创建一个可重复使用的、动态的数据输入用户界面引擎。即使对计算机了解甚少的用户,通过这种技术都可以轻松地创建自定义数据输入窗体。在本文中,我们会介绍使用 ASP.NET 中的动态控件的基础知识,然后介绍一个完整的、可运转的动态数据输入系统,可以轻松地对它进行自定义和扩展。

ASP.NET 中的动态控件入门
众所周知,ASP.NET Web 页由两部分组成: 

? HTML 部分,它包含静态的 HTML 标记和 Web 控件,通过声明性语法来添加。
 
? 代码部分,可以作为独立的类文件实现(如采用 Visual Studio .NET),或者包含在 HTML 文件的 <script runat="server"> 块中。 
 

ASP.NET Web 页的 Web 控件是在设计时通过声明性语法来添加的,它明确指出了要添加的 Web 控件及其初始属性值,如:



<asp:WebControlName runat="server" prop1="Value1" prop2="Value2" ... propN="ValueN"> </asp:WebControlName>

要理解的一个重点是,当第一次访问 ASP.NET 页面,或者当其 HTML 部分修改后第一次访问时,ASP.NET 引擎会自动将混合的静态 HTML 内容和 Web 控件语法转换成一个类。这个自动生成的类的作用是创建控件层次结构。这个控件层次结构是组成页面的控件集 — 静态的 HTML 标记转换成 LiteralControl 实例,而 Web 控件转换成相应类类型的实例(例如, 转换成 System.Web.UI.WebControls 命名空间中的 TextBox 类的实例)。

之所以称为控件层次结构是因为它是控件的真正的层次结构。每个 ASP.NET 服务器控件可以有一组子控件和一个父控件。当自动生成的类构造控件层次结构时,它会将代表 ASP.NET 页面的 Page 类实例放在层次结构的顶层。Page 类的子控件是那些在页面的 HTML(通常是一些静态的 HTML 标记以及 Web 窗体的服务器控件)中定义的顶级服务器控件。(ASP.NET 页面的 Web 窗体 — 也就是 <form runat="server">标记 — 是作为 HtmlForm 类的实例实现的,可以在 System.Web.UI.HtmlControls 命名空间中找到这个类。)

和任何其他服务器控件一样,这个 Web 窗体可以包含子控件。Web 窗体的子控件是那些在该 Web 窗体本身中发现的控件。甚至 Web 窗体中的控件本身还可能有子控件:Panel 控件的内容构成了其子控件;当将数据绑定到一个 DataGrid 时,产生的内容构成了它的子控件集。因为顶级 Page 类可能有子控件,子控件又有子控件,子控件又有子控件,等等,这组控件就构成了控件层次结构。

为了帮助彻底理解这个概念(理解它对使用动态控件是至关重要的),请想象您有一个 ASP.NET 页面,它在 HTML 部分有以下内容:


<html> <body> <h1>Welcome to my Homepage!</h1> <form runat="server"> What is your name? <asp:TextBox runat="server" ID="txtName"></asp:TextBox> <br />What is your gender? <asp:DropDownList runat="server" ID="ddlGender"> <asp:ListItem Select="True" Value="M">Male</asp:ListItem> <asp:ListItem Value="F">Female</asp:ListItem> <asp:ListItem Value="U">Undecided</asp:ListItem> </asp:DropDownList> <br /> <asp:Button runat="server" Text="Submit!"></asp:Button> </form> </body> </html>

当第一次访问该页面时,会自动生成一个类,这个类包含以编程方式构建控件层次结构的代码。这个示例的控件层次结构如图 1 所示。



图 1. 控件层次结构

以编程方式使用控件层次结构
正如前面提到的,每个 ASP.NET 服务器控件可以包含一组子控件和一个父控件。子控件可通过类型为 ControlCollection 的服务器控件的 Controls 属性访问。ControlCollection 类提供了以下功能: 

? 使用 Count 只读属性来确定有多少子控件。 
&