【问题标题】:Recursive TreeView in ASP.NETASP.NET 中的递归 TreeView
【发布时间】:2011-02-04 02:08:05
【问题描述】:

我有一个列表类型的对象,我希望用它来填充 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 来访问成员,因为它是属于列表的对象。

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

【问题讨论】:

    标签: c# asp.net recursion treeview


    【解决方案1】:

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

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

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

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            List<MyObject> list = new List<MyObject>();
            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<MyObject> 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);
        }
    }
    

    【讨论】:

    • +1:这是我正在寻找的解决方案..完美运行..谢谢!!
    • 确实,这东西很管用!正是我想要的:)
    • 每次迭代都会在内存中创建 IEnumerable 列表吗?
    • 我想要同样的场景,但是 json 格式可以吗?
    【解决方案2】:

    这是一个包含引用自身的 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<Category> 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<Category> GethierarchicalTree(int? parentId=null)
            {
                var allCats = new BaseRepository<Category>().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<Category> GetChildren(List<Category> 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<Category> 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()));
                            }
                        }
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:
          //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);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-09
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        相关资源
        最近更新 更多