2008-09-18 5 views

ответ

50

Вероятно, единственный способ добиться этого - нарисовать предметы самостоятельно.

Установите DrawMode в OwnerDrawFixed

и код что-то вроде этого на мероприятии 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(); 
} 

Второй вариант будет использовать в ListView, хотя они имеют другой способ реализации (не действительно данные связанный, но более гибкий по сравнению с колоннами)

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; 

Если вы имеете в виду, установив несколько backgroun г цвета устанавливает цвет фона для каждого элемента, это не представляется возможным с ListBox, но с ListView, с чем-то вроде:

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

Это возможно с ListBox. См. Http://stackoverflow.com/questions/91747/background-color-of-a-listbox-item-winforms#91758 – jfs 2008-09-18 11:35:44

+0

s/возможно/просто /. Ну что ж. C# 1, новичок 0. Я не много работал с перегрузкой методов рисования раньше. – 2008-09-18 11:38:30

52

Спасибо за answer by Grad van Horck, он вел меня в правильном направлении ,

Для поддержки текста (а не только цвет фона) вот мой полностью рабочий код:

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

выше добавляет к данному коду и покажет правильный текст плюс выделение выбранного пункта.

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

Полный образец

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); 
     } 
Смежные вопросы