Avatar billede simsen Mester
04. november 2008 - 11:17 Der er 3 kommentarer og
1 løsning

Treeview - flere end 3 niveauer

Hej,

Jeg kører med et treeview, jeg henter fra databasen på nuværende tidspunkt. Den kører som en drøm.....MEN kun på 3 niveauer:

Niveau1
...Niveau1-1
......Niveau1-1-1

Jeg vil gerne udvide den til at have/vise X antal niveauer men aner ikke hvordan jeg gør det.

Min kode, hvor jeg henter menuen ind i mit treeview er følgende:

private void GetMenu()
    {
        //16-06-2008 AS
        //Get the top menu
        try
        {
            DALMenu menu = new DALMenu();
            if (menu.ProdGetTopMenu(MenuTree) == Status.Success)
            {
                //Henter submenus
                for (int i = 0; i < MenuTree.Nodes.Count; i++)
                {
                    TreeNode headnode = MenuTree.Nodes[i];

                    GetSubNodes(headnode);

                    foreach (TreeNode node in MenuTree.Nodes[i].ChildNodes)
                    {
                        GetSubNodes(node);
                    }
                }
            }
        }
        catch
        { }
    }   

private static void GetSubNodes(TreeNode node)
    {
        DALMenu submenu = new DALMenu();
        submenu.ProdGetSubMenu(node);
    }

Og her henter jeg så submenus ind fra databasen:
SqlDataReader reader = command.ExecuteReader();

            while (reader.Read() == true)
            {
                r = AItems.NewRow();

                try
                {
                    TreeNode t = new TreeNode(reader["fProdPageName"].ToString(), reader["fEditPageFId"].ToString());
                    t.PopulateOnDemand = true;
                    t.SelectAction = TreeNodeSelectAction.SelectExpand;
                    t.Expanded = false;

                    n.ChildNodes.Add(t);
                }
                catch
                { }

                AItems.Rows.Add(r);
            }

Nogen der kan fortælle mig, hvordan jeg får lavet det sådan, den henter ALLE de niveauer der end måtte være......eller bare, hvordan man tilføjer ét niveau mere?

mvh
simsen :-)
Avatar billede crazysnap Seniormester
05. november 2008 - 13:29 #1
Hej simsen,

Kan du ikke bare lave en lille rekursiv metode der løber alle noderne igennem indtil den møder en node uden "children". Se f.eks. nedenfor hvor "GetMenu()" er ændret og der desuden er tilføjet en ny "RecBuildNodes"-metode (koden er absolut utestet):


private void GetMenu()
{
    //16-06-2008 AS
    //Get the top menu
    try
    {
        DALMenu menu = new DALMenu();
        if (menu.ProdGetTopMenu(MenuTree) == Status.Success)
        {
            RecBuildNodes(MenuTree);
        }
    }
    catch
    { }
}

//Henter submenus recursivt
private void RecBuildNodes(TreeNode tNode)
{
    for (int i = 0; i < tNode.Nodes.Count; i++)
    {
        TreeNode curNode = tNode.Nodes[i];

        GetSubNodes(curNode);

        if (curNode.ChildNodes.Count > 0)
            RecBuildNodes(curNode);
    }
}


Mvh.
CS
Avatar billede montago Praktikant
06. november 2008 - 08:54 #2
Hvis din tabel ser ud som min:
[NodeID][NodeNavn][ParentID]

så kan man lave en næsten flad opdatering af et træ:
//---------------------

//Hent endten med SQL eller LINQ hele din træ-tabel
var AutoGenTree = from aggt in db.Autog302GenStructs
                  orderby aggt.NodeID
                  select aggt;

//opret et dictionary til at gemme alle dine noder (og slå op)
dicAutoTree = new Dictionary<int, TreeNode>();

//ryd evt dit TreeView
GenTree.Nodes.Clear();

//Skab evt en root-node eller brug GenTree.Nodes i stedet
TreeNode root = new TreeNode() { Text = "root", Value = "0" };
dicAutoTree.Add(0, root);
GenTree.Nodes.Add(root);

//loop igennem alle rækker i tabellen
foreach (var node in AutoGenTree)
{
//Skab den node du vil indsætte
    TreeNode tn = new TreeNode(node.Name, node.NodeID.ToString());

//læg noden i dit dictionary
    dicAutoTree.Add(node.NodeID, tn);

//undersøg om nodens parent allerede findes i træet
    if (dicAutoTree.ContainsKey(node.ParentID))
    {
//hvis parent allerede findes, læg nogen i dens children
        dicAutoTree[node.ParentID].ChildNodes.Add(tn);
    }
    else
    {
//ellers tilføj noden som root/firstnode i træet (evt dit tree.Nodes
        GenTree.Nodes.Add(tn);
    }
}
Avatar billede simsen Mester
25. november 2008 - 09:11 #3
crazysnap

Jeg valgte din metode, dog med lidt modifikationer, da jeg ikke helt kunne få den til at virke. Smid et svar og pointsene er dine :-)

Færdige resultat:

private void GetMenu()
    {
        try
        {
            DALMenu menu = new DALMenu();
            DataTable getmenu = null;
            if (menu.EditGetMenu(ref getmenu) == Status.Success)
            {
                DataView dv = new DataView(getmenu);
                dv.RowFilter = "fEditPageParentId=0";

                MenuTree.Nodes.Clear();

                for (int i = 0; i < dv.Count; i++)
                {
                    TreeNode node = new TreeNode();
                    node.Value = dv[i]["fEditPageId"].ToString();
                    node.Text = dv[i]["fEditPageName"].ToString();
                    MenuTree.Nodes.Add(node);
                    RecFillTree(getmenu, node);

                }
            }
        }
        catch
        { }
    }

    private void RecFillTree(DataTable getMenu, TreeNode ParentNode)
    {
        DataView dv = new DataView(getMenu);
        dv.RowFilter = "fEditPageParentId=" + ParentNode.Value;
        if (dv.Count > 0)
        {
            for (int j = 0; j < dv.Count; j++)
            {
                TreeNode node = new TreeNode();
                node.Value = dv[j]["fEditPageId"].ToString();
                node.Text = dv[j]["fEditPageName"].ToString();
                ParentNode.ChildNodes.Add(node);
                RecFillTree(getMenu, node);
            }
        }
    }
Avatar billede crazysnap Seniormester
25. november 2008 - 09:27 #4
Hej simsen,

Jeg er glad for at høre du fik det til at virke og ja jeg kan se du bruger den rekursive metode. :)

Der kommer et svar her.

Mvh.
CS
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester