C # - Конструкция TreeView - PullRequest
0 голосов
/ 28 июня 2009

Я пытаюсь построить 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;
        }
    }

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

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

Ответы [ 2 ]

1 голос
/ 28 июня 2009

Я думаю, что есть две проблемы в методах. Давайте начнем с метода 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);

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

0 голосов
/ 28 июня 2009

вот оно ...

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