System.Windows.Forms.ListBoxの特定の項目の背景色を設定するにはどうすればよい ですか?
できれば複数設定できるようにしたいです。
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();
}
上記は指定されたコードに追加され、適切なテキストが表示され、選択された項目が強調表示されます。
おそらく、それを達成する唯一の方法は、アイテムを自分で描くことです。
DrawItem イベントでDrawMode
toを設定し、次のようにコーディングします。OwnerDrawFixed
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();
}
2 番目のオプションは、ListView を使用することですが、別の実装方法があります (実際にはデータにバインドされていませんが、列の方法がより柔軟です)。
// 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;
複数の背景色を設定することで、アイテムごとに異なる背景色を設定することを意味する場合、これは ListBox では不可能ですが、ListView では可能です。
// Set the background of the first item in the list
MyListView.Items[0].BackColor = Color.Red;