Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-树景结构_C#_Treeview_Menu_Contextmenu - Fatal编程技术网

C#-树景结构

C#-树景结构,c#,treeview,menu,contextmenu,C#,Treeview,Menu,Contextmenu,我正试图从菜单构建一个树状视图。我的代码如下: public class MenuExtractionUtility { public TreeView MenuTraverse(MainMenu mainMenu) { TreeView treeView = new TreeView(); TreeNode mainNode = new TreeNode(); foreach (

我正试图从菜单构建一个树状视图。我的代码如下:

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;
…并在循环之前添加此行:

treeNode.Text = mi.Text;
treeNode.Text = menuItem.Text;
MenuTraverse
方法中,您似乎遇到了完全相同的问题,因此在这里进行相同的更改。我认为这会为您解决问题(尚未测试代码;可能遗漏了一些内容)

更新

我给了它一点建议,因为我觉得代码可以简化一点,这就是我的想法。对于
main menu
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;
        }
公共类菜单提取功能
{
公共无效菜单撤销(主菜单主菜单,树视图树视图)
{
TreeNode ultimateMainNode=新的TreeNode();
ultimateMainNode.Text=“Root”;
TreeNode mainNode=null;
foreach(主菜单中的MenuItem mi.MenuItems)
{
如果(mi!=null&&mi.Text!=“”)
{
mainNode=null;
如果(mi.MenuItems.Count 0)
{
mainNode=MenuItemTraverse(mi);
}
ultimateMainNode.Nodes.Add(主节点);
}
}
添加(ultimateMainNode);
}
私有树节点MenuItemTraverse(MenuItem MenuItem)
{
TreeNode TreeNode=新的TreeNode();
System.Diagnostics.Debug.Write(menuItem.Text+“,”);
treeNode.Text=menuItem.Text;
foreach(MenuItem.MenuItems中的MenuItem mi)
{
如果(mi!=null&&mi.Text!=“”)
{
TreeNode tr=菜单项遍历(mi);
如果(tr!=null&&tr.Text!=“”)
{
treeNode.Nodes.Add(tr);
}
}
}
返回树节点;
}

对不起,我正忙着测试你的代码。干得好@Fredrik!与此同时,我找到了我自己的更正好友!WTF在否决投票中?这些人通过否决投票对他们有什么看法?我猜否决投票主要来自一个问题,其中包括一个代码列表,没有详细说明它以何种方式不起作用。但是我个人不喜欢不给出理由就投否决票;如果没有说明缺点是什么,就很难纠正帖子中的缺点。