Couleur texte Combobox remplie avec DataSource

Résolu
boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 7 mai 2013 - 7 mai 2013 à 10:30
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 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

3 réponses

boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 7 mai 2013
7 mai 2013 à 15:00
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
3
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 mai 2013 à 14:05
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
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 mai 2013 à 15:20
de rien et tant mieux que tu aies trouvé


Whismeril
0
Rejoignez-nous