2009-03-02 12 views
0

J'ai une vue arborescente où, lors de la sélection d'un nœud, les attributs et les valeurs doivent être affichés dans la listbox.
Dans treeView1_AfterSelect, le code d'analyse de texte dépend de la représentation textuelle d'un nœud dans l'arborescence, qui peut être modifiée à tout moment et interrompre toute la logique d'affichage de la liste. Cette forte dépendance entre l'arborescence et l'affichage de la liste doit être éliminée en liant les nœuds de l'arborescence aux nœuds du document XML, afin que les données Xml brutes puissent être utilisées pour afficher le texte dans la liste. Que dois-je écrire ici?Comment afficher les treenodes en liant des nœuds dans l'arborescence aux nœuds du document XML

private static void AddingNodesToTree(XmlNode xmlNode,TreeNode tnode) 
     { 
      //Adding nodes to tree while looping through the entire XML file 
      if (xmlNode.HasChildNodes) 
      { 
       XmlNodeList nodeList = xmlNode.ChildNodes;     
       for (int i = 0; i <= nodeList.Count - 1; i++) 
       { 
        XmlNode xmladdtreeNode = xmlNode.ChildNodes[i]; 
        String nodetype = "" + xmladdtreeNode.NodeType; 
        if (nodetype.Equals("Text") || nodetype.Equals("Comment"))  
        { 
        tnode.Nodes.Add(new TreeNode(xmladdtreeNode.InnerText));   
        } 
        else              
        { 
         String name = "<" + xmladdtreeNode.Name; 
         XmlAttributeCollection attCol = xmladdtreeNode.Attributes; 
         foreach (XmlAttribute xmlatt in attCol) 
         { 
         name += " " + xmlatt.Name + "=\"" + xmlatt.Value + "\""; 
         } 
         name += ">"; 
         TreeNode tn = new TreeNode(xmladdtreeNode.Name); 
         tn.Text = name; 
         tnode.Nodes.Add(tn); 
         TreeNode treeNode = tnode.Nodes[i]; 
         AddingNodesToTree(xmladdtreeNode,treeNode); 
         } 
       }//for 
      }//if 
      else 
      { 
       tnode.Text = xmlNode.OuterXml.Trim(); 
      }//else 
     }//AddingNodesToTree 
     //To show Attributes and values of selected Nodes. 
     private void treeView1_AfterSelect(object sender,TreeViewEventArgs e) 
     { 
      TreeNode treenode = e.Node; //Node selected in Treeview    
      String text = treenode.Text; 
      String relevent = text; 
      Boolean flag = true; 
      while (flag) 
      { 
       int SpaceIndex = relevent.IndexOf(" "); 
       if (SpaceIndex != -1) 
       { 
        int indexofEqual = relevent.IndexOf('=', SpaceIndex); 
        if (indexofEqual != -1) 
        { 
         int indexOFValue = relevent.IndexOf("\"", indexofEqual + 2); 
         if (indexOFValue != -1) 
         { 
    String attribute = relevent.Substring(SpaceIndex + 1, indexofEqual - SpaceIndex - 1); 
    String value = relevent.Substring(indexofEqual + 2, indexOFValue - indexofEqual - 2); 
    listBox1.Items.Add("Attribute : " + attribute + " Value : " + value);     
          relevent = relevent.Substring(indexOFValue); 
         } 
         else 
         { 
         listBox1.Items.Add("Bad format of the xml file for this node"); 
         flag = false; 
         } 
        } 
        else 
        { 
         flag = false; 
        } 
       } 
       else 
       { 
        flag = false; 
       } 
      } 
     }//AfterSelect() 

Merci ....

Répondre

0

Si je comprends bien la question que vous voulez revenir à la XmlNode quand TreeNode est sélectionné. La solution habituelle est de stocker XmlNode dans la propriété Tag:

TreeNode tn = new TreeNode(); 
tn.Text = name; 
tn.Tag = xmladdtreeNode; 

et dans le AfterSelect

TreeNode treenode = e.Node; 
XmlNode xmlNode = (XmlNode) treeNode.Tag; 
+0

Veuillez regarder la réponse à ce que vous m'avez donné la syntaxe. –

+0

Pouvez-vous me dire où je me suis trompé ?? –

0

j'ai essayé cela, mais eu le NullRefrenceException à cette ligne foreach (XmlAttribute xmlatt à attCol) sur attcol

C'est le code que je l'ai écrit ..

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) 
    { 
     listBox1.Items.Clear(); 
     XmlNode xNode = e.Node.Tag as XmlNode; 
     XmlAttributeCollection attCol = xNode.Attributes; 
     foreach (XmlAttribute xmlatt in attCol) 
     { 
      listBox1.Items.Add(xmlatt.Name); 
      listBox1.Items.Add(xmlatt.Value); 

     } 
    } //AfterSelect() 
+0

Si c'est en effet sur la ligne foreach que le seul candidat est attCol. Dis que vous jetez un oeil avec le débogueur? Serait-ce simplement que certains XmlNodes n'ont aucun attribut? Vous ne le permettez pas pour le moment. –

+0

Merci j'ai eu l'erreur où je me trompais et le corrige aussi. –