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); } }