Cs0029 Impossible de convertir implicitement le type string en Bll.Pays [Résolu]

Signaler
Messages postés
54
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
25 avril 2021
-
Messages postés
15870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 avril 2021
-
Bonjour tout le monde actuellement je travaille sur un projet et dans mon projet j'utilise une architecture en 3 couches j'ai une chouche Bll, DAL, et UIL. et dans mon projet j'utilise une base des données que je manipule sauf que j'ai une petite erreur dans mon code lorsque j'essaie de récuperer chaque ligne de ma bd ça me dit Cs0029 Impossible de convertir implicitement le type string en Bll.Pays

en fait je n'arrive pas à assigner une nouvelle valeur à ma proprieté pays qui est de type Pays
quelqu'un peut m'aider merci

 public static void ChargerListeEtudiant()
        {
            //Appel de la fonction dans AccessDB pour la connection à la DB
            var listeFilms = new ObservableCollection<Film>();
            DataTable dt = AccessDB.ConnecterBD();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                var etu = new Film
                {
                    Id = Int32.Parse(dt.Rows[i]["Matricule"].ToString()),
                    Titre = dt.Rows[i]["Nom"].ToString(),
                    Annee = Int32.Parse(dt.Rows[i]["Prenom"].ToString()), 
// voilà mon erreur
                    Pays =  dt.Rows[i]["Pays"].ToString(),
                };

                listeFilms.Add(etu);
            }

            films = listeFilms;
        }

5 réponses

Messages postés
15870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 avril 2021
697
Bonjour

ID et Annee sont du type int, pour pouvoir les charger depuis ta base de données tu as dû les parser.
Int32.Parse est une méthode de conversion de string vers int que Microsoft a codée.

Le type « Pays » c’est toi qui l’as codé, c’est donc à toi de définir comment on convertit de string vers pays. Une fois la logique de conversion définie, tu as plusieurs options pour la mettre en œuvre:
  • une méthode dans ta classe de chargement des données qui prend le string en paramètre et qui renvoie un Pays
    Pays =  ConvertStringToPays(dt.Rows[i]["Pays"].ToString())
  • une extension de string ToPays(), qui renvoie un Pays
    Pays =  dt.Rows[i]["Pays"].ToString().ToPays()
  • une méthode static Parse de la classe Pays (enfin si Pays est une classe)
    Pays =  dt.Rows[i]["Pays"].ToString()
  • un opérateur de conversion implicite qui définit ce que fait le = dans
    Pays = Pays.Parse(dt.Rows[i]["Pays"].ToString())
  • un opérateur de conversion explicite qui nécessite de caster
    Pays = (Pays)dt.Rows[i]["Pays"].ToString()
  • y’en a sûrement d’autres

Messages postés
54
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
25 avril 2021

si je comprends bien je dois créer une méthode qui convertit mon type Pays en string
Messages postés
54
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
25 avril 2021

sauf que dans pays j'ai juste une proprieté et un attribut et une methode NotifyPropertyChanged(string propname) voilà ma classe Pays

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using System.ComponentModel;
using DAL;

namespace BLL
{
  public  class Pays: INotifyPropertyChanged
    {

        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }

        private string nomPays;
        public string NomPays
        {
            get
            {
                return nomPays;
            }

            set
            {
                if (this.nomPays != value)
                {
                    this.nomPays = value;
                    this.NotifyPropertyChanged("NomPays");
                }
            }
        }

        
        public event PropertyChangedEventHandler PropertyChanged;
    }
}


Messages postés
15870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 avril 2021
697
Bonjour

alors dans ce cas, une initialisation / affectation est possible

Pays =  new Pays {MonPays = dt.Rows[i]["Pays"].ToString() }


Tu peux aussi ajouter un constructeur à ta classe Pays, qui prendrait une string ou même carrément le type de dt.Rows[i]["Pays"] en paramètre et affecterait la propriété MomPays.

Mais avec les éléments que tu m'a montré, je m'interroge sur l'utilité de cette classe.
  • Une seule propriété
  • Pas de méthode
  • Pas d'évènement (à part propertychanged)


Bref en l'état, il me semble que la propriété Pays de la classe Film serait une string, ton code serait plus simple.
Messages postés
54
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
25 avril 2021

okay d"acoord merci bien
Messages postés
15870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 avril 2021
697
de rien