TreeView récursif dans ASP.NET

J’ai un object de type liste à partir duquel je souhaite utiliser pour remplir un arbre dans asp.net c #

Chaque object a:

id | Name | ParentId 

ainsi par exemple:

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

Dans l’exemple ci-dessus, le parent serait Alice ayant deux enfants, Bob et Charlie. David est l’enfant de Bob.

J’ai eu beaucoup de problèmes à essayer de peupler l’arborescence de façon dynamic récursivement dans c # ASP.NET

Quelqu’un a-t-il une solution simple?

Btw: vous pouvez utiliser People.Id, People.Name et People.ParentId pour accéder aux membres puisqu’il s’agit d’un object appartenant à la liste.

Je peux vous poster mon code jusqu’à présent (nombreuses tentatives ont été faites) mais je ne suis pas sûr de son utilité.

Je pense que cela devrait vous aider à démarrer. J’ai créé une classe MyObject pour imiter votre object.

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

Voici une méthode pour recursivley append des nœuds de vue d’arborescence en fonction de la liste.

 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.ToSsortingng()); if (parentNode == null) { treeView1.Nodes.Add(newNode); } else { parentNode.ChildNodes.Add(newNode); } BindTree(list, newNode); } } 

Ceci est un exemple avec l’entité Category qui fait référence à elle-même. Premièrement, nous devrions préparer notre source de données:

 public class Category { public int Id { get; set; } public ssortingng 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 ssortingng Code { get; set; } public ssortingng 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(); } 

Ensuite, dans notre code, nous avons:

  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.ToSsortingng()); node.ChildNodes.Add(n); BindTreeRecursive(category.Children.ToList(), n); } else { var n = new TreeNode(category.Name, category.Id.ToSsortingng()); 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.ToSsortingng())); } } } } } 
  //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) { ssortingng strExpr = "ParentId=0"; ChildRows = ds.Tables[0].Select(strExpr); } else { ssortingng strExpr = "ParentId=" + parentNode.Value.ToSsortingng(); ChildRows = ds.Tables[0].Select(strExpr); } foreach (DataRow dr in ChildRows) { TreeNode newNode = new TreeNode(dr["Name"].ToSsortingng(), dr["Id"].ToSsortingng()); if (parentNode == null) { tvRoles.Nodes.Add(newNode); } else { parentNode.ChildNodes.Add(newNode); } BindTree(ds, newNode); } }