55 votes

Couleur d'arrière-plan d'un élément ListBox (winforms)

Comment définir la couleur d'arrière-plan d'un élément spécifique dans un System.Windows.Forms.ListBox? J'aimerais pouvoir en définir plusieurs si possible.

65voto

Shadow Wizard Points 38568

Merci pour la réponse de Grad van Horck , cela m’a guidé dans la bonne direction.

Pour soutenir le texte (pas seulement la couleur de fond), voici mon code totalement fonctionnel:

 //global brushes with ordinary/selected colors
private SolidBrush reportsForegroundBrushSelected = new SolidBrush(Color.White);
private SolidBrush reportsForegroundBrush = new SolidBrush(Color.Black);
private SolidBrush reportsBackgroundBrushSelected = new SolidBrush(Color.FromKnownColor(KnownColor.Highlight));
private SolidBrush reportsBackgroundBrush1 = new SolidBrush(Color.White);
private SolidBrush reportsBackgroundBrush2 = new SolidBrush(Color.Gray);

//custom method to draw the items, don't forget to set DrawMode of the ListBox to OwnerDrawFixed
private void lbReports_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);

    int index = e.Index;
    if (index >= 0 && index < lbReports.Items.Count)
    {
        string text = lbReports.Items[index].ToString();
        Graphics g = e.Graphics;

        //background:
        SolidBrush backgroundBrush;
        if (selected)
            backgroundBrush = reportsBackgroundBrushSelected;
        else if ((index % 2) == 0)
            backgroundBrush = reportsBackgroundBrush1;
        else
            backgroundBrush = reportsBackgroundBrush2;
        g.FillRectangle(backgroundBrush, e.Bounds);

        //text:
        SolidBrush foregroundBrush = (selected) ? reportsForegroundBrushSelected : reportsForegroundBrush;
        g.DrawString(text, e.Font, foregroundBrush, lbReports.GetItemRectangle(index).Location);
    }

    e.DrawFocusRectangle();
}
 

Ce qui précède ajoute au code donné et montrera le texte correct plus l’élément sélectionné.

56voto

Grad van Horck Points 3789

Le seul moyen d'y parvenir est probablement de dessiner les objets vous-même.

Définir les DrawMode à OwnerDrawFixed

et coder quelque chose comme ceci sur l'événement DrawItem:

 private void listBox_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    Graphics g = e.Graphics;

    g.FillRectangle(new SolidBrush(Color.Silver), e.Bounds);

    // Print text

    e.DrawFocusRectangle();
}
 

La deuxième option serait d'utiliser un ListView, bien qu'ils aient une autre manière d'implémentations (pas vraiment liée aux données, mais plus flexible en termes de colonnes)

2voto

Matthew Scharley Points 43262
 // Set the background to a predefined colour
MyListBox.BackColor = Color.Red;
// OR: Set parts of a color.
MyListBox.BackColor.R = 255;
MyListBox.BackColor.G = 0;
MyListBox.BackColor.B = 0;
 

Si vous définissez plusieurs couleurs d'arrière-plan en définissant une couleur d'arrière-plan différente pour chaque élément, ce n'est pas possible avec un ListBox, mais avec IS avec un ListView, avec quelque chose comme:

 // Set the background of the first item in the list
MyListView.Items[0].BackColor = Color.Red;
 

-1voto

      public Picker()
    {
        InitializeComponent();
        this.listBox.DrawMode = DrawMode.OwnerDrawVariable;
        this.listBox.MeasureItem += listBoxMetals_MeasureItem;
        this.listBox.DrawItem += listBoxMetals_DrawItem;
    }

    void listBoxMetals_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        Brush myBrush = Brushes.Black;
        var item = listBox.Items[e.Index] as Mapping;
        if (e.Index % 2 == 0)
        {
            e.Graphics.FillRectangle(new SolidBrush(Color.GhostWhite), e.Bounds);
        }
        e.Graphics.DrawString(item.Name,
            e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
        e.DrawFocusRectangle();
    }
 

Échantillon complet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X