Avatar billede simsen Mester
07. april 2007 - 14:44 Der er 2 kommentarer og
1 løsning

Treeview med flere childnodes

Hejsa,

Jeg har et treeview, som fungerer perfekt......sålænge der kun er én childnode (altså ét lag). Hvor i min kode (og ikke mindst hvad) skal jeg rette, så der er to lag.

Med et lag:

Produkter
--Heste
--Katte
--Hunde

Med to lag:
Produkter
--Heste
----Fodertrug
----Hestebørste
--Katte
----Kattebørste
----Kattelegetøj
--Hunde
osv

Min kode ser ud som følgende:

protected void Page_Load(object sender, EventArgs e)
    {
        ANSIApi api = new ANSIApi();

        if (IsPostBack == false)
        {
            try
            {
                if (api.GetTopMenu(MenuTree) == ANSIApi.FStatus.Success)
                { }
            }
            catch
            { }
        }
    }

    protected void MenuTree_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        ANSIApi api = new ANSIApi();

        //hvis der ikke er nogen child nodes til noden
        if (e.Node.Depth == 0)
        {
            try
            {
                api.GetSubMenu(e.Node);
            }
            catch
            { }
        } 
    }

    protected void MenuTree_TreeNodeCollapsed(object sender, TreeNodeEventArgs e)
    {
        try
        {
            int key_id = Convert.ToInt32(e.Node.Value);

            lblMenuId.Text = key_id.ToString();

            lblMenuId.Visible = true;
        }
        catch
        {
        }
    }

    protected void MenuTree_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
    {
        try
        {
            int key_id = Convert.ToInt32(e.Node.Value);

            lblMenuId.Text = key_id.ToString();

            lblMenuId.Visible = true;

            if (e.Node.Depth == 0)
            {
                TreeView t = (TreeView)sender;

                for (int i = 0; i < t.Nodes.Count; i++)
                {
                    if (t.Nodes[i] != e.Node)
                    {
                        t.Nodes[i].CollapseAll();
                    }
                }
            }
        }
        catch
        {
        }
    }

Koden til de to funktioner er:

//Henter Topmenu tabellen
    public FStatus GetTopMenu(TreeView n)
    {
        FStatus status = FStatus.Failure;

        DataRow r = null;
        DataTable AItems = new DataTable();

        try
        {
            AItems.Columns.Add(new DataColumn("MenuID", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("ParentMenuID", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("MenuName", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("HasChilds", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Body", Type.GetType("System.String")));

            command.CommandText = "SELECT MenuID, ParentMenuID, MenuName, HasChilds, Body FROM Sider WHERE ParentMenuID = 0";

            //command.Parameters.Clear();
            //command.Parameters.Add(new OleDbParameter("@FirmaID", FirmaID));

            OleDbDataReader myReader = command.ExecuteReader();

            //går gennem tabellen og lægger ind i rækker
            while (myReader.Read())
            {
                r = AItems.NewRow();

                try
                {
                    TreeNode t = new TreeNode(myReader["MenuName"].ToString(), myReader["MenuID"].ToString());
                    t.PopulateOnDemand = true;
                    t.SelectAction = TreeNodeSelectAction.Expand;
                    t.Expanded = false;

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

                //Tilføjer rækken til datatable
                AItems.Rows.Add(r);
            }

            myReader.Close();
            //TopMenu = AItems;
            status = FStatus.Success;
        }
        catch
        { }

        return status;
    }

    //Henter Submenu tabellen
    public FStatus GetSubMenu(TreeNode n)
    {
        FStatus status = FStatus.Failure;

        DataRow r = null;
        DataTable AItems = new DataTable();

        try
        {
            AItems.Columns.Add(new DataColumn("MenuID", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("ParentMenuID", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("MenuName", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("HasChilds", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Body", Type.GetType("System.String")));

            command.CommandText = "SELECT MenuID, ParentMenuID, MenuName, HasChilds, Body FROM Sider WHERE ParentMenuID = @ParentMenuID";

            command.Parameters.AddWithValue("@ParentMenuID", n.Value);
            OleDbDataReader myReader = command.ExecuteReader();

            //går gennem tabellen og lægger ind i rækker
            while (myReader.Read())
            {
                r = AItems.NewRow();

                try
                {
                    TreeNode t = new TreeNode(myReader["MenuName"].ToString(), myReader["MenuID"].ToString());
                    t.SelectAction = TreeNodeSelectAction.Expand;
                    t.Expanded = false;
                    n.ChildNodes.Add(t);
                }
                catch
                { }

                //Tilføjer rækken til datatable
                AItems.Rows.Add(r);
            }

            myReader.Close();
            status = FStatus.Success;
        }
        catch
        { }

        return status;
    }

mvh
simsen :-)
Avatar billede dr_chaos Nybegynder
07. april 2007 - 15:22 #1
protected void MenuTree_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        ANSIApi api = new ANSIApi();

        //hvis der ikke er nogen child nodes til noden
        if (e.Node.ChildNodes.Count== 0)
        {
            try
            {
                api.GetSubMenu(e.Node);
            }
            catch
            { }
        }
    }
Avatar billede simsen Mester
07. april 2007 - 18:09 #2
dr_chaos

Desværre - det hjælper ikke.

Jeg har forsøgt at lave en "run to curser" - når jeg klikker på en undermenu, der har undermenu (eksempelvis "Heste" i mit eksempel), går den slet ikke ind i nogle af funktionerne (ser det ud til for mig) - hvis jeg klikker på en, der ikke har undermenuer, så går den korrekt ind???

mvh
simsen :-)
Avatar billede simsen Mester
08. april 2007 - 19:54 #3
YES..........et hel døgns søgen og leden i koden......og jeg fandt det selv *stolt*

TreeNode t = new TreeNode(myReader["MenuName"].ToString(), myReader["MenuID"].ToString());
                    t.PopulateOnDemand = true;
                    t.SelectAction = TreeNodeSelectAction.Expand;
                    t.Expanded = false;
                    n.ChildNodes.Add(t);

Altså jeg manglede en t.PopulateOnDemand = true; i GetSubMenu(TreeNode n)

en meget glad
simsen :-)
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