C# 将二叉树转换为MenuStrip

C# 将二叉树转换为MenuStrip,c#,winforms,tree,submenu,menustrip,C#,Winforms,Tree,Submenu,Menustrip,我有一个列表菜单,如: 加载表单时,如何将其转换为MenuStrip,如: 它只是将递归与数据结构逻辑结合使用。在回答问题之前,我有一些建议: 它不是二叉树,它是普通树 应该在中使用英文命名参数,以便获得充分支持,此外,它甚至不违反命名约定规则:) 我假设您的模型如下: public class MenuResponse { public string Name { get; set; } public MenuResponse Parent { get; set; }

我有一个
列表
菜单,如:

加载表单时,如何将其转换为
MenuStrip
,如:


它只是将递归与数据结构逻辑结合使用。在回答问题之前,我有一些建议:

  • 它不是二叉树,它是普通树
  • 应该在中使用英文命名参数,以便获得充分支持,此外,它甚至不违反命名约定规则:)
我假设您的模型如下:

public class MenuResponse
{
    public string Name { get; set; }
    public MenuResponse Parent { get; set; }
    public List<MenuResponse> Childrens { get; set; }
}
CreateMenuStrips
在顶行创建菜单,
CreateDropDownMenus
使用递归创建项

    public void CreateMenuStrips(MenuResponse root)
    {
        foreach (var child in root.Childrens)
        {
            var menu = new ToolStripMenuItem(child.Name);
            CreateDropDownMenus(child, menu);
            baseMenuStrip.Items.Add(menu);
        }
    }

    public void CreateDropDownMenus(MenuResponse menuRes, ToolStripMenuItem menu)
    {
        if (menuRes.Childrens == null)
            return;

        foreach (var child in menuRes.Childrens)
        {
            var childMenu = menu.DropDownItems.Add(child.Name);
            CreateDropDownMenus(child, childMenu as ToolStripMenuItem);
        }
    }
结果


我为任何想测试的人实现了数据功能

public static class MenuUtils
{
    public static MenuResponse AddChildMenu(this MenuResponse menu, string name)
    {
        if (menu.Childrens is null)
            menu.Childrens = new List<MenuResponse>();

        MenuResponse newMenu = new MenuResponse();
        newMenu.Name = name;
        newMenu.Parent = menu;

        menu.Childrens.Add(newMenu);
        return newMenu;
    }

    public static MenuResponse AddSiblingMenu(this MenuResponse menu, string name)
    {
        return menu.Parent.AddChildMenu(name);
    }
}
公共静态类菜单
{
公共静态菜单响应AddChildMenu(此菜单响应菜单,字符串名称)
{
如果(menu.Childrens为空)
menu.Childrens=新列表();
MenuResponse newMenu=新建MenuResponse();
newMenu.Name=Name;
newMenu.Parent=菜单;
menu.Childrens.Add(newMenu);
返回新菜单;
}
公共静态菜单响应AddSiblingMenu(此菜单响应菜单,字符串名称)
{
返回菜单.Parent.AddChildMenu(名称);
}
}
创建数据

    MenuResponse root = new MenuResponse();
    root.Name = "Root";
    root.Childrens = new List<MenuResponse>(); 


    root.AddChildMenu("Feature")
            .AddChildMenu("Feature 1")
            .AddSiblingMenu("Feature 2")
                .AddChildMenu("Feature 2.1").Parent
            .AddSiblingMenu("Feature 3")
                .AddChildMenu("Feature 3.1")
                .AddSiblingMenu("Feature 3.2")
                    .AddChildMenu("Feature 3.2.1");

    root.AddChildMenu("Test")
            .AddChildMenu("Test 1")
                .AddChildMenu("Test 1.1")
                    .AddChildMenu("Test 1.1.1")
                    .AddSiblingMenu("Test 1.1.2");
menureResponse root=new menureResponse();
root.Name=“root”;
root.Childrens=新列表();
root.AddChildMenu(“功能”)
.AddChildMenu(“功能1”)
.AddSiblingMenu(“功能2”)
.AddChildMenu(“功能2.1”)。父项
.AddSiblingMenu(“功能3”)
.AddChildMenu(“功能3.1”)
.AddSiblingMenu(“功能3.2”)
.AddChildMenu(“功能3.2.1”);
root.AddChildMenu(“测试”)
.AddChildMenu(“测试1”)
.AddChildMenu(“测试1.1”)
.AddChildMenu(“测试1.1.1”)
.AddSiblingMenu(“测试1.1.2”);
列表中是否仅包含
功能
菜单项,还是还包括其他菜单项(
测试
-
测试
)?
    MenuResponse root = new MenuResponse();
    root.Name = "Root";
    root.Childrens = new List<MenuResponse>(); 


    root.AddChildMenu("Feature")
            .AddChildMenu("Feature 1")
            .AddSiblingMenu("Feature 2")
                .AddChildMenu("Feature 2.1").Parent
            .AddSiblingMenu("Feature 3")
                .AddChildMenu("Feature 3.1")
                .AddSiblingMenu("Feature 3.2")
                    .AddChildMenu("Feature 3.2.1");

    root.AddChildMenu("Test")
            .AddChildMenu("Test 1")
                .AddChildMenu("Test 1.1")
                    .AddChildMenu("Test 1.1.1")
                    .AddSiblingMenu("Test 1.1.2");