题
我要建从菜单一个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;
}
}
但是,这是行不通的。
可以采取什么问题?
解决方案
我认为有在这些方法中的两个问题。让我们先从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);
此代码只是迅速放在一起,所以你可能要“稳定”这一点通过添加null检查和类似的。
其他提示
在这里它是...
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;
}
不隶属于 StackOverflow