在C#中,如何防止列表框中的所有项目更改为上次设置的颜色?

在C#中,如何防止列表框中的所有项目更改为上次设置的颜色?,c#,winforms,visual-studio,listbox,C#,Winforms,Visual Studio,Listbox,我研究了如何更改每行的颜色,下面是我使用公共变量itemColor的代码,它是一个笔刷 ... public Brush itemColor; private void button2_Click(object sender, EventArgs e) { itemColor = Brushes.Purple; listBox1.Items.Add("Purple"); itemColor = Brushes.Green; listBox1.Items.Add

我研究了如何更改每行的颜色,下面是我使用公共变量itemColor的代码,它是一个笔刷

...

public Brush itemColor;

private void button2_Click(object sender, EventArgs e)
{
    itemColor = Brushes.Purple;
    listBox1.Items.Add("Purple");
    itemColor = Brushes.Green;
    listBox1.Items.Add("Green");
    itemColor = Brushes.Red;
    listBox1.Items.Add("Red");
}

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), listBox1.Font, 
                          itemColor, e.Bounds, StringFormat.GenericDefault);
    e.DrawFocusRectangle();
}

...

我已经将listbox DrawMode设置为OwnerDrawFixed,所有项目都变为红色。有人能看到我的可能愚蠢的错误吗?

listBox1\u DrawItem
每次需要重新绘制控件时都会被调用,例如在项目添加/删除或选择更改时。通过在表单中添加第二个按钮并执行以下操作,您可以看到这一点:

private void button2_Click(object sender, EventArgs e)
{
    itemColor = Brushes.Blue;
}
单击第二个按钮后,下次重新绘制
列表框时,所有项目的文本都将为蓝色


很可能有更好的方法可以做到这一点,但您可以处理这一点的一种方法是创建一个类,用
文本
画笔
字段来表示您的项目,然后添加这些内容并用它们填充您的列表框。然后在DrawItem处理程序上,将
项[e.Index]
强制转换到类中,并引用文本和颜色字段。大概是这样的:

class Entry
{
    public string Text;
    public Brush Color;
}

private void button1_Click(object sender, EventArgs e)
{
    listBox1.Items.Add(new Entry { Text = "Purple", Color = Brushes.Purple });
    listBox1.Items.Add(new Entry { Text = "Green",  Color = Brushes.Green  });
    listBox1.Items.Add(new Entry { Text = "Red",    Color = Brushes.Red    });
}

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    var currentItem = listBox1.Items[e.Index] as Entry;

    e.DrawBackground();
    e.Graphics.DrawString(currentItem.Text, listBox1.Font, currentItem.Color,
                          e.Bounds, StringFormat.GenericDefault);
    e.DrawFocusRectangle();
}

我刚刚尝试了另一个按钮,后来添加了一条绿线,在前三条线变为红色后,这四条线全部变为绿色。@TimWayne ha,ha,我刚刚用一些非常类似的东西更新了我的答案,以便您在触发
DrawItem
事件处理程序时使用。我还包括了一个简单的(粗糙的)解决方案,我测试了它并在这个例子中起作用。不管怎样,我更喜欢它在代码方面,而且它还起作用!谢谢