Xml - TreeView : pb ^^ [Résolu]

Signaler
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007
-
Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
-
Bonjour tout le monde, comment allez-vous dans ce monde de la programmation ^^ ?


J'ai besion de votre aide concernant un petit prog qui utilise des
documents xml et un treeview... j'ai mis ce topic ici, car meme si pour
l'instant mon pb n'est pas totalement sur le xml, je pense que je v en
avoir bientot ;p...


J'ai donc un pb avec le treeview, j'aimerais assigner plusieurs valeurs
pour un node dans le treeview, comme ca on pourrait avoir plusieurs
sortie pour un appel de node...


Javais lu un truc vachement sympa qui permettait de faire la meme chose
avec des listbox, c'était genial, mais je n'arrive pas a trouver de
meme pour les treevieew...


Bon, pour pas vous laisser sans rien sous la dent ^^ je vous passe les infos pour :


J'ai 2 fichiers xml, liste.xml :

<liste>

    <ordinateur poste="nom_du_poste">

       <fonction>fonction_de_lutilisateur</fonction>

       <nom>nom_du_susnommeplushaut</nom>

    </ordinateur>

</liste>


 et groupes.xml :

<triage>

    <organisation nom="org_01">

       <groupe nom="grp_01">

          poste_01



          poste_02


       </groupe>

    </organisation>

</triage>


