2011-05-23 3 views
1

J'essaie de remplir un treeview à partir d'un XmlDocument. La racine de l'arbre est définie comme 'Scripts' et à partir de la racine, le niveau suivant doit être 'Departments' qui se trouve dans le script XML. Je peux obtenir des données du document XML sans problème. Ma question est de faire une boucle sur XmlDocument et d'ajouter des nœuds au nœud racine. Je veux m'assurer que si un département est déjà dans l'arborescence, il ne sera pas ajouté à nouveau. Je devrais également ajouter que chaque département a aussi une liste de scripts qui doivent être des nœuds enfants du département.C# Treeview vérifiant si le noeud existe

Mon code à ce jour est:

 XmlDocument xDoc = new XmlDocument(); 
     xDoc.LoadXml(scriptInformation); 
     TreeNode t1; 
     TreeNode rootNode = new TreeNode("Script View"); 
     treeView1.Nodes.Add(rootNode); 
     foreach (XmlNode node in xDoc.SelectNodes("//row")) 
     { 
      t1 = new TreeNode(node["DEPARTMENT"].InnerXml); 
      //How to check if node already exists in treeview? 



     } 

Merci.

Répondre

2
if(treeView1.Nodes.ContainsKey("DEPARTMENT")){ 
//... 
} 

EDIT: Méthode récursive:

bool exists = false; 
     foreach (TreeNode node in treeView1.Nodes) { 
      if (NodeExists(node, "DEPARTMENT")) 
       exists = true; 
     } 
    private bool NodeExists(TreeNode node, string key) { 
     foreach (TreeNode subNode in node.Nodes) { 
      if (subNode.Text == key) { 
       return true; 
      } 
      if (node.Nodes.Count > 0) { 
       NodeExists(node, key); 
      } 
     } 
     return false; 
    } 
+0

Je ne crois pas que ce soit entièrement récursif. En effet, il ne recherche que les nœuds enfants immédiats. – Yuck

+0

Dans ce cas, la méthode récursive peut être facilement créée. – Vale

+0

if (subNode.Text.Equals (clé)) { return sous-noeud; } if (subNode.Nodes.Count> 0) { NodeExists (sous-noeud, clé); } – Akvel

0

Cela dépend de la structure de votre saisie. Puisque vous ne montrez pas exactement comment vous ajoutez vos sous-noeuds, je peux seulement pointer vers Contains ou la méthode ContainsKey de la propriété Nodes, soit de treeView1 elle-même, ou de n'importe quels sous-nœuds que vous ajoutez. Vous devez utiliser une surcharge de la méthode Add pour spécifier un nom de clé pour simplifier la recherche.

1

En fonction de la taille de votre fichier XML, vous pouvez envisager d'utiliser un List associé pour la recherche rapide. Lorsque vous ajoutez chaque nœud au TreeView, ajoutez-le également au List.

1

Vous pouvez faire quelque chose comme ceci:

TreeNode parentNode = t1.Parent; 
if (parentNode != null} 
{ 
    if(parentNode.Nodes.Cast<TreeNode>().ToList().Find(t => t.Text.Equals(node["DEPARTMENT"].InnerXml) == null) 
    { 
     //Add node 
    } 
} 
else 
{ 
    bool isFound = true; 
    if (treeView1.Nodes.Cast<TreeNode>().ToList().Find(t => t.Text.Equals(node["DEPARTMENT"].InnerXml) == null) 
    { 
     isFound = false; 
    } 

    if(!isFound) 
    { 
     //Add node 
    } 
} 
1

Si votre document XML a une structure de jeu où 'départements' seront toujours indexés au 1;

-à-dire:

index:[0] Scripts 
    index:[1] Department 
     index:[2] Script 
    index:[1] Department2 
     index:[2] Script 

Ensuite, vous pouvez résumer le code suivant dans une méthode où « nom » est un paramètre de chaîne et le type de retour est booléen.

foreach (TreeNode node in uxTreeView.Nodes[0].Nodes) { 
    if (node.Name.ToLower() == name.ToLower()) { 
     return true; 
    } 
} 
return false; 

L'idée est que vous appelez cette fonction chaque fois que vous rencontrez un nœud « service » dans votre Xml, avant de créer le TreeNode.

Exemple complet:

private bool DepartmentNodeExists(string name) { 
    foreach (TreeNode node in uxTreeView.Nodes[0].Nodes) { 
     if (node.Name.ToLower() == name.ToLower()) { 
      return true; 
     } 
    } 
    return false; 
} 

Enfin, le facile façon:

private bool DepartmentNodeExists(string name) { 
    if (uxTreeView.Nodes[0].ContainsKey(name)) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

Ce sont tous juste refactorisés et encapsulées dans leurs propres méthodes nommées, bien sûr vous pouvez simplement appeler:

if (uxTreeView.Nodes[0].ContainsKey(name)) { 
    // do not create TreeNode 
} 

... pendant votre analyse de votre XML. PS. Ces exemples supposent tous que vous avez déjà créé le premier nœud racine dans TreeView et que vous l'avez ajouté à TreeView.

1

pas sûr de la structure du document ...
pas Pouvez-vous utiliser LINQ pour Xml, charger le document et obtenir la ligne distincte (ligne = service?) Et envisager seulement ces éléments pour créer un TreeNode? Il est plus efficace que d'essayer de trouver si un nœud avec un tel texte a déjà été ajouté. ex:

var rows =  ( from row in XDocument.Load(document).Root.Elements("row") 
        select row 
       ).Distinct(new SampleElementComparerOnNameAttribute()); 

Ici, le EqualityComparer est fait sur le "nom" valeur d'attribut en supposant la structure de doc être

<rows><row name='dep1'><script>script1</script><script>script2</script></row><row name='dep1'><script>script3</script><script>script4</script></row></rows> 
1

J'utilise,

string department = node["DEPARTMENT"].InnerXml; 
TreeNode node = parentNode.Nodes[department] ?? parentNode.Nodes.Add(department, department); 

Cette ligne garantit qu'un recherche du département de la valeur sera fait en premier, s'il n'est pas trouvé, il le crée. Vous devez faire la double entrée dans Add() donc il aura une valeur de clé que vous pouvez faire la recherche avec le .Nodes[department].

Questions connexes