C # - Costruzione TreeView
-
20-08-2019 - |
Domanda
Sto cercando di costruire un TreeView da un menu. Il mio codice è così:
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;
}
}
Ma questo non funziona.
Quale può essere il problema?
Soluzione
Penso che ci siano due problemi nei metodi. Cominciamo con il metodo MenuItemTraverse
. Si ottiene un MenuItem
come input. Dichiarate una TreeNode
variabile e vi assegnate una nuova MenuTraverse
istanza. Quindi passa in rassegna le voci secondarie della voce di menu. Per ogni iterazione si assegna il testo dalla voce secondaria a MainMenu
(suppongo che si desideri il testo della voce di menu in arrivo su questo TreeNodeCollection
). Per ottenere il comportamento previsto, è necessario rimuovere questa riga dal ciclo:
treeNode.Text = mi.Text;
... e aggiungi questa riga prima del ciclo:
treeNode.Text = menuItem.Text;
Sembra che tu abbia lo stesso identico problema nel metodo TreeView
, quindi fai la stessa modifica lì. Penso che lo risolverebbe per te (non ho ancora testato il codice; potrebbe essersi perso qualcosa).
Aggiorna
L'ho dato un po ', però, poiché ho pensato che probabilmente il codice potesse essere semplificato un po', e questo è quello che mi è venuto in mente. Invece di avere due diversi metodi per l'input <=> e <=>, questo incapsula il processo in un unico metodo. Inoltre, ci vuole un <=>, il che significa che puoi avere il metodo per iniettare la struttura del menu in un controllo <=> già esistente (e popolato), a qualsiasi livello nella struttura.
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);
}
}
}
}
Esempio di utilizzo:
treeView1.Nodes.Clear();
MenuExtractionUtility.MenuItemTraverse(treeView1.Nodes, mainMenu1.MenuItems);
Questo codice è stato messo insieme rapidamente, quindi potresti voler " stabilizzare " un po 'aggiungendo controlli null e simili.
Altri suggerimenti
eccolo ...
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;
}