2009-06-28 79 views
0

我想从菜单构造一个TreeView。我的代码是这样的:C# - 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; 
     } 
    } 

但是这是行不通的。

可能是什么问题?

+0

WTF在反对投票?这些人通过投票而认为他们是什么? – 2009-06-28 14:48:58

+0

我的猜测是downvote来自主要由代码清单组成的问题,而没有提供关于它不工作的详细信息。但我个人不喜欢低调而不给理由;如果没有指出缺点是什么,就很难纠正帖子中的缺陷。 – 2009-06-28 15:30:48

回答

1

我认为这个方法有两个问题。我们从MenuItemTraverse方法开始。你得到一个MenuItem作为输入。您声明一个TreeNode变量,并为其分配一个新的TreeNode实例。然后你遍历菜单项的子项。对于每次迭代,您都可以将子项中的文本分配到TreeNode(我假设您需要此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); 

此代码只是迅速放在一起,所以你可能要“稳定”这一点通过添加null检查和类似。

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; 
     }