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?
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;
}
}
}
}
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();
}
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();
}
Je pense que vous devez dessiner vous-même la liste pour y parvenir.
Voici un post avec le même genre de question.
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++;
}
}