Pergunta

Eu estou tentando construir um TreeView a partir de um Menu. Meu código é assim:

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

Mas isso não está funcionando.

O que pode ser o problema?

Foi útil?

Solução

Eu acho que existem dois problemas nos métodos. Vamos começar com o método MenuItemTraverse. Você ganha um MenuItem como entrada. Você declarar uma variável TreeNode, e atribuir uma nova instância TreeNode a ele. Então você loop sobre subitens do item do menu. Para cada iteração você atribuir o texto da sub item para o TreeNode (eu diria que você iria querer o texto do item de menu de entrada neste TreeNode). Para obter o comportamento desejado você deve remover esta linha do loop:

treeNode.Text = mi.Text;

... e adicionar esta linha antes do loop:

treeNode.Text = menuItem.Text;

Parece que você tem exatamente o mesmo problema no método MenuTraverse, então, fazer a mesma mudança lá. Eu acho que seria resolver isso para você (não testar o código ainda, poderia ter perdido alguma coisa)

.

Atualizar

Eu dei-lhe um pouco de que, desde que eu senti que o código provavelmente poderia ser simplificado um pouco, e isso é o que eu vim acima com. Em vez de ter dois métodos diferentes para MainMenu e entrada MenuItem, este um encapsula o processo em um único método. Além disso, é preciso um TreeNodeCollection, o que significa que você pode ter o método de injeção a estrutura do menu em um controle TreeView já existente (e ocupado), em qualquer nível na árvore.

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

Exemplo de uso:

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

Este código foi apenas rapidamente colocar juntos, então você pode querer "estabilizar" um pouco adicionando verificações nulos e similar.

Outras dicas

aqui 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;
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top