2009-06-28 78 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; 
     }