C # Listbox.DrawItem для окраски каждой строки - PullRequest
0 голосов
/ 25 июня 2010

У меня есть код, чтобы изменить работу списка.Я могу изменить цвет текста, но не могу изменить цвет фона каждой строки.

Это цикл for для каждой из моих строк

LBLines - массивхранения строк в глобальной переменной

if (LBLines[e.Index] != "None")
{
       e.Graphics.FillRectangle(new SolidBrush(Color.FromName(LBLines[e.Index])),
e.Bounds.X,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
}

Это закрасит КАЖДЫЕ линии одного цвета, даже те, которые указаны как "Нет", вам нужно, чтобы они оставались такими же, как и цвет фона по умолчанию.

РЕДАКТИРОВАТЬ: Сравнение не проблема, проблема исходит от e.Graphics.FillRectangle.Кажется, он окрашивает ВСЕ пробелы в строках, независимо от того, что я рисую.

EDIT2: изменен код, показывающий, что h равно e.Index

1 Ответ

3 голосов
/ 25 июня 2010

Трудно сказать, без какого-либо контекста вокруг вашего кода (цикл, метод, ...), но этот код делает то, что, я думаю, вы хотите:

public partial class Form1 : Form
{
    string[] Colors { get; set; }

    public Form1()
    {
        InitializeComponent();
        Colors = new string[] { "red", "blue", "white", "none", "orange" };
        listBox1.Items.AddRange(Colors);
    }

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        if (Colors[e.Index] != "none")
        {
            using (var brush = new SolidBrush(Color.FromName(Colors[e.Index])))
            {
                e.Graphics.FillRectangle(brush, e.Bounds);
            }
        }
        e.Graphics.DrawString(Colors[e.Index], Font, SystemBrushes.ControlText, e.Bounds);
    }
}

Обратите внимание, что для свойства DrawStyle ListBox установлено значение OwnerDrawFixed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...