0

我正在尝试从菜单构建 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;
        }
    }

但这不起作用。

可能是什么问题?

4

2 回答 2

1

我认为方法有两个问题。让我们从MenuItemTraverse方法开始。你得到一个MenuItem作为输入。您声明一个TreeNode变量,并为其分配一个新TreeNode实例。然后循环遍历菜单项的子项。对于每次迭代,您将子项中的文本分配给TreeNode(我假设您希望传入菜单项的文本在 this 上TreeNode)。要获得预期的行为,您应该从循环中删除此行:

treeNode.Text = mi.Text;

...并在循环之前添加这一行:

treeNode.Text = menuItem.Text;

看起来你在MenuTraverse方法中遇到了完全相同的问题,所以在那里做同样的改变。我认为这会为你解决它(还没有测试代码;可能错过了一些东西)。

更新

不过我给了它一点,因为我觉得代码可能可以简化一点,这就是我想出的。这不是有两种不同的输入方法,而是MainMenuMenuItem过程封装到一个方法中。此外,它需要一个,这意味着您可以让该方法将菜单结构注入到树中任何级别的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);

这段代码很快就放在一起了,所以你可能想通过添加空检查和类似的东西来“稳定”一下它。

于 2009-06-28T13:36:22.517 回答
0

这里是...

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;
        }
于 2009-06-28T14:35:29.150 回答