C# - TreeView construcción
-
20-08-2019 - |
Pregunta
Estoy tratando de construir un TreeView desde un Menú.Mi Código es este:
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;
}
}
Pero esto no está funcionando.
¿Cuál puede ser el problema?
Solución
Creo que hay dos problemas en los métodos.Vamos a empezar con el MenuItemTraverse
método.Usted obtener un MenuItem
como entrada.Se declara una TreeNode
variable, y asignar una nueva TreeNode
instancia.Entonces usted bucle sobre el elemento de menú de la sub elementos.Para cada iteración de asignar el texto de la sub elemento a la TreeNode
(Quiero suponer que usted desea que el texto de la entrada de elemento de menú en este TreeNode
).Para obtener la intención de comportamiento que debe eliminar esta línea del bucle:
treeNode.Text = mi.Text;
...y añadir esta línea antes de que el bucle:
treeNode.Text = menuItem.Text;
Parece que tienes el mismo problema que en el MenuTraverse
método, por lo que hacer el mismo cambio.Creo que podría resolver por ti (no probar el código, sin embargo;podría haber perdido algo).
Actualización
Me dio un poco de pesar, ya que sentía que el código podría probablemente ser simplificado un poco, y esto es lo que se me ocurrió.En lugar de tener dos métodos diferentes para MainMenu
y MenuItem
de entrada, este encapsula el proceso en un solo método.Asimismo, se tarda un TreeNodeCollection
, que significa que usted puede tener el método de inyectar la estructura del menú en una ya existente (y pobladas) TreeView
de control, en cualquier nivel en el árbol.
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);
}
}
}
}
Ejemplo de uso:
treeView1.Nodes.Clear();
MenuExtractionUtility.MenuItemTraverse(treeView1.Nodes, mainMenu1.MenuItems);
Este código se acaba de armar, así que usted puede querer para "estabilizar" un poco por la adición de nulos cheques y similares.
Otros consejos
aquí 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;
}