2008-09-18 9 views

Répondre

50

Probablement la seule façon d'accomplir cela est de dessiner les éléments vous-même.

Réglez le DrawMode à OwnerDrawFixed

et le code 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(); 
} 

Deuxième option serait d'utiliser un ListView, bien qu'ils aient un autre moyen de mises en œuvre (pas vraiment données lié, mais plus flexible à la façon des colonnes)

2
// 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 voulez définir plusieurs backgroun d couleurs est prêt à établir une couleur de fond différente pour chaque élément, ce n'est pas possible avec un ListBox, mais il est un ListView, avec quelque chose comme:

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

Il est possible avec un ListBox. Voir http://stackoverflow.com/questions/91747/background-color-of-a-listbox-item-winforms#91758 – jfs

+0

s/possible/facile /. Tant pis. C# 1, novice 0. Je n'avais pas beaucoup travaillé avec des méthodes de peinture surchargées auparavant. –

+0

le BackColor n'est pas une propriété de 'ListBox.ObjectCollection' élément – ghiboz

52

Merci pour le answer by Grad van Horck, il m'a guidé dans la bonne direction .

Pour soutenir le texte (pas seulement la couleur de fond) voici mon code entièrement travail:

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

adds ci-dessus au code donné et affiche le texte proprement dit, plus fort élément sélectionné.

+1

Excellent, le bit sélectionné était très utile. – Almo

+0

Qu'est-ce que reportsForegroundBrushSelected: reportsForegroundBrush ?? –

+0

reportsForegroundBrushSelected: reportsForegroundBrush me donne une erreur, ils sont supposés être déclarés mais comment? –

0
 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

0
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); 
     } 
Questions connexes