Colore di sfondo di un object ListBox (winforms)

Come posso impostare il colore di sfondo di un object specifico in un System.Windows.Forms.ListBox? Mi piacerebbe essere in grado di impostare più di una volta, se ansible.

Probabilmente l’unico modo per farlo è disegnare gli oggetti da soli.

Impostare DrawMode su OwnerDrawFixed

e codificare qualcosa come questo nell’evento 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 seconda opzione sarebbe utilizzare un controllo ListView, anche se hanno un altro modo di implementazioni (non realmente legato ai dati, ma più flessibile in termini di colonne)

Grazie per la risposta di Grad van Horck , mi ha guidato nella giusta direzione.

Per supportare il testo (non solo il colore di sfondo), ecco il mio codice pienamente funzionante:

 //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(); } 

Quanto sopra aggiunge al codice dato e mostrerà il testo corretto più evidenzia l'elemento selezionato.

 // 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; 

Se ciò che intendi impostando più colors di sfondo è l’impostazione di un colore di sfondo diverso per ogni elemento, questo non è ansible con un ListBox, ma IS con un ListView, con qualcosa di simile:

 // Set the background of the first item in the list MyListView.Items[0].BackColor = Color.Red; 
  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(); } 

Campione completo

 private void listbox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { e.DrawBackground(); Brush myBrush = Brushes.Black; var item = listbox1.Items[e.Index]; if(e.Index % 2 == 0) { e.Graphics.FillRectangle(new SolidBrush(Color.Gold), e.Bounds); } e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(), e.Font, myBrush,e.Bounds,StringFormat.GenericDefault); e.DrawFocusRectangle(); } public MainForm() { InitializeComponent(); this.listbox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listbox1_DrawItem); }