ASP.NET中的递归TreeView

我有一个类型列表的对象,我希望用它来填充asp.net c#中的树视图。

每个对象项都有:

id | Name | ParentId 

例如:

 id | Name | ParentId ------------------------- 1 | Alice | 0 2 | Bob | 1 3 | Charlie | 1 4 | David | 2 

在上面的例子中,父母将是Alice有两个孩子Bob和Charlie。 大卫是鲍勃的孩子。

我试图在c#ASP.NET中递归地动态填充树视图时遇到了很多问题

有没有人有一个简单的解决方案?

顺便说一句:您可以使用People.Id,People.Name和People.ParentId来访问成员,因为它是属于list的对象。

到目前为止,我可以发布我的代码(许多尝试),但不确定它会有多大用处。

我认为这应该让你开始。 我创建了一个MyObject类来模仿你的对象。

 public class MyObject { public int Id; public int ParentId; public string Name; } 

这是一种基于列表recursivley添加树视图节点的方法。

 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { List list = new List(); list.Add(new MyObject(){Id=1, Name="Alice", ParentId=0}); list.Add(new MyObject(){Id=2, Name="Bob", ParentId=1}); list.Add(new MyObject(){Id=3, Name="Charlie", ParentId=1}); list.Add(new MyObject(){Id=4, Name="David", ParentId=2}); BindTree(list, null); } } private void BindTree(IEnumerable list, TreeNode parentNode) { var nodes = list.Where(x => parentNode == null ? x.ParentId == 0 : x.ParentId == int.Parse(parentNode.Value)); foreach (var node in nodes) { TreeNode newNode = new TreeNode(node.Name, node.Id.ToString()); if (parentNode == null) { treeView1.Nodes.Add(newNode); } else { parentNode.ChildNodes.Add(newNode); } BindTree(list, newNode); } } 

这是一个引用自身的Category实体的示例。 首先,我们应该准备我们的数据源:

 public class Category { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } public virtual Category Parent { get; set; } public virtual ICollection Children { get; set; } public byte[] Image { get; set; } } public class Product { public int Id { get; set; } public string Code { get; set; } public string Name { get; set; } public Category ProductCategory { get; set; } public int ProductCategoryId { get; set; } public byte[] Image { get; set; } } public List GethierarchicalTree(int? parentId=null) { var allCats = new BaseRepository().GetAll(); return allCats.Where(c => c.ParentId == parentId) .Select(c => new Category() { Id = c.Id, Name = c.Name, ParentId = c.ParentId, Children = GetChildren(allCats.ToList(), c.Id) }) .ToList(); } public List GetChildren(List cats, int parentId) { return cats.Where(c => c.ParentId == parentId) .Select(c => new Category { Id = c.Id, Name = c.Name, ParentId = c.ParentId, Children = GetChildren(cats, c.Id) }) .ToList(); } 

然后在我们的代码背后我们有:

  protected void Page_Load(object sender, EventArgs e) { var hierarchicalData = new CategoryRepository().GethierarchicalTree(); tv1.Nodes.Clear(); var root = new TreeNode("0","Root"); tv1.Nodes.Add(root); BindTreeRecursive(hierarchicalData, root); } private void BindTreeRecursive(List hierarchicalData, TreeNode node) { foreach (Category category in hierarchicalData) { if (category.Children.Any()) { var n = new TreeNode(category.Name, category.Id.ToString()); node.ChildNodes.Add(n); BindTreeRecursive(category.Children.ToList(), n); } else { var n = new TreeNode(category.Name, category.Id.ToString()); node.ChildNodes.Add(n); if (new ProductRepository().Get(a => a.ProductCategoryId == category.Id).Any()) { var catRelatedProducts = new ProductRepository().Get(a => a.ProductCategoryId == category.Id).ToList(); foreach (Product product in catRelatedProducts) { n.ChildNodes.Add(new TreeNode(product.Name,product.Id.ToString())); } } } } } 
  //In load for example if (!IsPostBack) { DataSet ds = new DataSet(); ds = getRoles(); //function that gets data collection from db. tvRoles.Nodes.Clear(); BindTree(ds, null); tvRoles.DataBind(); } private void BindTree(DataSet ds, TreeNode parentNode) { DataRow[] ChildRows; if (parentNode == null) { string strExpr = "ParentId=0"; ChildRows = ds.Tables[0].Select(strExpr); } else { string strExpr = "ParentId=" + parentNode.Value.ToString(); ChildRows = ds.Tables[0].Select(strExpr); } foreach (DataRow dr in ChildRows) { TreeNode newNode = new TreeNode(dr["Name"].ToString(), dr["Id"].ToString()); if (parentNode == null) { tvRoles.Nodes.Add(newNode); } else { parentNode.ChildNodes.Add(newNode); } BindTree(ds, newNode); } }