web-dev-qa-db-fra.com

C #: changer la couleur de la rangée dans la listbox?

J'essaie de changer la couleur d'arrière-plan de certaines lignes dans une ListBox. J'ai deux listes dont l'une porte un nom et qui est affichée dans une ListBox. La deuxième liste a des valeurs similaires à celles de la première List. Lorsque je clique sur un bouton, je souhaite effectuer une recherche dans ListBox et dans la seconde List, et modifier la couleur de ListBox pour les valeurs qui apparaissent dans List. Ma recherche dans la ListBox est la suivante: 

for (int i = 0; i < listBox1.Items.Count; i++)
{
    for (int j = 0; j < students.Count; j++)
    {
        if (listBox1.Items[i].ToString().Contains(students[j].ToString()))
        {
        }
    }
}

Mais je ne sais pas quelle méthode utiliser pour modifier l'apparence d'une ligne ListBox. Quelqu'un peut-il m'aider?

**MODIFIER: **

HI j'ai écrit mon code comme suit: 

private void ListBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    Graphics g = e.Graphics;
    Brush myBrush = Brushes.Black;
    Brush myBrush2 = Brushes.Red;
    g.FillRectangle(new SolidBrush(Color.Silver), e.Bounds);
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
        for (int j = 0; j < existingStudents.Count; j++)
        {
            if (listBox1.Items[i].ToString().Contains(existingStudents[j]))
            {
                e.Graphics.DrawString(listBox1.Items[i].ToString(),
                e.Font, myBrush2, e.Bounds, StringFormat.GenericDefault);
            }
        }
    }
    e.DrawFocusRectangle();
}

Maintenant, il trace ma List dans la ListBox, mais lorsque je clique en premier sur le bouton, il affiche en rouge uniquement les étudiants qui se trouvent dans la List et lorsque je clique sur la ListBox, il dessine tous les éléments. Je veux qu’il affiche tous les éléments, et lorsque je clique sur le bouton, il affiche tous les éléments et l’élément trouvé dans la variable List en rouge. Où est mon erreur?

32
Ercan

Je trouve la solution qu'au lieu d'utiliser ListBox, j'ai utilisé ListView.Il permet de changer les éléments de la liste BackColor.

private void listView1_Refresh()
{
    for (int i = 0; i < listView1.Items.Count; i++)
    {
        listView1.Items[i].BackColor = Color.Red;
        for (int j = 0; j < existingStudents.Count; j++)
        {
            if (listView1.Items[i].ToString().Contains(existingStudents[j]))
            {
                listView1.Items[i].BackColor = Color.Green;
            }
        }
    }
}
26
Ercan

Vous devrez dessiner l'article vous-même. Changez le DrawMode en OwnerDrawFixed et gérez l'événement DrawItem.

/// <summary>
/// Handles the DrawItem event of the listBox1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.DrawItemEventArgs"/> instance containing the event data.</param>
private void listBox1_DrawItem( object sender, DrawItemEventArgs e )
{
   e.DrawBackground();
   Graphics g = e.Graphics;

    // draw the background color you want
    // mine is set to olive, change it to whatever you want
    g.FillRectangle( new SolidBrush( Color.Olive), e.Bounds );

    // draw the text of the list item, not doing this will only show
    // the background color
    // you will need to get the text of item to display
    g.DrawString( THE_LIST_ITEM_TEXT , e.Font, new SolidBrush( e.ForeColor ), new PointF( e.Bounds.X, e.Bounds.Y) );

    e.DrawFocusRectangle();
}
21
Justin

Commencez par utiliser cet espace de noms:

using System.Drawing;

Ajoutez ceci n'importe où sur votre formulaire:

listBox.DrawMode = DrawMode.OwnerDrawFixed;
listBox.DrawItem += listBox_DrawItem;

Voici le gestionnaire d'événement:

private void listBox_DrawItem(object sender, DrawItemEventArgs e)
{
     e.DrawBackground();

     Graphics g = e.Graphics;
     g.FillRectangle(new SolidBrush(Color.White), e.Bounds);
     ListBox lb = (ListBox)sender;
     g.DrawString(lb.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), new PointF(e.Bounds.X, e.Bounds.Y));

     e.DrawFocusRectangle();
}
12
Anadrol

Je pense que vous devez dessiner vous-même la liste pour y parvenir.

Voici un post avec le même genre de question.

2
Rhapsody

Je trouve la solution pour le fond des éléments de la listbox en jaune. J'ai essayé la solution suivante pour atteindre la sortie.

 for (int i = 0; i < lstEquipmentItem.Items.Count; i++)
                {
                    if ((bool)ds.Tables[0].Rows[i]["Valid_Equipment"] == false)
                    {
                        lblTKMWarning.Text = "Invalid Equipment & Serial Numbers are highlited.";
                        lblTKMWarning.ForeColor = System.Drawing.Color.Red;
                        lstEquipmentItem.Items[i].Attributes.Add("style", "background-color:Yellow");
                        Count++;
                    }

                }
0
Papun Sahoo