在自定义集合中实现IHierarchy支持

分享于 

7分钟阅读

Web开发

  繁體 雙語

Screenshot of the final output.

介绍

这个快速教程将命中 ASP.NET 2.0提供的IHierarchicalDataSource的主要特性。 在一个强类型的泛型列表和实体中,我采用一组通用的数据( 分类分类列表),并将它的用 IHierarchy 系列的接口绑定。

背景

在web上显示层次数据不是一个简单的任务,因为你已经知道如何将分层数据集合绑定到标准 ASP.NET TreeView 控件。 无论数据的原始形状是什么,使用提供的AddNode 方法进行循环和绑定都是相当痛苦的。 必须递归查找父控件,确保数据已经排序,等等 总是在 [Insert Bleep Here] 中是一个很大的痛苦。 希望在查看以下内容之后,你会发现使用这里技术扩展自定义集合并删除所有嵌套数据头很容易。

enjoy!

使用代码

我尽量把它打包得尽可能的完美。 打开 Visual Studio 2005,你应该有一个文件路径 ASP.NET 网站。 我为每个类对象( 我想那就是""在我里面) 和一个 static 方法提供一个文件,用于快速地插入强类型的泛型列表实现。

查看 Default.aspx 页面应该产生一个计算机存储产品类别 TreeView的树视图,它演示下面的代码。

在节目中。

首先,我们需要一个基本实体和集合,我的mine类似于:

using System;using System.Collections.Generic;publicclass Category {
 privateint _categoryId;
 privateint _parentId;
 privatestring _name;
 publicint CategoryId {
 get { return _categoryId; }
 set { _categoryId = value; }
 }
 publicint ParentId {
 get { return _parentId; }
 set { _parentId = value; }
 }
 publicstring Name {
 get { return _name; }
 set { _name = value; }
 }
 public Category(int categoryId, int parentId, string name) {
 _categoryId = categoryId;
 _parentId = parentId;
 _name = name;
 } 
}publicclass CategoryCollection : List<Category> {
 public CategoryCollection()
 : base() {
 }
}

在实体上实现 IHierarchyData

为了告诉CLR你的集合具有分层数据,实际上必须是 ! 让我们添加 System.Web.UI 命名空间以及实现 IHierarchyData 接口及它的所需的成员,如下所示:

using System;using System.Collections.Generic;using System.Web.UI;publicclass Category : IHierarchyData {
. . .
 #region IHierarchyData Members// Gets an enumeration object that represents all the child // nodes of the current hierarchical node.public IHierarchicalEnumerable GetChildren() {
 // Call to the local cache for the data CategoryCollection children = new CategoryCollection();
 // Loop through your local data and find any childrenforeach (Category category in Common.GetCategoryData()) {
 if (category.ParentId == this.CategoryId) {
 children.Add(category);
 }
 }
 return children;
 }
 // Gets an IHierarchyData object that represents the parent node // of the current hierarchical node.public IHierarchyData GetParent() {
 // Loop through your local data and report back with the parentforeach (Category category in Common.GetCategoryData()) {
 if (category.CategoryId == this.ParentId)
 return category;
 }
 returnnull;
 }
 publicbool HasChildren {
 get {
 CategoryCollection children = GetChildren() as CategoryCollection;
 return children.Count >0;
 }
 }
 // Gets the hierarchical data node that the object represents.publicobject Item {
 get { returnthis; }
 }
 // Gets the hierarchical path of the node.publicstring Path {
 get { returnthis.CategoryId.ToString(); }
 }
 publicstring Type {
 get { returnthis.GetType().ToString(); }
 }
 #endregion }

GetChildren()GetParent() 方法是真正发生的地方。 这两个内部方法支持层次结构定义,并允许控件正确链接它们。

在集合上实现 IHierarchicalEnumerable

对于上面的代码,GetChildren() 指望我们返回 IHierarchicalEnumerable的实现。

实现这里接口是编码一个方法( GetHierarchyData() )的简单任务,这将确保集合中正确的对象键入,如下所示:

publicclass CategoryCollection : List<Category>, IHierarchicalEnumerable {
. . .
 #region IHierarchicalEnumerable Members// Returns a hierarchical data item for the specified enumerated item.public IHierarchyData GetHierarchyData(object enumeratedItem) {
 return enumeratedItem as IHierarchyData;
 }
 #endregion}

最后。一些输出 !

要查看结果,只需创建一个ASPX页并向它添加一个 ASP:TreeView 控件。 在代码后面,以下Fragment将从新修饰的集合中绑定结果,并将它的组织到你定义的层次结构中。

[__strong__]ASP.Net
----------------------------------------------------------
<asp:TreeView ID="uxTreeView" runat="server"/>Code Behind----------------------------------------------------------protectedvoid Page_Load(object sender, EventArgs e) {
 if (!IsPostBack) {
 // Local cache of category data CategoryCollection collection = Common.GetRootCategories();
 // Bind the data source to your collection uxTreeView.DataSource = collection;
 uxTreeView.DataBind();
 }
}

现在你的集合和实体都在接口上进行了重新激活,你可以在层次结构中再次使用它们。

Points of Interest

如果有人能回答这个问题,为什么这是隐藏在 System.Web.UI 名称空间中,我希望听到它。 我无法想象"仅站点"的需求,但是我还没有在 Windows 应用程序中尝试它。

在代码下载中,我还包括了一个 IHierarchicalDataSourceHierarchicalDataSourceView的实现,用于将with上的数据与 DataSource 控件联系起来。

历史记录

  • 星期三,2007年07月18日 - 初始版本

IMP  COL  SUP  Collect  collection  Collections