ASP.NET2.0快速入门系列----分层数据(阶梯/等级形)
有关这些控件的更多示例,请参考“控件参考”部分中的 XmlDataSource 和 SiteMapDataSource 主题。
TreeView 和 Menu 控件
与数据源一样,数据绑定控件也可以是分层的。表格数据绑定控件呈现数据的列表或网格,而分层数据绑定控件能够递归到数据层次结构中,以便在用户界面中将数据呈现为父/子关系。ASP.NET 2.0 中的 TreeView 和 Menu 控件都是分层数据绑定控件。将这些控件与分层数据源进行数据绑定的一些方法将通过本节后面的示例进行介绍。
有关这些控件的更多示例,请参考“控件参考”部分中的 TreeView 和 Menu 主题。
绑定到 XML
XmlDataSource 控件允许控件绑定到 XML 数据。XmlDataSource 支持 DataFile 属性,用于指定要用作输入的 XML 数据文件的路径。还可以指定 TranformFile 属性以便向数据应用 XSLT 转换,并指定 XPath 属性用于指定要从数据源公开的节点的子集。
下面的示例演示通过 XmlDataSource 控件绑定到 XML 文件的 TreeView 控件。TreeView 将各个 TreeNode 对象的属性 (Property) 与层次结构中的 XML 节点的属性 (Attribute) 相关联(为了数据绑定,属性 (Attribute) 被提升为数据项的属性 (Property))。默认情况下,TreeView 控件只是通过调用对象的 ToString() 呈现数据项。这样可呈现 XML 节点的元素名称,因此可以看到 TreeView 所绑定到的节点层次结构。这不一定产生所需的呈现,但为进一步自定义 XML 数据的显示方式提供了起点。
C# Binding TreeView to an XML File
为了向 TreeView 提供更有意义的呈现,可以为树中的节点指定各自的数据绑定。可以将 TreeNodeBinding 对象添加到 TreeView 的 Databindings 集合,以便对分层数据项的字段映射到 TreeNode 属性的方式进行定义。 TreeNodeBinding 有两个重要属性可确定绑定所应用到的分层数据项集。DataMember 属性指定数据项的类型,如果是 XML 数据,则该属性指定应用绑定的元素名。Depth 属性指定层次结构中应用数据绑定的深度。可以设置 DataMember 或 Depth,也可以同时设置这两个属性。例如,若要为给定 XML 文件中的所有 Book 元素定义数据绑定,请将 DataMember 设置为“Book”。若要为深度为 1 的所有节点定义绑定,请将 Depth 属性设置为 1。若要为深度为 1 的所有 Book 节点定义绑定,请将 TreeNodeBinding 对象的 DataMember 设置为“Book”,并将 Depth 设置为 1。
一旦将 DataMember 或 Depth 设置为与给定的节点集匹配,就可以定义 TreeNodeDataBinding 的其他属性以定义数据项(如果是 XML 数据,则为 XML 节点属性 (Attribute))的属性 (Property) 如何映射到 TreeView 控件呈现的 TreeNode 的属性 (Property)。例如,TextField 属性定义要用于 TreeNode 的 Text 的属性的名称。同样,ValueField 属性定义要用于 TreeNode 的 Value 的数据项属性。NavigateUrlField 属性定义要用于 TreeNode 的 NavigateUrl 的字段/属性,等等。还可以针对给定的数据绑定为 TreeNode 属性指定静态值。例如,若要指定 Book 元素的 TreeNode 具有“Book.gif”图像,请对 DataMember 属性为“Book”的 TreeNodeBinding 的 ImageUrl 属性进行设置。
下面的示例演示绑定到与前一示例相同的 XML 数据的 TreeView,并针对 XML 层次结构中的特定元素定义了 Databinding。
C# TreeView Data Bindings
XmlDataSource 支持 XPath 属性,您可以使用该属性筛选由数据源公开的节点集。在下面的示例中,XPath 属性被设置为 Bookstore/genre[@name='Business']/book,用于筛选数据源的节点从而仅显示属于“Business”领域的 book 元素。注意要为 XPath 属性指定正确的语法;否则,数据源可能不公开任何节点(并且关联的数据绑定控件将不呈现)。
C# Binding TreeView to an XPath Result
注意,TreeView 的层次结构与源 XML 的层次结构完全匹配。因此,为绑定到 TreeView 而专门构造 XML,或使用 XSL 转换将数据“重构”到一个适当的层次结构中都是常见的做法。
C# Binding TreeView to an XSLT Transformation
也可以将表格数据绑定控件绑定到分层数据源,但这种情况下,该控件仅呈现层次结构的第一层。在下面的示例中,模板化的 DataList 控件绑定到与前一示例相同的书店 XML 文件。由于从数据源公开的顶层节点是 节点,DataList 能够在其 ItemTemplate 中使用 Eval 数据绑定表达式绑定到那些节点的属性。
C# DataList Bound to XML File
虽然呈现层次结构的一个层次是有用的,但最好能够嵌套表格数据绑定控件来反映基础层次结构。所幸,使用 ASP.NET 2.0 可以实现这种操作。除了 Eval 数据绑定语法,ASP.NET 2.0 还提供一种“基于 Xpath 的数据绑定语法”,实现 IXPathNavigable 接口的任何数据项都支持该语法。受支持的表达式类型有两种:
XPath(expression, [formatString]) -- 根据数据项计算 XPath 表达式,返回单个值。
XPathSelect(expression, [formatString]) -- 根据数据项计算 XPath 表达式,返回所选节点列表。
下面的示例建立在前一示例的基础上,使用 XPath 数据绑定表达式而不是 Eval 表达式绑定到图书节点的属性。从表面上看,这似乎只是向每个表达式引入一个 '@' 前缀,该前缀是引用节点属性的 XPath 语法。但是,XPath 的真正灵活性在于它能够引用层次结构中任意项(而不只是属性)。
该示例向外部 DataList 的 ItemTemplate 添加另一个 DataList,并将这个内部 DataList 的 DataSource 属性绑定到表示当前图书节点的章节节点列表的 XPathSelect 表达式。在内部 DataList 的 ItemTemplate 中,XPath 数据绑定表达式根据这些“章节”上下文节点进行计算。使用这种方法,ASP.NET 2.0 通过组合表格数据绑定控件允许方便地构造丰富的数据分层呈现。
C# Nested DataList Bound to XML File
诸如 XmlDataSource 这样的分层数据源控件将一个唯一的路径关联到其层次结构中的每个节点,以便从位于特定位置的节点的数据绑定控件为请求提供服务。这样可实现一些功能如 TreeView 的 PopoulateOnDemand 功能,此功能中,数据源的节点在展开时向下发送到客户端,而不是一次性向下发送所有节点(TreeView 控件参考示例将详细讨论此功能)。它还允许在页代码中使用该路径配置数据源以显示特定位置的节点。路径语法特定于所表示的数据的类型,不能在代码中构造。但是,可以使用 TreeNode DataPath 属性访问绑定到 TreeView 的节点的数据路径。由于 XmlDataSource 的数据路径语法使用 XPath 表达式,可以将这些路径分配给 XmlDataSource 的 XPath 属性以筛选节点列表。下面的示例演示这种使用 XmlDataSource 实现主/详细信息方案的方法。有两个 XmlDataSource 控件,一个绑定到 TreeView(主控件),另一个绑定到 DataList(详细信息控件)。当 TreeView 节点被单击时,则检索 DataPath 属性并将其指定给绑定到 DataList 的 XmlDataSource 控件,以便显示被单击的特定节点的其他信息。
C# XML-based Event Log using TreeView (Master-Details)
在“TreeView 控件参考”部分中将演练如何从头编写此示例的一系列步骤,因此请参考该主题以了解更多信息。
绑定到站点导航
站点导航数据是 ASP.NET 应用程序中另一种形式的分层数据。正如在“创建站点导航层次结构”部分中所述的那样。除了支持使用 ASP.NET 中的站点导航 API 对站点地图数据进行编程访问外,ASP.NET 2.0 还支持使用 SiteMapDataSource 控件进行声明性数据绑定。当将 TreeView(或 Menu)控件绑定到 SiteMapDataSource 时,站点地图的 Text 和 Url 属性可绑定到 TreeNode(或 MenuItem)。虽然可以指定一个 DataBinding 集合建立这些绑定,但这不是严格必要的。TreeView 和 Menu 控件自动将 TreeNode 或 MenuItem 的 Text 和 NavigateUrl 属性绑定到相关的站点地图属性(这是使用 SiteMapNode 的 INavigateUIData 接口实现的)。TreeView 和 Menu 在绑定到 SiteMapDataSource 时的另一个功能是自动将 SelectedNode 或 SelectedItem 属性设置为站点地图中的当前节点。
下面的示例演示绑定到 SiteMapDataSource 控件的 TreeView。尽管此示例演示 Databindings 集合是为了演示目的,如果仅绑定到节点的 Text 和 Url 属性,则不一定要这样。
TreeView Bound to SiteMap Data
绑定到关系数据库
关系数据库也可以解释为层次结构,表之间通过外键关系相关联。例如,每个产品都与某个产品类别相关联的产品数据库可以解释为类别和产品之间的分层(1 对多)关系。虽然当前版本的 ASP.NET 未提供可将关系数据公开为分层数据的数据源控件,仍然可以以编程方式填充 TreeView 或 Menu 等分层数据绑定控件的节点/项来实现此功能。下面的示例演示一个从关系数据库进行填充的 TreeView 控件。此示例利用 TreeView 的 PopulateOnDemand 功能,在某个 TreeNode 在客户端上被展开时根据需要填充子节点(通过对服务器的回调)。有关此功能的更多信息,请参考本教程的“TreeView 控件参考”部分。
C# Populating TreeView from a Database