ListBox
のいくつかの行の背景色を変更しようとしています。名前があり、ListBox
に表示される2つのリストがあります。 2番目のリストには、最初のList
と同様の値がいくつかあります。ボタンをクリックすると、ListBox
と2番目の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
行の外観を変更するために使用する方法がわかりません。誰も私を助けることができますか?
**編集:**
こんにちは、次のようにコードを書きました。
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
で見つかった要素が赤で表示されるようにします。私の間違いはどこですか?
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;
}
}
}
}
アイテムを自分で描く必要があります。 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();
}
最初にこの名前空間を使用します。
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();
}
これを実現するには、自分でリストアイテムを描画する必要があると思います。
ここに投稿があります 同じ種類の質問です。
リストボックスアイテムの背景が黄色になる解決策を見つけました。出力を達成するために次のソリューションを試しました。
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++;
}
}