С#: изменение цвета строки списка?
Я пытаюсь изменить цвет фона некоторых строк в ListBox
. У меня есть два списка, у которых есть имена и отображается в ListBox
. Второй список имеет некоторые аналогичные значения, такие как первый List
. При нажатии кнопки я хочу выполнить поиск ListBox
и второй List
и изменить цвет ListBox
для тех значений, которые отображаются в List
. Мой поиск в ListBox
выглядит следующим образом:
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()))
{
}
}
}
Но я не знаю, какой метод использовать для изменения внешнего вида строки ListBox
. Кто-нибудь может мне помочь?
** РЕДАКТИРОВАТЬ: **
HI Я написал свой код следующим образом:
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();
}
Теперь он рисует мой List
в ListBox
, но когда я нажимаю кнопку сначала, он показывает красным только ученикам, которые находятся в List
, и когда я нажимаю на ListBox
, он рисует все элементы. Я хочу, чтобы он отобразил все элементы, и когда я нажму кнопку, он покажет все элементы и элемент, найденный в List
красным. Где моя ошибка?
Ответы
Ответ 1
Я нахожу решение, что вместо использования ListBox я использовал ListView.It позволяет изменять элементы списка 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;
}
}
}
}
Ответ 2
Вам нужно будет нарисовать элемент самостоятельно. Измените DrawMode на OwnerDrawFixed и обработайте событие 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();
}
Ответ 3
Сначала используйте это пространство имен:
using System.Drawing;
Добавьте это в любом месте вашей формы:
listBox.DrawMode = DrawMode.OwnerDrawFixed;
listBox.DrawItem += listBox_DrawItem;
Вот обработчик событий:
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();
}
Ответ 4
Думаю, вам нужно сделать сами списки, чтобы достичь этого.
Здесь сообщение с тем же вопросом.
Ответ 5
Как насчет
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);