11
votes

TreeView récursive dans ASP.NET

J'ai un objet de la liste de types à partir de laquelle je souhaite utiliser pour remplir une arborescence d'une vue d'arbre dans ASP.NET C #.

Chaque élément objet a: p>

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


0 commentaires

3 Réponses :


27
votes

Je pense que cela devrait vous aider à démarrer. J'ai créé une classe myObject code> pour imiter votre objet.

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


4 commentaires

+1: C'est la solution que je cherchais .. fonctionne parfaitement .. merci !!


En effet, ce truc fonctionne parfaitement! Exactement ce que je cherchais :)


La liste IEnumerable ne serait-elle pas créée en mémoire sur chaque itération?


Je veux le même scénario mais au format JSON, c'est possible?



-1
votes
    //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);
        }
    }

0 commentaires

1
votes

Ceci est un échantillon avec une entité de catégorie qui se réfère elle-même. Nous devrions d'abord préparer notre source de données: xxx

puis dans notre code derrière nous avons: xxx


0 commentaires