Pregunta

Estoy tratando de construir un TreeView desde un Menú.Mi Código es este:

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

Pero esto no está funcionando.

¿Cuál puede ser el problema?

¿Fue útil?

Solución

Creo que hay dos problemas en los métodos.Vamos a empezar con el MenuItemTraverse método.Usted obtener un MenuItem como entrada.Se declara una TreeNode variable, y asignar una nueva TreeNode instancia.Entonces usted bucle sobre el elemento de menú de la sub elementos.Para cada iteración de asignar el texto de la sub elemento a la TreeNode (Quiero suponer que usted desea que el texto de la entrada de elemento de menú en este TreeNode).Para obtener la intención de comportamiento que debe eliminar esta línea del bucle:

treeNode.Text = mi.Text;

...y añadir esta línea antes de que el bucle:

treeNode.Text = menuItem.Text;

Parece que tienes el mismo problema que en el MenuTraverse método, por lo que hacer el mismo cambio.Creo que podría resolver por ti (no probar el código, sin embargo;podría haber perdido algo).

Actualización

Me dio un poco de pesar, ya que sentía que el código podría probablemente ser simplificado un poco, y esto es lo que se me ocurrió.En lugar de tener dos métodos diferentes para MainMenu y MenuItem de entrada, este encapsula el proceso en un solo método.Asimismo, se tarda un TreeNodeCollection, que significa que usted puede tener el método de inyectar la estructura del menú en una ya existente (y pobladas) TreeView de control, en cualquier nivel en el árbol.

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

Ejemplo de uso:

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

Este código se acaba de armar, así que usted puede querer para "estabilizar" un poco por la adición de nulos cheques y similares.

Otros consejos

aquí 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top