Вопрос

Я пытаюсь создать TreeView из меню.Мой код выглядит следующим образом:

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

Но это не работает.

В чем может быть проблема?

Это было полезно?

Решение

Я думаю, что в методах есть две проблемы.Давайте начнем с MenuItemTraverse способ.Вы получаете MenuItem в качестве входных данных.Вы заявляете, что TreeNode переменную, и назначьте новую TreeNode пример к нему.Затем вы перебираете подпункты пункта меню.Для каждой итерации вы присваиваете текст из подпункта TreeNode (Я бы предположил, что вам нужен текст входящего пункта меню на этом TreeNode).Чтобы получить желаемое поведение, вы должны удалить эту строку из цикла:

treeNode.Text = mi.Text;

...и добавьте эту строку перед циклом:

treeNode.Text = menuItem.Text;

Похоже, у вас точно такая же проблема в MenuTraverse метод, так что сделайте то же самое изменение и там.Я думаю, что это решило бы проблему для вас (еще не тестировал код;возможно, я что-то пропустил).

Обновить

Однако я немного поработал над этим, так как чувствовал, что код, вероятно, можно было бы немного упростить, и вот что я придумал.Вместо того, чтобы иметь два разных метода для MainMenu и MenuItem ввод, этот инкапсулирует процесс в один единственный метод.Кроме того, для этого требуется TreeNodeCollection, что означает, что вы можете использовать метод для внедрения структуры меню в уже существующую (и заполненную) TreeView управление на любом уровне дерева.

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

Пример использования:

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

Этот код был просто быстро собран, поэтому вы можете захотеть немного "стабилизировать" его, добавив нулевые проверки и тому подобное.

Другие советы

вот оно...

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;
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top