Charger une TreeView à partir d'un fichier XML d'une listView [Résolu]

NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 2 oct. 2014 à 08:25 - Dernière réponse : NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention
- 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.
Afficher la suite 

19 réponses

Répondre au sujet
jordane45 20601 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 23 avril 2018 Dernière intervention - 2 oct. 2014 à 08:31
0
Utile
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 ?
Commenter la réponse de jordane45
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 2 oct. 2014 à 09:23
0
Utile
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
...
Commenter la réponse de NABZ27
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 2 oct. 2014 à 09:32
0
Utile
3
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.
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 2 oct. 2014 à 09:33
Ha nos messages se sont croisés...
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 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 !
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 2 oct. 2014 à 09:47
Tu navigues avec une vielle version d'Internet Explorer?
Au pire tu peux écrire la balise à la main.
Commenter la réponse de Whismeril
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 2 oct. 2014 à 09:51
0
Utile
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();
            }

Commenter la réponse de NABZ27
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 2 oct. 2014 à 12:35
0
Utile
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);


Commenter la réponse de Whismeril
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 2 oct. 2014 à 14:13
0
Utile
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
Commenter la réponse de NABZ27
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 2 oct. 2014 à 16:38
0
Utile
2
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
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 2 oct. 2014 à 17:51
On ne peut pas te répondre sans voir le code que tu a écrit.
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 3 oct. 2014 à 08:19
Ok , je l'intègre
Commenter la réponse de NABZ27
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 3 oct. 2014 à 08:19
0
Utile
5
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
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 3 oct. 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?
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 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 :(
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 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
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 3 oct. 2014 à 11:43
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 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?
Commenter la réponse de NABZ27
NABZ27 18 Messages postés mercredi 1 octobre 2014Date d'inscription 24 octobre 2014 Dernière intervention - 3 oct. 2014 à 15:55
0
Utile
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
Commenter la réponse de NABZ27

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.