none
ComboBox Winform : propriétés d'un ComboBox

    Question

  • Bonjour tout le monde,

    Voilà un moment que je n'ai plus présenté de données en Winform, et j'avoue que j'ai un petit flottement.

    Pour les données de la table principale, pas de problème, j'ai créé un Dataset dessus, et du Dataset j'ai glissé la table vers le formulaire après avoir sélectionné Détail au niveau de la table et les types de contrôles au niveau des champs.

    Pour la plupart des champs ça se passe bien.

    J'ai un champ gesCuisson, qui contient A, P ou L. Ces valeurs sont lues dans la table, et en cas de nouvelle sélection doivent y être écrites. Mais à l'affichage, pour la valeur A on doit voir "Absent", pour la valeur P, "Par pas", pour la valeur L, "Linéaire".

    Sur du web je n'ai pas eu besoin de mettre ça dans une table, en Winform il doit y avoir moyen aussi, mais il y a un peu plus de boulot qu'à partir d'une table externe.

    J'ai créé une liste générique, ListViews<ListViewsItem>, étant entendu que ListViewsItem comporte deux champs, Index qui est la valeur inscrite dans le champ de la table, et TextDisplay, qui est la valeur à afficher. Les noms d'objets sont inspirés de ce que j'ai vu sous MVC, mais les mêmes existent sous Winform avec des signatures un peu différentes alors j'ai ajouté un s pour ne pas confondre et j'ai implémenté moi-même.

    Depuis l'interface de développement, dans les propriétés du ComboBox, pour ValueMember j'ai mis Index, pour DisplayMember j'ai mis TextDisplay, et la propriété Text est liée au champ gesCuisson dans la table (c'est bien pour éviter de confondre, ne serait-ce que dans le forum, avec la propriété Text du ComboBox que la propriété à afficher s'appelle TextDisplay).

    Au demeurant après avoir alimenté cette collection je la copie élément par élément dans un ArrayList, qui est accepté comme source pour le ComboBox, à la fin du constructeur du formulaire. Avec un point d'arrêt j'ai vérifié que chaque élément de l'ArrayList comporte un champ Index avec la valeur attendue dans la table principale, et un champ TextDisplay avec la valeur à afficher.

    D'après le résultat j'ai quand même dû me tromper quelque part : à l'ouverture du formulaire je n'affiche qu'une lettre, une fois que je déroule la liste ça m'affiche tout le texte de l'option, et alors en passant à un autre enregistrement j'ai une erreur, dépassement de longueur pour le champ (l'exception se produit d'ailleurs sur l'instruction d'ouverture du formulaire, dans le module Program).

    Je soupçonne que je ne dois pas être très loin du résultat, mais à condition de corriger une ou deux grossières erreurs ...

    Pour moi si il y a deux champs, Index pour la valeur et TextDisplay pour l'affichage, c'est bien justement pour éviter d'envoyer la valeur affichée dans la table.

    Non, c'est trop naïf, il faut écrire une usine à gaz ? Du style retirer la liaison entre le champ de la table et la propriété Text du ComboBox, et faire l'accès à la table par ADO ?

    J'ai un peu de mal à imaginer que Winform soit en retrait par rapport à Access ...



    • Modifié Gloops mercredi 1 mars 2017 09:05
    samedi 25 février 2017 14:47

Réponses

  • J'ai trouvé !

    La donnée de la table (dans l'exemple, champ GesCuisson de la table categoriePlat) ne doit pas être liée à la propriété Text de la ComboBox, mais à sa propriété SelectedValue.

    Je ne sais pas comment le faire par l'interface graphique, alors je suis allé dans Form1.Designer.cs, modifier cette instruction :

    this.gesCuissonComboBox.DataBindings.Add(

    new System.Windows.Forms.Binding(

    "SelectedValue", this.categoriePlatBindingSource, "GesCuisson", true));

    Au demeurant, que les données de la liste déroulante soient fournies en dur ne change rien, c'est pareil si elles viennent d'une autre table de la base de données. Aussi je vais changer le titre du fil de "liste en dur" à "propriétés d'un ComboBox", puisqu'il s'agit bien simplement de savoir utiliser un ComboBox sous WinForm.

    Kenavo.


    • Marqué comme réponse Gloops mercredi 1 mars 2017 09:05
    • Modifié Gloops mercredi 1 mars 2017 09:29
    mercredi 1 mars 2017 09:04

Toutes les réponses

  • Bonjour,

    Pour répondre correctement à une telle question, il serait peut-être utile de nous donner le code source ou une partie afin de bien comprendre le problème.

    Merci pour votre réponse

    Patrick

    dimanche 26 février 2017 00:09
  • Bonjour,

    Le constructeur du formulaire, peut-être ?

            public Form1()
            {
                InitializeComponent();
                LVTC = new ListViews<ListViewsItem>();
                LVTC.Add(new ListViewsItem("A", "Absent"));
                LVTC.Add(new ListViewsItem("P", "Par pas"));
                LVTC.Add(new ListViewsItem("L", "Linéaire"));
                System.Collections.ArrayList Ll = 
                    new System.Collections.ArrayList();
                foreach (ListViewsItem I in LVTC)
                {
                    Ll.Add(I);
                }
                gesCuissonComboBox.DataSource = Ll;
            }
    

    dimanche 26 février 2017 03:28
  • J'ai trouvé !

    La donnée de la table (dans l'exemple, champ GesCuisson de la table categoriePlat) ne doit pas être liée à la propriété Text de la ComboBox, mais à sa propriété SelectedValue.

    Je ne sais pas comment le faire par l'interface graphique, alors je suis allé dans Form1.Designer.cs, modifier cette instruction :

    this.gesCuissonComboBox.DataBindings.Add(

    new System.Windows.Forms.Binding(

    "SelectedValue", this.categoriePlatBindingSource, "GesCuisson", true));

    Au demeurant, que les données de la liste déroulante soient fournies en dur ne change rien, c'est pareil si elles viennent d'une autre table de la base de données. Aussi je vais changer le titre du fil de "liste en dur" à "propriétés d'un ComboBox", puisqu'il s'agit bien simplement de savoir utiliser un ComboBox sous WinForm.

    Kenavo.


    • Marqué comme réponse Gloops mercredi 1 mars 2017 09:05
    • Modifié Gloops mercredi 1 mars 2017 09:29
    mercredi 1 mars 2017 09:04