Dans une arborescence C#, je dois supprimer toutes les branches qui ne contiennent pas de valeurs dans une liste dans les feuilles. Par exemple, j'ai une liste {112, 74} et un arbre: La source de données est une table auto-jointe. Donc, je ne peux pas facilement enlever les feuilles et les branches indésirables.Comment supprimer toutes les branches TreeView indésirables
racine Branch1 Feuille 112 Feuille 1 Branch2 Feuille 74 Branch3 Feuille 44 Branch4 Feuille 99
je retrouver avec: racine Branch1 Feuille 112 Branch2 Feuille 74
Voici le code. Cela fonctionne en quelque sorte. Mais le TrimTree supprime seulement le niveau inférieur. J'ai donc besoin d'exécuter cette fonction plusieurs fois pour supprimer complètement toutes les branches vides. TRÈS inefficace.
void GetTree(ref TreeView tv)
{
DataTable dt = c.GetTable("select id, parent_id, name from tbl_self_join_tree");
tv.DataSource = new HierarchicalDataSet(dt, "ID", "Parent_ID");
tv.DataBind();
}
void TrimTree(TreeNodeCollection nodes, List<string> l)
{
TreeNode node = null;
for (int ndx = nodes.Count; ndx > 0; ndx--)
{
node = nodes[ndx - 1];
if (node.ChildNodes.Count == 0 && !l.Contains(node.Value))
nodes.Remove(node);
else
TrimTree(node.ChildNodes, l);
}
}
Si je peux écrire une requête SELECT mieux, alors je ne vais pas besoin de la fonction TrimTree(): D Résolution cela vous aidera beaucoup! Merci beaucoup!
Cela a fait l'affaire! –
Excellent ... Je n'ai pas pensé à traiter les nœuds parents après les nœuds enfants. Cela semble assez efficace, donc je n'ai pas besoin d'écrire une requête SELECT pour l'instant. Merci encore! –
Félicitations @EricNewman! Si vous pensez que votre question a déjà répondu, vous pouvez accepter la réponse. Découvrez la [faq] (http://stackoverflow.com/faq#howtoask) –