Couleur texte Combobox remplie avec DataSource [Résolu]

Messages postés
11
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
7 mai 2013
- - Dernière réponse : Whismeril
Messages postés
13849
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
22 octobre 2019
- 7 mai 2013 à 15:20
Bonjour à tous,
Je viens chercher le professionnel du codage pour résoudre un problème
J'ai créé une fonction qui remplit une combobox passée en paramètre avec les éléments d'une table SQL(chargée dans un dataset).
Dans cette table, j'ai un champ (HCB_Component) qui contient le nom de la combobox à charger. Ainsi ma fonction charge toutes les lignes de la table qui correspondent à la combobox transmise en paramètre. Vous me suivez ?
Cette table contient plusieurs colonnes contenant les informations à afficher dans la combobox en fonction de la langue choisie.

        public static void LoadTranslatedComboBoxItems(Control ComboBoxToLoad, Boolean ActiveTranslation, String Language)
        {

            DataTable DTFilteredComboboxTable GetFilteredTable( DIForm.frmMain.dsMachine.Tables["T_HMIComboBox"], "HCB_component '" + ComboBoxToLoad.Name + "'", "HCB_Index ASC");
            ((ComboBoxPerso.ComboBox_Perso)ComboBoxToLoad).DataSource = new BindingSource(DTFilteredComboboxTable, null);
            if (ActiveTranslation)((ComboBoxPerso.ComboBox_Perso)ComboBoxToLoad).DisplayMember = "HCB_" + Language;
            else
((ComboBoxPerso.ComboBox_Perso)ComboBoxToLoad).DisplayMember = "HCB_English";

            ((ComboBoxPerso.ComboBox_Perso)ComboBoxToLoad).ValueMember = "HCB_English";

        }


Grâce à la propriété DisplayMember, j'affiche la colonne correspondant à la langue souhaitée. Jusque là, tout va bien, et la fonction remplit parfaitement son rôle!
Mon problème est le suivant, la combobox qui reçoit les informations est en mode dropdownlist, et le texte de l'élément sélectionné est en noir.


La vous, vous dites : " Je ne vois pas le rapport !"
Et bien figurez vous que le seul moyen de modifier la couleur du texte est d'ajouter l'événement DrawItem (dans le control combobox), comme indiqué ci-dessous :

        public ComboBox_Perso()
        {
            InitializeComponent();

            this.DrawItem += new DrawItemEventHandler(DisplayCombo_DrawItem);
            // Required for ownerdraw
            this.DrawMode = DrawMode.OwnerDrawFixed;
        }

        // Ownerdraw routine
        void DisplayCombo_DrawItem(object sender, DrawItemEventArgs e)
        {
            System.Drawing.Graphics g = e.Graphics;
            Rectangle r = e.Bounds;

            if (e.Index >= 0)
            {
                string label = this.Items[e.Index].ToString();

                // This is how we draw a disabled control
                if (e.State == DrawItemState.Disabled)
                {
                    e.Graphics.FillRectangle(new SolidBrush(Color.White), r);
                    g.DrawString(label, e.Font, new SolidBrush(Color.DarkGray), r);
                    e.DrawFocusRectangle();
                }
                // This is how we draw the items in an enabled control that aren't in focus
                else 
                {
                    e.Graphics.FillRectangle(new SolidBrush(Color.White), r);
                    g.DrawString(label, e.Font, new SolidBrush(this.ForeColor), r); // <===== La couleur que je veux appliquer au texte de la combobox
                    e.DrawFocusRectangle();
                }

            }
            g.Dispose();


        }


Cette fonctionnalité modifie bien la couleur du texte de ma combo MAIS les informations affichées dans ma combo sont toutes maintenant à : System.Data.DataRowView



Cette erreur est liée à cette ligne :
string label = this.Items[e.Index].ToString();


Mais je ne sais pas comment récupérer le DisplayMember de la combo qui était préalablement paramétrée.

Bon voilà, j'espère avoir été assez clair
Mais si je dois résumer :
Comment modifier la couleur du texte d'une combobox remplie grâce à une datasource et dont la valeur affichée correspond à une colonne sélectionnée par la propriété DisplayMember qui peut varier selon le language sélectionné ?8O

Boliv
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
11
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
7 mai 2013
3
Merci
Merci pour ta réponse Whismeril.
Même si l'idée est bonne, elle oblige à créer une classe par table, ce que je veux éviter car je vais avoir à peu près une vingtaine de combobox dans mon application.

En fait, on m'a indiqué une solution plus simple, c'est changer la ligne :
string label = this.Items[e.Index].ToString();

par :
                string label = ((DataRowView)this.Items[e.Index]).DataView.Table.Rows[e.Index][this.DisplayMember].ToString();


Et là, ça fonctionne, la bonne colonne s'affiche
merci encore pour ta participation

Boliv

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 188 internautes nous ont dit merci ce mois-ci

Commenter la réponse de boliv
Messages postés
13849
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
22 octobre 2019
312
0
Merci
Bonjour, j'ai fait un truc comme ça et pour m'en sortir je suis passé par l'intermédiaire d'une classe.

j'ai écrit une classe (MaClasse) dont les propriétés correspondent aux colonnes de la base de données (dans mon cas un xml).
J'ai chargé mes enregistrements dans une List<T> (avec LinqToSql tu peux caster directement une liste avec ToList<MaClasse>()).

J'ai réécrit la méthode ToString() de MaClasse de façon à ce qu'elle retourne ce que je voullais voir affiché.

La liste devient le DataSource du combo et pas de DisplayMember. quand tu arrives à cette ligne
string label = this.Items[e.Index].ToString();

ce qui est affiché est ce que MaClasse.ToString() retourne.


Whismeril
Commenter la réponse de Whismeril
Messages postés
13849
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
22 octobre 2019
312
0
Merci
de rien et tant mieux que tu aies trouvé


Whismeril
Commenter la réponse de Whismeril