簡體   English   中英

ASP.NET中的遞歸TreeView

[英]Recursive TreeView in ASP.NET

我有一個類型列表的對象,我希望用它來填充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<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);
    }
}

這是一個引用自身的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()));
                        }
                    }
                }
            }
        }
    //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);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM