Charger une TreeView à partir d'un fichier XML d'une listView

Résolu
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014 - 2 oct. 2014 à 08:25
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014 - 3 oct. 2014 à 15:55
Bonjour,
Mon titre de message n'est pas top. En effet, je souhaite charger une TreeView à partir d'un fichier XML ( j'ai pu trouver un premier code source sur le forum ) cependant, mon fichier XML de base est récupéré dans une ListView sur mon écran.
Comme je sais pas encore s'il faut manipuler des événements d'abord, je souhaite bien évidement cliquer ou selectionner ce fichier ( sur la listView) , ma Treeview sera ensuite remplise par les données XML de ce fichier

S'il y a un petit point de départ pour commencer SVP

Merci par avance.

9 réponses

jordane45 Messages postés 38170 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 344
2 oct. 2014 à 08:31
Bonjour.
Je ne suis sûrement pas encore bien réveillé. ..mais j'ai du mal à comprendre la question. ..
Quel est le souci exactement ? Le choix du fichier dans la listview ou son ouverture dans le treeview ?
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
2 oct. 2014 à 09:23
En faite les deux :
Je veux choisir un fichier (que j'ai chargé depuis mon ordinateur) sur la listview ==> cliquer la dessus
Une fois que je le selectionne , il doit charger mon Treeview
...
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
2 oct. 2014 à 09:32
Bonjour, comme j'ai répondu à la question précédente, je pense avoir compris celle-ci.

Au moment ou l'utilisateur va cliquer sur un item dans la listview l'évenement ItemSelectionChanged sera généré.
C'est à ce moment que tu va récupérer le chemin du fichier et l'afficher, et le code dépendra de la façon dont tu as alimenté la listview (items.add, datasource, binding, etc...).
Pour pouvoir repondr plus précisement poste le code utilisé, voir ici comment utiliser la coloration syntaxique.
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
2 oct. 2014 à 09:33
Ha nos messages se sont croisés...
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
2 oct. 2014 à 09:44
Merci ,
je trouve pas par contre les les chevrons à côté de l'icone pour choisir le langage pour le code ...
Il m'affiche les balises code et c'est tout !
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
2 oct. 2014 à 09:47
Tu navigues avec une vielle version d'Internet Explorer?
Au pire tu peux écrire la balise à la main.
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
2 oct. 2014 à 09:51
Donc voilà , j'ai chargé mon fichier XML sur ma listView.
La c'est bien ce fichier XML que je souhaite selectionner ou ouvrir sur la Treeview



private void button1_Click(object sender, System.EventArgs e)
        {

            // Ouvrir le dossier contenant le fichier XML Source sur mon ordinateur 

            this.button1.Click += new System.EventHandler(this.button1_Click);

            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "XML Files|*.XML";
            openFileDialog1.Title = "Select a XML File";


           if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
               // Insérer le fichier depuis mon ordinateur sur la liste View 

                foreach (var f in openFileDialog1.FileNames)
                {

                    listView1.Items.Add(f);
                }
              
               // System.IO.StreamReader sr = new
                  // System.IO.StreamReader(openFileDialog1.FileName);
               //MessageBox.Show(sr.ReadToEnd());
               //sr.Close();
            }

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
2 oct. 2014 à 12:35
Ok, donc les chemins sont stockés dans la listview.

Comme tu as précisé être débutant, je détaille, en mode design, tu vas venir double cliquer sur l'evenement ItemSelectionChanged.
VS va te placer dans le code de ta form, dans une nouvelle méthode de ce type
private void maListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
   {
    }

sender est l'objet qui appelle cette méthode, tu pourrais avoir plusieurs listview, vouloir y fair le même traitement, il te suffirais d'asocier la méthode à toutes les listview et se servir de sender pour savoir à laquelle appliquer le traitement.

e est ce qu'il y a à savoir sur l'evenement déclenché, par exemple, e.selected montre si tu viens de selectionner ou de deselectionner un item.
e.item retourne l'item en question, par contre il est du type object, il faut donc caster l'item en string pour avoir le chemin:
string fileName = (string)e.item;


A partir de là tu peux ouvrir ton xml et l'afficher.
Il y a de nombreuses façons de parser un xml, perso je prefrère Linq.ToXml, un exemple.
Ensuite à partir de la liste d'object tu charges ton treeview. J'ai un peu adpaté la classe Personne

    public class Personne
    {
        public string Nom { get; set; }

        public string Prenom { get; set; }

        public DateTime DateNaissance { get; set; }

        public override string ToString()
        {
            return Prenom + " " + Nom;
        }

        public TreeNode Noeud
        {
            get
            {
                TreeNode noeud = new TreeNode(this.ToString());
                noeud.Nodes.Add("Nom : " + Nom);
                noeud.Nodes.Add("Prénom : " + Prenom);
                noeud.Nodes.Add("Date de naissance : " + DateNaissance.ToShortDateString());

                return noeud;
            }
        }

    }


et comment remplir
            foreach (Personne p in mesPersonnes)
                twvPersonne.Nodes.Add(p.Noeud);


0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
2 oct. 2014 à 14:13
J'ai du mal à savoir ou mettre quoi ( je tiens à préciser également que je suis débutant en POO non pas en C# uniquement )

Alors, j'ai crée l'evenement ItemSelectionChanged , ensuite la calsse exemple personne . Cependant j'arrive pas à voir comment intégrer la partie concernant la lecture du fichier exemple dans tout ça


Je sais c'est assez débile mais c'est tellement flou pour moi
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
2 oct. 2014 à 16:38
Avancement
J'ai intégré le code de lecture XML ...
Il me reste le petit code
et comment remplir

Je sais pas trop, il beug sur le twvPersonne
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
2 oct. 2014 à 17:51
On ne peut pas te répondre sans voir le code que tu a écrit.
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
3 oct. 2014 à 08:19
Ok , je l'intègre
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
3 oct. 2014 à 08:19
Pour la classe personnes

            
    public class personnes {

        public string Nom { get; set; }

        public string Prenom { get; set; }

        public DateTime DateNaissance { get; set; }

        public override string ToString()
        {
            return Prenom + " " + Nom;
        }
         public TreeNode Noeud
        {
            get
            {
                TreeNode noeud = new TreeNode(this.ToString());
                noeud.Nodes.Add("Nom : " + Nom);
                noeud.Nodes.Add("Prénom : " + Prenom);
                noeud.Nodes.Add("Date de naissance : " + DateNaissance.ToShortDateString());

                return noeud;
            }
        }
      


ensuite, pour la lecture fichier xml

private List<MON_PROJET.Form1.personnes> mesPersonnes = new List<IOX_MERGER.Form1.personnes>();

    private void ImportXml()
    {
        XDocument xDoc = XDocument.Load(string.Format(@"{0}\test.xml", Application.StartupPath));

        mesPersonnes = (from personne in xDoc.Descendants("Personne")//directement la balise qui contient les données d'une seule instance de personne
                        select new personnes
                        {
                            Nom = personne.Element("Nom").Value, // c'est un string donc pas de conversion
                            Prenom = personne.Element("Nom").Attribute("Prenom").Value, //on va chercher l'attribut
                            DateNaissance = DateTime.Parse(personne.Element("DateNaisance").Value)//on convertit en datetime
                        }
                        ).ToList();//on en fait une liste
    }

    private void ExportXml()
    {
        XDocument xDoc = new XDocument(new XElement("Racine",
            new XElement("Balise1", //une balise
                new XElement("Balise2", //et encore une
                    new XElement("ListePersonnes", //on attaque la liste de personnes
                        from personne in mesPersonnes
                        orderby personne.Prenom ascending //triées par prénom pour le principe
                        select new XElement("Personne",
                            new XElement("Nom", new XAttribute("Prenom", personne.Prenom), personne.Nom),//on écrit l'élement Nom avec Prenom en attribut
                            new XElement("DateNaisance", personne.DateNaissance)// on écrit l'élément date de naissance
                            )
                        )
                    )
                )
            )
        );

        xDoc.AddFirst(new XComment("Un petit commentaire tout au début pour la forme ;-)"));

        //on sauve
        xDoc.Save(string.Format(@"{0}\test.xml", Application.StartupPath));




Voilà c'est ce que j'ai intégré , la fonction private void listView1_ItemSelectionChanged est vide pour l'instant et je sais pas comment faire pour le foreach dernier

 foreach (personnes p in mesPersonnes)
            treeView1.SelectedNode.Nodes.Add(p.Noeud);


J'ai pas d'erreurs mais bon .. ça marche pas
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
Modifié par Whismeril le 3/10/2014 à 09:12
Bonjour,

je suis étonné par cette ligne
private List<MON_PROJET.Form1.personnes> mesPersonnes = new List<IOX_MERGER.Form1.personnes>();

Déjà tu as deux namesapce différents MON_PROJET et IOX_MERGER, ensuite .Form1 ce qui doit vouloir dire que la classe Personne tu l'as mise dans Form1, ça n'est pas judicieux, ne serait ce que pour la maintance dans plusieurs mois.
Ajoute un fichier Class dans lequel tu mets Personne (la convient de nommage veut que l'on mette une majuscule).

Est ce qu'à la fin d'ImportXml tu as bien une liste de Personnes?
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
3 oct. 2014 à 09:40
Oui pour le name space c'est Mon_Projet partout ... Erreur de copier -coller.
Je dois donc mettre la classe personne après la form1 , et puis pour la liste , non je sais pas de quoi il s'agit :(
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
3 oct. 2014 à 09:55
Re bonjour,
J'ai supprimé .from et j'ai remis la classe personne dehors . pas de beug pour l'instant.
J'ai pas bien saisi par contre
"Ajoute un fichier Class dans lequel tu mets Personne (la convient de nommage veut que l'on mette une majuscule). " et que dois je mettre dans la liste.

Merci merci
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
3 oct. 2014 à 11:43
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
3 oct. 2014 à 11:45
puis pour la liste , non je sais pas de quoi il s'agit
La méthode ImportXml lit le fichier est le charge dans la liste mesPersonnes.

Est ce que ça fonctionne?
0
NABZ27 Messages postés 18 Date d'inscription mercredi 1 octobre 2014 Statut Membre Dernière intervention 24 octobre 2014
3 oct. 2014 à 15:55
J'ai utilisé une autre version de code et ça marche avec un fichier XML exemple.

La il faut adapter tout ça à mon GROS fichier XML

Merci bien pour tous :D
0
Rejoignez-nous