2009-06-28 16 views
0

メニューからTreeViewを構築しようとしています。私のコードは次のようなものです:C# - ツリービューの構築

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?この人々が投票することによって彼らのことをどう思いますか? –

+0

私の推測では、ダウンボートは、どのように動作しないのかについての詳細な情報がないコードリストで構成されている質問から来たものです。しかし、私は個人的に理由を述べることなくdownvotingを嫌っています。欠点が何であるかを明示していなければ、投稿の欠点を修正するのは難しいです。 –

答えて

1

私は方法に2つの問題があると思います。 MenuItemTraverseメソッドから始めましょう。あなたはMenuItemを入力します。 TreeNode変数を宣言し、新しいTreeNodeインスタンスを割り当てます。次に、メニュー項目のサブ項目をループします。反復ごとに、サブ項目のテキストをTreeNodeに割り当てます(これは受信メニュー項目のテキストをTreeNodeにしたいと思うでしょう)。意図した動作を取得するには、ループからこの行を削除する必要があります。

treeNode.Text = mi.Text; 

...とループの前に次の行を追加します。

treeNode.Text = menuItem.Text; 

あなたは正確に同じ問題を抱えているように見えますMenuTraverseメソッドも同様です。私はそれがあなたのためにそれを解決すると思う(まだコードをテストしなかった;何かが逃した可能性があります)。

更新

私は、コードはおそらくビットを簡素化することができることを感じましたし、これは私が思い付いたものですので、私は、それをしかし少しを与えました。 MainMenuMenuItemの2つの異なるメソッドを持つ代わりに、このメソッドは1つのメソッドにプロセスをカプセル化します。また、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

申し訳ありませんあなたのコードをテストしていました。優れた仕事@Fredrik! 私は自分の訂正のバディを思いついた! –

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; 
     } 
関連する問題