web-dev-qa-db-fra.com

C #: changer la couleur des éléments de la listbox

je travaille sur un programme sur des formulaires Windows. J'ai une liste déroulante et je valide les données. Je souhaite que les données correctes soient ajoutées à la liste déroulante avec la couleur verte tandis que les données non valides sont ajoutées en couleur rouge. un article est ajouté et merci

code:

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

En supposant que WinForms, voici ce que je ferais:

Commencez par faire en sorte qu'une classe contienne l'élément à ajouter à la liste.

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

Ajoutez des éléments à votre liste en utilisant ce code:

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

Dans les propriétés du contrôle ListBox, définissez DrawMode sur OwnerDrawFixed et créez un gestionnaire d'événements pour l'événement DrawItem. Cela vous permet de dessiner chaque élément comme vous le souhaitez.

Dans l'événement 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
    }
}

Il existe quelques limitations - la principale étant que vous deviez écrire votre propre gestionnaire de clics et redessiner les éléments appropriés pour les faire apparaître comme étant sélectionnés, car Windows ne le ferait pas en mode OwnerDraw. Toutefois, s'il s'agit simplement d'un journal des événements de votre application, il est possible que vous ne vous préoccupiez pas des éléments pouvant être sélectionnés.

Pour faire défiler jusqu'au dernier article, essayez

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

Ce n'est pas vraiment une réponse à votre question, mais vous voudrez peut-être regarder ObjectListView. C'est une liste plutôt qu'une liste mais elle est très flexible et facile à utiliser. Il pourrait être utilisé avec une seule colonne pour représenter vos données

Je l'utilise pour colorier le statut de chaque ligne

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

Ceci est pour WinForms bien sûr.

1
ScruffyDuck

Que diriez-vous

            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