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