Domanda

Sto cercando di costruire un TreeView da un menu. Il mio codice è così:

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

Ma questo non funziona.

Quale può essere il problema?

È stato utile?

Soluzione

Penso che ci siano due problemi nei metodi. Cominciamo con il metodo MenuItemTraverse. Si ottiene un MenuItem come input. Dichiarate una TreeNode variabile e vi assegnate una nuova MenuTraverse istanza. Quindi passa in rassegna le voci secondarie della voce di menu. Per ogni iterazione si assegna il testo dalla voce secondaria a MainMenu (suppongo che si desideri il testo della voce di menu in arrivo su questo TreeNodeCollection). Per ottenere il comportamento previsto, è necessario rimuovere questa riga dal ciclo:

treeNode.Text = mi.Text;

... e aggiungi questa riga prima del ciclo:

treeNode.Text = menuItem.Text;

Sembra che tu abbia lo stesso identico problema nel metodo TreeView, quindi fai la stessa modifica lì. Penso che lo risolverebbe per te (non ho ancora testato il codice; potrebbe essersi perso qualcosa).

Aggiorna

L'ho dato un po ', però, poiché ho pensato che probabilmente il codice potesse essere semplificato un po', e questo è quello che mi è venuto in mente. Invece di avere due diversi metodi per l'input <=> e <=>, questo incapsula il processo in un unico metodo. Inoltre, ci vuole un <=>, il che significa che puoi avere il metodo per iniettare la struttura del menu in un controllo <=> già esistente (e popolato), a qualsiasi livello nella struttura.

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

Esempio di utilizzo:

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

Questo codice è stato messo insieme rapidamente, quindi potresti voler " stabilizzare " un po 'aggiungendo controlli null e simili.

Altri suggerimenti

eccolo ...

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;
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top