2012-12-13 5 views
1

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!

Répondre

2

Il me semble que vous pouvez traiter les nœuds parents après le traitement des nœuds enfants. De cette façon, vous pouvez gérer les branches avec toutes les feuilles supprimées:

//DISCLAIMER: I didn't compile or test this method. 
void TrimTree(TreeNodeCollection nodes, List<string> l) 
{ 
    TreeNode node = null; 
    for (int ndx = nodes.Count; ndx > 0; ndx--) 
    { 
     node = nodes[ndx - 1]; 
     TrimTree(node.ChildNodes, l); 
     if (node.ChildNodes.Count == 0 && !l.Contains(node.Value)) 
      nodes.Remove(node); 
    } 
} 
+0

Cela a fait l'affaire! –

+0

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! –

+0

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) –

Questions connexes