ListBoxの任意な行の色変え

「ListBox においてある条件にあてはまるアイテムを赤色表示する」ということとなった。

for (int ii = 0; ii < listBox.Items.Count; ii++)
{
  if (〜〜〜〜である場合)
  {
    listBox.Items[ii].________ = Color.Red;
  }
}

みたいなことができるのかと思ったが、Items[ii]には色を変えるようなプロパティはなかった。
というより、プロパティが一つもなかった。

色のプロパティは listBox が持っている。ということは、任意の行の色を変えることはできないのか?


調べてみたら、ListBox の DrawItem イベントで個別の色表示が可能となるらしい。
以下の処理を作成してイベント設定してみた。

※インデントのため、行頭に全角スペースが入っています
private void listBox_DrawItem(object sender, DrawItemEventArgs e)
{
  e.DrawBackground();
  //背景を描画する
  //項目が選択されている時は強調表示される

  //ListBoxが空のときにListBoxが選択されるとe.Indexが-1になる
  if (e.Index > -1)
  { //空でない場合
    Brush b = null;
    //文字を描画する色の選択

    string txt = *1
      { //違反ありの場合
        b = new SolidBrush(Color.Red);
        //赤字にする
      }
      else
      { //違反なしの場合
        b = new SolidBrush(e.ForeColor);
        //そのままの前景色を使う
      }
    }
    else
    { //選択されている時
      b = new SolidBrush(e.ForeColor);
      //そのままの前景色を使う
    }
    e.Graphics.DrawString(txt, e.Font, b, e.Bounds);
    //文字列の描画
    b.Dispose();
    //後始末
  }

  e.DrawFocusRectangle();
  //フォーカスを示す四角形を描画
}

それでもうまくいかなかった。
errorItems に最初からある行の文字列を設定しておくとその行は赤色に表示された。
errorItems に追加するだけではだめみたいである。
追加した後に Refresh() を呼ぶようにしたら

errorItems.Add("AAAAA");
listBox.Refresh();

うまくいった。

*1:ListBox)sender).Items[e.Index].ToString();     //描画する文字列の取得     if ((e.State & DrawItemState.Selected) != DrawItemState.Selected)     { //選択されていない時       if (errorItems.Contains(txt