IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Transmettre une valeur à une ComboBox.SelectedValue


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Homme Profil pro
    concepteur de logiciel
    Inscrit en
    Août 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : concepteur de logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Transmettre une valeur à une ComboBox.SelectedValue
    Bonjour à tous.

    Je développe une application et j'ai un problème avec mes comboBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    private void dgvReservationForm_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                //Reçoit l'identifiant de la Reservation
                EnregReserv.IdReserv = dgvReservationForm.CurrentRow.Cells[0].Value.ToString();
                //Reçoit Date d'enregistrement de la Reservation
                EnregReserv.DateReserv = Convert.ToDateTime(dgvReservationForm.CurrentRow.Cells[1].Value.ToString());
                //Reçoit date d'entrer du client ayant fait la reservation
                EnregReserv.DateEntrer = Convert.ToDateTime(dgvReservationForm.CurrentRow.Cells[2].Value.ToString());
                //Reçoit date de sortir du client ayant fait la reservation
                EnregReserv.DateSortir = Convert.ToDateTime(dgvReservationForm.CurrentRow.Cells[3].Value.ToString());
                //Recupère le numéro de la chambre reservée
                EnregReserv.NoChambre = dgvReservationForm.CurrentRow.Cells[5].Value.ToString();
                //Recupère le modèle de la chambre reservée
                EnregReserv.ModChambre = dgvReservationForm.CurrentRow.Cells[7].Value.ToString();
                //Reçoit l'identifiant du client ayant fait la reservation
                EnregReserv.IdClient = dgvReservationForm.CurrentRow.Cells[8].Value.ToString();
     
                //EnregReserv.Show();
     
                EnregReserv.EditReservForm();
                EnregReserv.Show();
    le code ci-dessus est le code retournant les valeurs de mon DataGridView aux variable depuis la fenêtre où j'aimerai les affichés dans une autre fenêtre pour les modifier

    Voici le la fonction qui transmet les valeur du datagridview au formulaire pour modification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void EditReservForm()
            {
                lbTitle.Text = "Modification de l'enregistrement";
                btnAddReservation.Text = "Modifier";
                dtpDateReservation.Value = DateReserv;
                dtpDateEntrer.Value = DateEntrer;
                dtpDateSortir.Value = DateSortir;
                cbxIdClient.Text = IdClient;
     
                cbxModelChambre.SelectedValue= EnregReserv.ReturnModelChambre(NoChambre); //exécute un fonction avec le numéro de la chambre afin de faire ressortie le modèle de la chambre
                cbxNoChambre.SelectedValue= NoChambre;
            }
    le problème est que les champs combobox.selectedvalue ne reçoivent rien et cela est illustré dans l'image ci-dessous

    Nom : Capture d’écran 2022-12-13 202914.png
