boliv
Messages postés11Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention 7 mai 2013
-
7 mai 2013 à 10:30
Whismeril
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 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.
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
Messages postés11Date d'inscriptionvendredi 13 juin 2003StatutMembreDerniè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 :
Whismeril
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 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.