2009-06-28 7 views
0

J'essaye de construire un TreeView à partir d'un menu. Mon code est comme ceci:C# - Construction 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; 
     } 
    } 

Mais ceci ne fonctionne pas.

Quel peut être le problème?

+0

WTF au vote vers le bas? Qu'est-ce que ces gens pensent d'eux en votant contre? –

+0

Ma conjecture est que le downvote est venu de la question en grande partie constitué d'une liste de code sans une information détaillée sur la façon dont cela ne fonctionne pas. Mais personnellement, je n'aime pas downvoting sans donner de raisons; il est difficile de corriger les lacunes dans un poste s'il n'y a pas d'indication de la lacune. –

Répondre

1

Je pense qu'il y a deux problèmes dans les méthodes. Commençons par la méthode MenuItemTraverse. Vous obtenez un MenuItem en entrée. Vous déclarez une variable TreeNode et lui attribuez une nouvelle instance TreeNode. Ensuite, vous passez en boucle sur les sous-éléments de l'élément de menu. Pour chaque itération, vous affectez le texte du sous-élément au TreeNode (je suppose que vous voulez le texte de l'élément de menu entrant sur ce TreeNode). Pour obtenir le comportement souhaité vous devez supprimer cette ligne de la boucle:

treeNode.Text = mi.Text; 

... et ajoutez cette ligne avant la boucle:

treeNode.Text = menuItem.Text; 

Il semble que vous avez le même problème dans le MenuTraverse méthode, faites le même changement là-bas. Je pense que cela le résoudrait pour vous (n'a pas encore testé le code, aurait pu manquer quelque chose).

Mise à jour

Je lui ai donné un peu de bien, car je sentais que le code pourrait probablement être un peu simplifié, ce qui est ce que je suis venu avec. Au lieu d'avoir deux méthodes différentes pour l'entrée MainMenu et MenuItem, celle-ci encapsule le processus en une seule méthode. En outre, cela prend un TreeNodeCollection, ce qui signifie que vous pouvez faire en sorte que la méthode injecte la structure du menu dans un contrôle TreeView déjà existant (et rempli), à n'importe quel niveau de l'arborescence.

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

Exemple d'utilisation:

treeView1.Nodes.Clear(); 
MenuExtractionUtility.MenuItemTraverse(treeView1.Nodes, mainMenu1.MenuItems); 

Ce code a été tout simplement mis rapidement ensemble, de sorte que vous pouvez « stabiliser » un peu en ajoutant des contrôles et même nuls.

+0

Désolé j'étais occupé à tester votre code. Excellent travail @Fredrik! En attendant, je suis venu avec mon propre copain corrections! –

0

ici est ...

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