当我的列表框的DrawItem
事件被触发时。我想迭代它的项目,如果每个项目的文本符合某个条件,那么它们的背景颜色将是绿色,如果不是,它们将是黄色。
使用以下代码,我将所有项目都用相同的颜色。我不是很擅长在C Sharp
中编程图形。我想。
private void listBoxYourSelection_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox lst = (ListBox)sender;
foreach(string item in lst.Items)
{
Color col = new Color();
e.DrawBackground();
e.DrawFocusRectangle();
if (CONDITIONISTRUE)
col = Color.Green;
else
col = Color.Yellow;
e.Graphics.DrawRectangle(new Pen(col), e.Bounds);
e.Graphics.FillRectangle(new SolidBrush(col), e.Bounds);
if (e.Index >= 0)
{
e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), e.Bounds, StringFormat.GenericDefault);
}
}
}
答案 0 :(得分:2)
错误确实是迭代ListBox
中的项目。
您不需要关心任何其他Item
,因为DrawItem
方法已经为您做了!只要系统认为有必要,它就会单独为ListBox中的每个Item调用..
您需要注意的是为当前通话中正在绘制的一个 Color, Font, Text
选择正确的Item
等。
您可以通过查看e.Index
参数来识别正在绘制的项目。
稍加修改的版本可能如下所示:
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
// for testing I turn on every other item;
// you will want to use another way to decide..!!
bool CONDITIONISTRUE = e.Index % 2 == 0;
bool selected = listBox1.SelectedIndex == e.Index;
Color col = new Color();
if (CONDITIONISTRUE)
col = selected ? SystemColors.HotTrack : Color.PaleGreen;
else
col = selected ? SystemColors.HotTrack : Color.Gold;
e.DrawBackground(); // not really needed
e.DrawFocusRectangle(); // not really needed either
using (Pen pen = new Pen(col))
using (SolidBrush brush = new SolidBrush(col))
{
e.Graphics.DrawRectangle(new Pen(col), e.Bounds);
e.Graphics.FillRectangle(new SolidBrush(col), e.Bounds);
}
if (e.Index >= 0)
{
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),
e.Font, selected? Brushes.White:Brushes.Black,
e.Bounds, StringFormat.GenericDefault); }
}
}
显然,应该在代码中以其他方式设置CONDITIONISTRUE!如果是一种方法,您可能希望将项索引作为参数包含..
注1:由于您的绘图完全填充了每个项目,因此无法再识别当前选定的项目。我通过选择更多颜色来解决这个问题:您可以使用任何其他颜色,而不是通常的SystemColors.HotTrack
白色文本,当然......或者只是一个粗体字体。
注2:由于ListBox尝试通过始终绘制每个项来“优化”自己,我们需要通过添加以下内容来强制它:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
listBox1.Invalidate();
}