C # - TreeView Bau
-
20-08-2019 - |
Frage
Ich versuche, ein TreeView aus einem Menü zu konstruieren. Mein Code ist wie folgt:
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;
}
}
Aber das funktioniert nicht.
Was kann das Problem sein?
Lösung
Ich denke, es gibt zwei Probleme bei den Verfahren. Beginnen wir mit dem MenuItemTraverse
Methode beginnen. Sie erhalten einen MenuItem
als Eingabe. Sie deklarieren eine TreeNode
Variable und eine neue TreeNode
Instanz zuweisen. Dann sind Sie Schleife über die Unterpunkte des Menüpunkt. Für jede Iteration Sie den Text aus dem Unterpunkt zum TreeNode
zuweisen (Ich würde davon ausgehen, dass Sie den Text des eingehenden Menüpunktes auf dieser TreeNode
wollen würden). Um das gewünschte Verhalten zu bekommen, sollten Sie diese Zeile aus der Schleife entfernen:
treeNode.Text = mi.Text;
... und fügen Sie diese Zeile vor der Schleife:
treeNode.Text = menuItem.Text;
Es sieht aus wie Sie genau die gleiche Problem in den MenuTraverse
Verfahren haben, so dass es die gleiche Änderung tun. Ich denke, dass lösen würde es für Sie (nicht den Code testen doch, vielleicht etwas übersehen haben)
Aktualisieren
gab ich ihm ein bisschen obwohl, da ich, dass der Code fühlte wohl ein wenig vereinfacht werden könnte, und das ist, was ich kam mit. Anstelle der für MainMenu
und MenuItem
Eingang zwei verschiedene Verfahren aufweisen, kapselt diese ein das Verfahren in einem einzigen Verfahren. Außerdem dauert es eine TreeNodeCollection
, was bedeutet, dass Sie die Methode, um die Menüstruktur in eine bereits bestehenden (und bevölkert) TreeView
Kontrolle injizieren haben können, auf jeder Ebene im Baum.
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);
}
}
}
}
Anwendungsbeispiel:
treeView1.Nodes.Clear();
MenuExtractionUtility.MenuItemTraverse(treeView1.Nodes, mainMenu1.MenuItems);
Dieser Code wurde nur schnell zusammen, so können Sie wollen „stabilisieren“ es ist ein bisschen von null überprüft das Hinzufügen und ähnliche.
Andere Tipps
hier ist es ...
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;
}