de plus... j'ai réussi apres pas mal d'echecs (je suis novice en c#) a faire ca... :


XmlDocument doc_xml = new XmlDocument();

            doc_xml.Load("c:/groupes.xml");


            XmlNode
xml_org = doc_xml.DocumentElement.FirstChild; // Organisation côté Xml

            foreach (XmlNode groupe in xml_org.ChildNodes)

            {

           
    XmlNode xml_grp =
doc_xml.DocumentElement.FirstChild.FirstChild; // Groupe côté Xml

           
    TreeNode tre_grp = new
TreeNode(groupe.Attributes["nom"].InnerText); // Groupe côté Tree

                foreach (XmlNode poste in groupe.ChildNodes)

                {

           
        XmlDocument doc_xml_liste = new
XmlDocument();

           
       
doc_xml_liste.Load("c:/liste.xml");


           
        XmlNodeList recherche_poste =
doc_xml_liste.SelectNodes("//ordinateur[@poste='" + poste.InnerText +
"']");

           
        foreach (XmlNode id_poste in
recherche_poste)

                    {

           
           
tre_grp.Nodes.Add(new TreeViewNode(poste.InnerText,
id_poste.FirstChild.InnerXml, id_poste.LastChild.InnerXml));

                    }

                }

                treeView1.Nodes.Add(tre_grp);


Bon, ici le seul pb c'est ca :

tre_grp.Nodes.Add(new TreeViewNode(poste.InnerText, id_poste.FirstChild.InnerXml, id_poste.LastChild.InnerXml));


le fameux truc que j'ai mochement pompé (sur ce site en plus...) et que je n'ai pas réussi a faire marcher avec les treeviews


avez vous des idées ???

14 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
De rien, n'oublie pas de valider les réponses qui t'ont aider.
Sinon pour ton problème, essayes de mettre ça dans le 3ème foreach :

XmlDocument doc_xml_liste =
new
XmlDocument();
doc_xml_liste.Load(
"liste.xml");

XmlNode xml_rot_liste = doc_xml_liste.DocumentElement;

XmlNode recherche_poste = xml_rot_liste.SelectSingleNode(
string.Format(
"ordinateur[@poste='{0}']", poste.InnerText));

if (recherche_poste !=
null)
{
  
foreach (
XmlNode id_poste
in recherche_poste.ChildNodes)
   {
     
TreeNode tre_pst =
new
TreeNode(id_poste.FirstChild.InnerText);
// Création des nodes Postes
      tre_pst.Tag = poste.InnerText +
"," + id_poste.LastChild.InnerXml;
      tre_grp.Nodes.Add(tre_pst);
// Insertion des postes dans les groupes
   }
}

<hr size="2" /> VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Salut,
La méthode Add prendre un TreeNode et pas un TreeViewNode en argument. D'où l'erreur...

<hr size= "2" /> VC# forever
=13319
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007

Tu pourrais m'en dire plus sur les TreeNode ? Comment je peux les utiliser ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007

sinon, je suis arrivé a mettre un tag, mais le probleme c'est que je veux en mettre un autre, comment je dois faire ?
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007

bon, au lieu de chercher a mettre 2 tag, g juste mis une "," entre les
2 infis et g utilisé un split. Mais g une autre question : j'aimerais
pouvoir trouver le dernier node, dans un if, pour n'executer un bout de
code que si c'est le dernier node. J'ai visual studio 2003, il ny a pas
le precieux "level" de la version 2005... avez-vous une id ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Salut,
Le tag prend un object comme valeur, il suffit donc de créer une classe qui contient tout tes types et de passer cette classe à ton tag (si tu peux vraiment pas faire autrement).

Pour accéder au dernier TreeNode, est-ce que tu ne peux pas faire qqch comme ceci :
TreeNode lastNode =
this.treeView.Nodes[
this.treeView.Nodes.Count - 1];

<hr size="2" /> VC# forever
=13319
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007

Merci, ca marche !!!


Autre petit probleme, avec le xml et les treeviews :

<tt>private void Form1_Load(object sender, EventArgs e)


       {


           treeView1.Nodes.Clear();


           XmlDocument doc_xml_groupes = new XmlDocument();


           doc_xml_groupes.Load("c:/groupes.xml");

          
XmlNode xml_rot_groupes = doc_xml_groupes.DocumentElement; // Root côté
Xml


           foreach (XmlNode organisation in xml_rot_groupes)


           {

              
TreeNode tre_org = new
TreeNode(organisation.Attributes["nom"].InnerText); // Création des
nodes Organisation

              
foreach (XmlNode groupe in organisation.ChildNodes)


               {

                  
TreeNode tre_grp = new TreeNode(groupe.Attributes["nom"].InnerText); //
Création des nodes Groupe

                  
foreach (XmlNode poste in groupe.ChildNodes)


                   {

                      
XmlDocument doc_xml_liste = new XmlDocument();

                      
doc_xml_liste.Load("c:/liste.xml");

                      
XmlNode xml_rot_liste = doc_xml_liste.DocumentElement;

                      
XmlNodeList recherche_poste =
xml_rot_liste.SelectNodes("//ordinateur[@poste='" + poste.InnerText +
"']");

                      
foreach (XmlNode id_poste in recherche_poste)

                      
{

                          
TreeNode tre_pst = new TreeNode(id_poste.FirstChild.InnerText); //
Création des nodes Postes

                          
tre_pst.Tag = poste.InnerText + "," + id_poste.LastChild.InnerXml;

                          
tre_grp.Nodes.Add(tre_pst); // Insertion des postes dans les groupes

                      
}


                   }

                  
tre_org.Nodes.Add(tre_grp); // Insertion des groupes dans les
organisations


               }

              
treeView1.Nodes.Add(tre_org); // Insertion des organisations dans
l'arbre


           }


       }


avec ca, ca devrait me mettre des nodes "organisations", puis de dans
des nodes "groupes" pour enfin avoir des nodes "postes", le seul pb
c'est que ca me met les nodes "postes" que dans le premier node
"organisation"... et j'arrive pas a résoudre ce pb...


...pleeeaase help...
</tt>
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007

Merci, ca marche !


Sinon, j'aimerrais désactiver le déroulement des nodes quand on double click dessus, comment dous-je faire ?
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007

et comment faire pour pouvoir dérouler 1 seul node a la fois, par
exemple : si un node est déroulé, quand on en déroule un autre ->
qu'il se referme ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Valide les réponses qui t'on aidé !!!!!!!!!



Sinon, pour ta question, tu peux utiliser les events AfterSelect et BeforeSelect du TreeView et les méthodes Expand et Collapse du TreeNode.

<hr size= "2" /> VC# forever
=13319
Messages postés
12
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
9 janvier 2007

C'est bon, je viens de valider les reponces a mes questions ^^

Sinon, je n'arrive vraiment pas a trouver comment faire pour désactiver le déroulement des nodes du treeview quand on double clique et pour ne pouvoir dérouler qu'un seul node a la fois...


Je me suis vraiment cassé la tete, mais le seul truc que j'arrive a faire c pour le "déroulement unique des nodes" et encore, ca me fait un truc bizarre ou tout les nodes se ferment et ou le node en question se réouvre, mais c'est super lent...


quelqu'un aurrait une idée ?
Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
16
Je crois qu'il suffit de gérer l'évènement du treeview BeforeExpand.

private void tontreeview_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
    e.Cancel = true;
}
Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
16
Au fait ce que j'ai posté c'est pour désactiver le déroulement des nodes.