所有列表框项目都是彩色而不是逐个

时间:2014-12-16 08:03:33

标签: c# winforms listbox

当我的列表框的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);
        }
    }
}

1 个答案:

答案 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();
}