it-roy-ru.com

C #: изменить цвет элементов списка

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

код:

try
{
    validatedata;
    listBox1.Items.Add("Successfully validated the data  : "+validateddata);
}
catch()
{
    listBox1.Items.Add("Failed to validate data: " +validateddata);
}
15
BOSS

Предполагая WinForms, это то, что я бы сделал:

Начните с создания класса, который будет содержать элемент для добавления в список.

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

Добавьте элементы в ваш список, используя этот код:

listBox1.Items.Add(new MyListBoxItem(Colors.Green, "Validated data successfully"));
listBox1.Items.Add(new MyListBoxItem(Colors.Red, "Failed to validate data"));

В свойствах ListBox установите для параметра DrawMode значение OwnerDrawFixed и создайте обработчик события для события DrawItem. Это позволяет вам рисовать каждый элемент так, как вы пожелаете.

В событии DrawItem:

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
    }
}

Есть несколько ограничений - главное, вам нужно написать свой собственный обработчик кликов и перерисовать соответствующие элементы, чтобы они выглядели выделенными, поскольку Windows не будет делать это в режиме OwnerDraw. Однако, если это всего лишь журнал событий, происходящих в вашем приложении, вы можете не заботиться о том, чтобы элементы отображались по выбору.

Чтобы перейти к последнему пункту, попробуйте

listBox1.TopIndex = listBox1.Items.Count - 1;
32
Neil

Не совсем ответ на ваш вопрос, однако вы можете посмотреть на ObjectListView. Это ListView, а не listbox, но он очень гибкий и простой в использовании. Он может быть использован с одним столбцом для представления ваших данных

Я использую это, чтобы раскрасить статус каждой строки

http://objectlistview.sourceforge.net/cs/index.html

Это для WinForms конечно.

1
ScruffyDuck

Как насчет

            MyLB is a listbox

            Label ll = new Label();
            ll.Width = MyLB.Width;
            ll.Content = ss;
            if(///<some condition>///)
                ll.Background = Brushes.LightGreen;
            else
                ll.Background = Brushes.LightPink;
            MyLB.Items.Add(ll);
0
Dan Hed