Affichages : 139
Taille : 114,5 Ko

    à droite de l'image les valeurs contenue dans les différents variable
    et à gauche le formulaire avec les champs où je voudrai afficher ses valeurs

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Bonjour,

    Quelques remarques:

    • il ne faut pas chercher à tirer les données directement du datagridview, normalement celui-ci est lié à un datatable ou sqldata adapter. C'est donc la source de données qu'il faut interroger et modifier, et puis rafraîchir le datagridview, pour autant que cela ne se fasse pas automatiquement... jetez un coup du côté des binding sources
    • à la limite vous pourriez pêcher l'ID de la colonne sélectionnée et utiliser cette ID pour filtrer le datarow concerné dans le datatable
    • c'est plus simple et en même temps ça vous évite des conversions de type intempestives. Ca n'a pas de sens d'écrire Convert.ToDateTime si le champ correspondant dans la DB est correctement typé et défini comme une date. D'autant plus que vous pouvez souhaiter formater la date d'une façon différente dans le datagridview.
    • D'ailleurs il est possible que le row soit en cours d'édition mais pas encore "committé", donc ce que vous voyez n'est pas forcément ce qui est répercuté dans la source de données
    • c'est une mauvaise idée d'utiliser des index de colonnes, car si l'ordre des colonnes change, votre code ne fonctionnera plus comme il faut (d'ailleurs, par défaut je crois que l'utilisateur peut déplacer les colonnes par drag et drop... faites le test !)
    • pour mettre à jour un form au départ d'un autre form (si j'ai bien compris, c'est le problème principal), on préférera utiliser des événements, avec éventuellement usage de delegate
    • on peut par exemple faire un overload de l'évenement onload et transmettre au formulaire cible un flux de données en paramètre ou tout type de variable souhaité... je pense que vous trouverez facilement des exemples en faisant une recherche, sinon je peux chercher des suggestions
    • plus fondamentalement, il n'est pas forcément utile de lancer un formulaire séparé, après tout on peut éditer les données directement dans le datagridview, il est même possible d'afficher des combo boxes, calendriers etc dans un datagridview, même si ça peut demander un peu de code. Mais à partir du moment ou le datagridview est "bound" à un data source, une grosse partie du travail est déjà faite.

    Le problème c'est qu'on ne sait pas non plus comment sont alimentés les combos. En principe, ils devraient aussi être liés à des datasources (datatables).
    Je ne suis même pas sûre que vous pouvez changer directement le SelectedValue - j'aurais dit plutôt changer le SelectedIndex, ce qui implique de localiser l'index de la valeur souhaitée.
    Bref, je pense que tout cela est inutilement compliqué et fragile.

  3. #3
    Candidat au Club
    Homme Profil pro
    concepteur de logiciel
    Inscrit en
    Août 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : concepteur de logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonsoir
    • Je tire mes données de ma BD via mon datagridview

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      public DataTable GetReservation()
              {
                  string Query = "SELECT No_Reservation,Date_Reservation,DateEntrer_Rservation,DateSortir_Reservation," +
                      "IdChambre_Reservation,Libelle_Chambre,Id_TypeChambre,Libelle_TypeChambre,IdClient_Reservation,Nom_Client," +
                      "Prenom_Client,MatriculePersonnel_Reserv,Nom_Personnel,Prenom_Personnel " +
                      "FROM RESERVATION AS R, CLIENT AS C, PERSONNEL AS P, CHAMBRE AS CH, TYPE_CHAMBRE AS TC" +
                      " WHERE C.Id_Client = R.IdClient_Reservation AND P.Matricule_Personnel = R.MatriculePersonnel_Reserv AND " +
                      "CH.Id_Chambre = R.IdChambre_Reservation AND TC.Id_TypeChambre = CH.IdType_Chambre";
       
                  Command = new SqlCommand(Query, connexion.GetConnection());
                  DataTable table = new DataTable();
                  SqlDataAdapter adapter = new SqlDataAdapter();
                  adapter.SelectCommand = Command;
                  adapter.Fill(table);
       
                  return table;
              }
    • Pour les conversions, j'ai procédé ainsi car mes variable Date... sont typées au format "DateTime" de même que les champs de ma BD.
    • Le datagridview mes les retourne au format "string" d'où la conversion. sinon j'ai cette erreur générée "Impossible de convertir implicitement le type 'objet' en 'system.datetime' "
    • Pour le formatage des dates, c'est un choix vue que j'apporterai des modifications ultérieure à l'application
    • Pour les modification du datagriview, pas possible à l'utilisateur de le faire car je les ai annulée ainsi que celle des données depuis le datagridview
    • en plus de mes recherche puis-je vois vos suggestions sur l'overload de l'évènement load
    • mes combos sont alimenté depuis ma BD pas cest code :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
       
      private void EnregReservationForms_Load(object sender, EventArgs e)
              {
                  //Affiche les modèle de chambre
                  cbxModelChambre.DataSource = modele.GetTypeChambre();
                  cbxModelChambre.DisplayMember = "Libelle_TypeChambre";
                  cbxModelChambre.ValueMember = "Id_TypeChambre";
       
                  //Affiche les N° des chambres disponible en fonction du modèle de chambre choisir
                  int Type = Convert.ToInt32(cbxModelChambre.SelectedValue);
                  cbxNoChambre.DataSource = EnregReserv.GetNoChambre(Type);
                  cbxNoChambre.DisplayMember = "Libelle_Chambre";
                  cbxNoChambre.ValueMember = "Id_Chambre";
       
                  //Affiche l'Identifiant des Clients
                  cbxIdClient.DataSource = EnregReserv.GetClient();
                  cbxIdClient.DisplayMember = "Id_Client";
                  cbxIdClient.ValueMember = "Id_Client";
       
                  //Affiche le nom & prenom du client en fonction de l'idClient de la table Reservation
                  txtNomPrenomClient.Text = EnregReserv.getNomPrenom(cbxIdClient.SelectedValue.ToString());
              }

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Ce n'est peut-être pas le meilleur exemple, mais ça illustre un peu ce que j'avais en tête: https://www.codeproject.com/Articles...t-Form-VS-2005
    Je vous conseillerais cette approche.

    Dans un ancien boulot, j'avais adopté une approche un peu différente, je récupérais l'ID de l'enregistrement sélectionné dans le datagridview, ce qui me permet de faire une sélection sur la datatable et récupérer un datarow,

    Une fois qu'on a ce datarow on peut facilement en extraire les différents champs. Par exemple si dans la DB sous-jacente le champ Date_Reservation est défini comme un datetime, alors le champ correspondant dans le datarow sera de type system.datetime et peut être manipulé directement comme une date sans faire des conversions. Autrement dit, on doit pouvoir assigner directement la valeur à un datetimepicker si on a envie... Les autres types courants sont integer, string etc.

    En gros l'idée est d'utiliser la source de données sous-jacente pour pomper les données (et le cas échéant les mettre à jour), mais jamais les lire de l'UI. D'autant plus que que le datagridview est déjà lié à une datatable qui contient tout ce qu'il faut.

    Et en plus comme vous avez déjà un SqlDataAdapter, ça veut dire que les changements peuvent être répercutés directement dans la DB. Donc vous avez déjà une partie du code qui tient la route.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 072
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 072
    Points : 1 566
    Points
    1 566
    Par défaut
    Vu que tu récupères directement le modèle de la chambre réservée
    Citation Envoyé par ghislain gerard Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void dgvReservationForm_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                [...]
                //Recupère le numéro de la chambre reservée
                EnregReserv.NoChambre = dgvReservationForm.CurrentRow.Cells[5].Value.ToString();
                //Recupère le modèle de la chambre reservée
                EnregReserv.ModChambre = dgvReservationForm.CurrentRow.Cells[7].Value.ToString();
                [...]
     
                EnregReserv.EditReservForm();
                EnregReserv.Show();
    Pourquoi tu ne l'utilises pas directement à la restitution ? plutôt que de le recalculer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void EditReservForm()
            {
                [...]
                cbxModelChambre.SelectedValue= ModChambre;
                cbxNoChambre.SelectedValue= NoChambre;
            }
    Et cette fonction fait bien partie de la Classe de l'objet EnregReserv ? on évite en principe de mélanger les choses.

    PS: au passage, tu as pas mal de fautes d'orthographe dans tes textes, à corriger pour faire plus sérieux.

  6. #6
    Candidat au Club
    Homme Profil pro
    concepteur de logiciel
    Inscrit en
    Août 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : concepteur de logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Pourquoi tu ne l'utilises pas directement à la restitution ? plutôt que de le recalculer
    je veux d'abord les récupérer afin de les modifier a travers mon formulaire

    Et cette fonction fait bien partie de la Classe de l'objet EnregReserv ? on évite en principe de mélanger les choses.
    Oui, elle en fait partie

    PS: au passage, tu as pas mal de fautes d'orthographe dans tes textes, à corriger pour faire plus sérieux.
    Merci pour la remarque

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/03/2007, 12h56
  2. XSL transmettre une valeur a javascript
    Par totoche dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 02/08/2005, 11h22
  3. transmettre une valeur par l'url
    Par Destampy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 07/06/2005, 16h57
  4. Réponses: 2
    Dernier message: 29/05/2005, 20h50
  5. [MFC] comment associer 2 valeurs à une ComboBox
    Par drinkmilk dans le forum MFC
    Réponses: 2
    Dernier message: 13/04/2005, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo