Как покрасить линии в списке? - PullRequest
2 голосов
/ 22 сентября 2010

Hy! Я хотел бы отобразить вывод моей системы журналов в виде списка с настраиваемой подсветкой в ​​зависимости от уровня или записи в журнале. (Общее, предупреждение, ошибка, отладка, трассировка)

somelistbox.Items.Add("Starting"); // I would like to drawn this as grey
somelistbox.Items.Add("Error!"); // I would like to drawn this as red

Так что я хотел бы добавить что-то новое, например, typeoflog, но я не знаю, как это сделать.

somelistbox.Items.Add("Error!",Type.Error); 

У меня есть этот код, который окрашивает элементы, зависит от номера элемента, но это не то, что я ищу.

    private void general_log_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        Brush myBrush = Brushes.Black;
        switch (actualLogType)
        {
            case LogTypes.General:
                myBrush = Brushes.Black;
                break;
            case LogTypes.Warning:
                myBrush = Brushes.Orange;
                break;
            case LogTypes.Error:
                myBrush = Brushes.Purple;
                break;
            case LogTypes.Debug:
                myBrush = Brushes.AntiqueWhite;
                break;
        }
        e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(),
            e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
        e.DrawFocusRectangle();
    }

ОБНОВЛЕНИЕ: Если кто-то все еще изучает это, я бы посоветовал взглянуть на проект NLog. У него есть цветная цель richtextbox.

Ответы [ 3 ]

3 голосов
/ 22 сентября 2010

ListBox может хранить не только строки, но и объекты.Вы хотите воспользоваться этим здесь, элемент списка в вашем случае имеет больше состояния, чем просто текст.Добавьте небольшой вложенный вспомогательный класс:

    private enum itemType { error, warning }

    private class listObject {
        public listObject(string txt, itemType type) { Text = txt; Type = type; }
        public string Text;
        public itemType Type;
        public override string ToString() { return Text; }
    }

Обратите внимание, как переопределение ToString () генерирует текст, который видит пользователь.Теперь просто добавьте элементы в список следующим образом:

        listBox1.Items.Add(new listObject("blah", itemType.warning));

И приведите объект обратно к вашему классу в обработчике события DrawItem:

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
        var obj = listBox1.Items[e.Index] as listObject;
        // etc..
    }

И используйте obj.Type для определения цветов.

0 голосов
/ 14 октября 2013

Вы также можете использовать ListView вместо ListBox, чтобы вы могли получить доступ к его свойству BackColor:

listView1.Items[i].BackColor = Color.Black;
0 голосов
/ 22 сентября 2010

Если это не список WPF, вам нужно использовать Win32 API. Это то, что вы после?

UPDATE

Использование WIn32 API не обязательно: http://www.codeproject.com/KB/combobox/ColorListBoxIcons.aspx

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