Question

J'essaie de construire une TreeView à partir d'un menu. Mon code est comme ça:

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

Mais cela ne fonctionne pas.

Quel peut être le problème?

Était-ce utile?

La solution

Je pense que les méthodes posent deux problèmes. Commençons par la méthode MenuItemTraverse. Vous obtenez un MenuItem en entrée. Vous déclarez une variable TreeNode et lui affectez une nouvelle instance MenuTraverse. Ensuite, vous passez en boucle sur les sous-éléments de l'élément de menu. Pour chaque itération, vous affectez le texte du sous-élément au MainMenu (je suppose que vous voudriez que le texte de l'élément de menu entrant apparaisse sur ce TreeNodeCollection). Pour obtenir le comportement souhaité, vous devez supprimer cette ligne de la boucle:

treeNode.Text = mi.Text;

... et ajoutez cette ligne avant la boucle:

treeNode.Text = menuItem.Text;

Il semble que vous ayez exactement le même problème dans la méthode TreeView, donc effectuez les mêmes modifications ici. Je pense que cela résoudrait votre problème (vous n'avez pas encore testé le code; vous auriez peut-être oublié quelque chose).

Mettre à jour

J'en ai cependant fait un peu, car je pensais que le code pourrait probablement être un peu simplifié, et c'est ce que j'ai proposé. Au lieu d’avoir deux méthodes différentes pour les entrées <=> et <=>, celle-ci encapsule le processus en une seule méthode. De plus, il faut un <=>, ce qui signifie que la méthode peut injecter la structure de menus dans un contrôle existant (et rempli) <=>, à n’importe quel niveau de l’arborescence.

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

Exemple d'utilisation:

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

Ce code a été rapidement mis en place, vous voudrez peut-être & "stabiliser &"; un peu en ajoutant des contrôles nuls et similaires.

Autres conseils

ici c'est ...

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;
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top