53

System.Windows.Forms.ListBoxの特定の項目の背景色を設定するにはどうすればよい ですか?

できれば複数設定できるようにしたいです。

4

4 に答える 4

62

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

上記は指定されたコードに追加され、適切なテキストが表示され、選択された項目が強調表示されます。

于 2010-09-14T13:46:54.333 に答える
56

おそらく、それを達成する唯一の方法は、アイテムを自分で描くことです。

DrawItem イベントでDrawModetoを設定し、次のようにコーディングします。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 を使用することですが、別の実装方法があります (実際にはデータにバインドされていませんが、列の方法がより柔軟です)。

于 2008-09-18T11:28:45.527 に答える
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;

複数の背景色を設定することで、アイテムごとに異なる背景色を設定することを意味する場合、これは ListBox では不可能ですが、ListView では可能です。

// Set the background of the first item in the list
MyListView.Items[0].BackColor = Color.Red;
于 2008-09-18T11:31:08.767 に答える