Frage

Ich versuche, ein TreeView aus einem Menü zu konstruieren. Mein Code ist wie folgt:

public class MenuExtractionUtility
    {
        public TreeView MenuTraverse(MainMenu mainMenu)
        {
            TreeView treeView = new TreeView();

            TreeNode mainNode = new TreeNode();

            foreach (MenuItem mi in mainMenu.MenuItems)
            {
                System.Diagnostics.Debug.WriteLine(mi.Text);

                mainNode.Text = mi.Text;

                TreeNode tn = MenuItemTraverse(mi);

                mainNode.Nodes.Add(tn);
            }

            treeView.Nodes.Add(mainNode);

            return treeView;
        }

        private TreeNode MenuItemTraverse(MenuItem menuItem)
        {
            TreeNode treeNode = new TreeNode();

            foreach(MenuItem mi in menuItem.MenuItems)
            {
                System.Diagnostics.Debug.WriteLine(mi.Text);

                treeNode.Text = mi.Text;

                TreeNode tr = MenuItemTraverse(mi);

                if (tr!=null && tr.Text != "")
                {
                    treeNode.Nodes.Add(tr);
                }
            }

            return treeNode;
        }
    }

Aber das funktioniert nicht.

Was kann das Problem sein?

War es hilfreich?

Lösung

Ich denke, es gibt zwei Probleme bei den Verfahren. Beginnen wir mit dem MenuItemTraverse Methode beginnen. Sie erhalten einen MenuItem als Eingabe. Sie deklarieren eine TreeNode Variable und eine neue TreeNode Instanz zuweisen. Dann sind Sie Schleife über die Unterpunkte des Menüpunkt. Für jede Iteration Sie den Text aus dem Unterpunkt zum TreeNode zuweisen (Ich würde davon ausgehen, dass Sie den Text des eingehenden Menüpunktes auf dieser TreeNode wollen würden). Um das gewünschte Verhalten zu bekommen, sollten Sie diese Zeile aus der Schleife entfernen:

treeNode.Text = mi.Text;

... und fügen Sie diese Zeile vor der Schleife:

treeNode.Text = menuItem.Text;

Es sieht aus wie Sie genau die gleiche Problem in den MenuTraverse Verfahren haben, so dass es die gleiche Änderung tun. Ich denke, dass lösen würde es für Sie (nicht den Code testen doch, vielleicht etwas übersehen haben)

.

Aktualisieren

gab ich ihm ein bisschen obwohl, da ich, dass der Code fühlte wohl ein wenig vereinfacht werden könnte, und das ist, was ich kam mit. Anstelle der für MainMenu und MenuItem Eingang zwei verschiedene Verfahren aufweisen, kapselt diese ein das Verfahren in einem einzigen Verfahren. Außerdem dauert es eine TreeNodeCollection, was bedeutet, dass Sie die Methode, um die Menüstruktur in eine bereits bestehenden (und bevölkert) TreeView Kontrolle injizieren haben können, auf jeder Ebene im Baum.

public class MenuExtractionUtility
{
    public static void MenuItemTraverse(TreeNodeCollection parentCollection, Menu.MenuItemCollection menuItems)
    {
        foreach (MenuItem mi in menuItems)
        {
            System.Diagnostics.Debug.WriteLine(mi.Text);
            TreeNode menuItemNode = parentCollection.Add(mi.Text);
            if (mi.MenuItems.Count > 0)
            {
                MenuItemTraverse(menuItemNode.Nodes, mi.MenuItems);
            }
        }
    }
}

Anwendungsbeispiel:

treeView1.Nodes.Clear();
MenuExtractionUtility.MenuItemTraverse(treeView1.Nodes, mainMenu1.MenuItems);

Dieser Code wurde nur schnell zusammen, so können Sie wollen „stabilisieren“ es ist ein bisschen von null überprüft das Hinzufügen und ähnliche.

Andere Tipps

hier ist es ...

public class MenuExtractionUtility
    {
        public void MenuTraverse(MainMenu mainMenu, TreeView treeView)
        {
            TreeNode ultimateMainNode = new TreeNode();
            ultimateMainNode.Text = "Root";

            TreeNode mainNode = null;

            foreach (MenuItem mi in mainMenu.MenuItems)
            {
                if (mi != null && mi.Text != "")
                {
                    mainNode = null;

                    if (mi.MenuItems.Count <= 0)
                    {
                        mainNode = new TreeNode();
                        mainNode.Text = mi.Text;
                    }
                    else if (mi.MenuItems.Count > 0)
                    {
                        mainNode = MenuItemTraverse(mi);
                    }

                    ultimateMainNode.Nodes.Add(mainNode);
                }
            }

            treeView.Nodes.Add(ultimateMainNode);
        }

        private TreeNode MenuItemTraverse(MenuItem menuItem)
        {
            TreeNode treeNode = new TreeNode();
            System.Diagnostics.Debug.Write(menuItem.Text+",");
            treeNode.Text = menuItem.Text;

            foreach (MenuItem mi in menuItem.MenuItems)
            {
                if (mi != null && mi.Text != "")
                {
                    TreeNode tr = MenuItemTraverse(mi);

                    if (tr != null && tr.Text != "")
                    {
                        treeNode.Nodes.Add(tr);
                    }
                }
            }

            return treeNode;
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top