Problème avec un fichier XML

Signaler
Messages postés
101
Date d'inscription
mercredi 5 novembre 2008
Statut
Membre
Dernière intervention
31 août 2009
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
Bonsoir

Je développe un petite application en C# orienté Objet. Cependant, j'ai un soucis.

 private void button1_Click(object sender, EventArgs e)
        {
            mesProgrammes lesprogrammes = new mesProgrammes();
            ArrayList tProgrammes = new ArrayList();
            tProgrammes= lesprogrammes.chargementDansCollection();

            programme ceProgramme = new programme();

            for (int i = 0; i < tProgrammes.Count - 1; i++)
            {
                ceProgramme = (programme)tProgrammes[i];
            }

Je voudrais avoir une indication sur le message suivant:


Impossible d'effectuer un cast d'un objet de type 'System.Xml.XmlElement' en type 'concert.programme'. Cette phrase est pointé sur la ligne:

                                             ceProgramme = (programme)tProgrammes[i];

5 réponses

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonsoir,
 ce message indique que les système est incapable de convertir un objet dans un type donné.
j'imagine que tu as ce message à l'execution, car comme ton ArrayList n'est pas typé, le compilateur ne peut pas savoir que la conversion est impossible.
pour eviter ce genre de surprise à l'execution utilise des collections typées, mà c'est le compilateur qui fera le travail.

est-ce que la methode chargementDansCollection donne bien une collection (arraylist) de programmes ?

au fait, inutile d'initialiser les variables tProgrammes et ceProgramme , car elles sont par la suite forcées.

C# is amazing, enjoy it!
Messages postés
101
Date d'inscription
mercredi 5 novembre 2008
Statut
Membre
Dernière intervention
31 août 2009

la methode chargementDansCollection donne bien une collection.

Voici le code la methode:

 public ArrayList chargementDansCollection()
        {
            XmlDocument docProg = new XmlDocument();
            docProg.Load(@".\listProgramme.xml");

            XmlNodeList listProgramme = docProg.GetElementsByTagName("Programme");

            programme leProgramme;

            foreach (XmlElement varProg in listProgramme)
            {
                leProgramme = new programme();

                string dateS = varProg["Date"].InnerText;
                leProgramme.setDateConcert(DateTime.Parse(dateS));

                //string heureS = varProg["Heure"].InnerText;
                //leProgramme.setDateConcert(DateTime.Parse(heureS));

                string heureS = varProg["Heure"].InnerText;
                leProgramme.setHeureConcert(heureS);

                string lieuS = varProg["Lieu"].InnerText;
                leProgramme.setLieuSpectacle(lieuS);

                string salleS = varProg["Salle"].InnerText;
                leProgramme.setSalleSpectacle(salleS);

                this.mesProgr.Add(varProg);
               
            }
            return mesProgr;

        }

J'ai compté le nombre d'objet dans la collection et il y a bien le compte. Cependant je n'arrive pas après utiliser les données de la collection.

Merci pour ton aide
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
bonsoir,

le probleme vient de là:
       this.mesProgr.Add(varProg);
ta collection n'est pas une collection de "programe", mais d'élément XML;

ne serait-ce pas :
    this.mesProgr.Add(leProgramme);
que tu voulais utiliser ?

C# is amazing, enjoy it!
Messages postés
101
Date d'inscription
mercredi 5 novembre 2008
Statut
Membre
Dernière intervention
31 août 2009

yes!!!! merci.

J'ai le même soucis dans une autre procédure:

Voici le code:

       //POUR ACTUALISER LA DATAGRIDVIEW
        private void chargerDatagridview()
        {
         // Creation des variables
            mesProgrammes lesProgrammes = new mesProgrammes();
            liste = lesProgrammes.chargementDansCollection();

            dgvFormProgramme.Rows.Clear();
            dgvFormProgramme.Columns.Clear();

            //Noms des colonnes du datagridview
            Date.Name = "Date spectacle";
            Heure.Name = "Heure spectacle";
            Lieu.Name = "Lieu spectacle";
            Salle.Name = "Salle spectacle";
            Id.Name = "Identifiant";
            Id.Visible = false;

            // Ajout des colonnes dans la datagridview
            dgvFormProgramme.Columns.Add(Date);
            dgvFormProgramme.Columns.Add(Heure);
            dgvFormProgramme.Columns.Add(Lieu);
            dgvFormProgramme.Columns.Add(Salle);
            dgvFormProgramme.Columns.Add(Id);
            int i=0;
        
            // parcourir la collection et afficher dans la datagridview
            foreach (XmlElement ligne in liste)
            {
                //ajout d'une ligne dans la datagriview
                dgvFormProgramme.Rows.Add();

               // .InnerText pour récupérer la valeur du noeud;
                dgvFormProgramme[0, i].Value = ligne.SelectSingleNode("Date").InnerText;
                dgvFormProgramme[1, i].Value = ligne.SelectSingleNode("Heure").InnerText;
                dgvFormProgramme[2, i].Value = ligne.SelectSingleNode("Lieu").InnerText;
                dgvFormProgramme[3, i].Value = ligne.SelectSingleNode("Salle").InnerText;
                dgvFormProgramme[4, i].Value = i.ToString(); ;
              
                i++;
            }

Le problème est pointé sur le:  foreach (XmlElement ligne in liste)

Impossible d'effectuer un cast d'un objet de type 'concert.programme' en type 'System.Xml.XmlElement'.

Merci pout ton aide
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
bonjour,

oui c'est normal, si tu as corrigé la methode chargementDansCollection pour generer une liste de "programme"
il te faut maintenant utiliser
   foreach (programme ligne in liste)

puis utiliser les champs de la class "programme" pour remplir tes lignes de datadrig
 dgvFormProgramme[0, i].Value =ligne.=>ici un champ de la classe programme<=

C# is amazing, enjoy it!