ListBox вставляет элементы в цвете - PullRequest
4 голосов
/ 21 марта 2012

Я использую ListBox для вставки текста, например You add Michael in your database, You delete Michael, ...

 listBox1.Items.Insert(0,"You add " + name + " in your database\n");

Работает нормально.Как я могу установить цвет один раз черный (для вставки) и один раз красный (для удаления)?Я пытался с этим:

 public class MyListBoxItem
    {
        public MyListBoxItem(Color c, string m)
        {
            ItemColor = c;
            Message = m;
        }
        public Color ItemColor { get; set; }
        public string Message { get; set; }
    }

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        MyListBoxItem item = listBox1.Items[e.Index] as MyListBoxItem; // Get the current item and cast it to MyListBoxItem

        if (item != null)
        {
            e.Graphics.DrawString( // Draw the appropriate text in the ListBox
            item.Message, // The message linked to the item
            listBox1.Font, // Take the font from the listbox
            new SolidBrush(item.ItemColor), // Set the color 
            0, // X pixel coordinate
            e.Index * listBox1.ItemHeight // Y pixel coordinate.  Multiply the index by the ItemHeight defined in the listbox.
            );
        }
        else
        {
            // The item isn't a MyListBoxItem, do something about it
        }
    }

И при вставке:

 listBox1.Items.Insert(0, new MyListBoxItem(Color.Black, "You add " + name + " in your database\n"));
 listBox1.Items.Insert(0, new MyListBoxItem(Color.Red, "You delete " + name + "\n"));

Этот код работает, но когда я вставляю несколько элементов, прокрутка не работает правильно - текст не отображается.Что я делаю неправильно?Или есть другой способ сделать это?

Ответы [ 3 ]

6 голосов
/ 21 марта 2012

Рассматривали ли вы использование ListView в виде отчета вместо списка?Тогда вам не нужно настраивать рисунок, чтобы получить цвета.

5 голосов
/ 21 марта 2012

Вы должны использовать:

e.Bounds.Top

вместо:

e.Index * listBox1.ItemHeight

Кроме того, перед рисованием текста я рекомендую нарисовать фон, чтобы вы могли видеть, какой элемент выбран, если список поддерживает выделение или в любом случае поддерживает желаемый цвет фона элемента списка:

using (Brush fill = new SolidBrush(e.BackColor))
{
   e.Graphics.FillRectangle(fill, e.Bounds);
}

И вы должны правильно располагать кисть, которую вы создаете, чтобы нарисовать текст.

3 голосов
/ 21 марта 2012

Изменить чертеж на

 e.Graphics.DrawString(item.Message, 
   listBox1.Font, 
   new SolidBrush(item.ItemColor), 
   0,
   e.Bounds.Top);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...