代码之家  ›  专栏  ›  技术社区  ›  waqasahmed

asp.net中的递归树视图

  •  11
  • waqasahmed  · 技术社区  · 14 年前

    我有一个list类型的对象,我想用它来填充asp.net c中的treeview。

    每个对象项都有:

    id | Name | ParentId
    

    例如:

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

    在上面的例子中,父母是爱丽丝,有两个孩子鲍勃和查理。大卫是鲍勃的孩子。

    我在尝试在c asp.net中递归地动态填充treeview时遇到了很多问题。

    有没有简单的解决办法?

    顺便说一下:您可以使用people.id、people.name和people.parentid来访问成员,因为它是属于list的对象。

    到目前为止,我可以给你发我的代码(多次尝试),但不确定它有多有用。

    3 回复  |  直到 7 年前
        1
  •  27
  •   Matt Dearing    14 年前

    我认为这应该让你开始。我创造了一个 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);
        }
    }
    
        2
  •  0
  •   Arash Masir    7 年前

    这是一个带有引用自身的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
  •  -1
  •   Cowboys    12 年前
        //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);
            }
        }