C# ListBox动态添加元素时如何设置各元素不同颜色?
解决ListBox单个项设置不同颜色的问题
默认WinForms的ListBox控件无法直接为单个项设置颜色,因为BackColor和ForeColor是控件级别的属性,作用于所有项。要实现每个项独有的颜色,需要启用自绘模式并处理绘制事件,具体步骤如下:
1. 开启ListBox的自绘模式
可以通过两种方式设置:
- 设计器操作:选中ListBox,在属性面板找到
DrawMode,设置为OwnerDrawFixed - 代码初始化时设置:
listBox1.DrawMode = DrawMode.OwnerDrawFixed;
2. 创建自定义项类(存储文本和对应颜色)
为了给每个项绑定专属颜色,我们可以创建一个简单的类来保存文本和颜色信息:
public class ColoredListBoxItem { public string DisplayText { get; set; } public Color ForeColor { get; set; } // 文本颜色 public Color BackColor { get; set; } // 背景颜色(可选) }
3. 修改添加项的代码
替换原来直接添加字符串的逻辑,改为添加自定义对象,同时为每个项生成或指定独特颜色:
// 随机生成独特颜色(也可以根据业务逻辑指定固定颜色) Random rand = new Random(); Color uniqueForeColor = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256)); Color uniqueBackColor = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256)); // 拼接原文本 string itemText = string.Format("Місце {0} | В роботі з {1} | ({2} хв)", temp[7].Substring(6, 4), temp[8].Substring(11, 5), rezult); // 添加自定义项到ListBox listBox1.Items.Add(new ColoredListBoxItem { DisplayText = itemText, ForeColor = uniqueForeColor, BackColor = uniqueBackColor });
4. 处理DrawItem事件绘制自定义项
在ListBox的DrawItem事件中,手动绘制每个项的内容和颜色:
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) { // 跳过无效索引 if (e.Index < 0 || e.Index >= listBox1.Items.Count) return; ColoredListBoxItem currentItem = (ColoredListBoxItem)listBox1.Items[e.Index]; // 绘制背景 e.Graphics.FillRectangle(new SolidBrush(currentItem.BackColor), e.Bounds); // 绘制文本 e.Graphics.DrawString( currentItem.DisplayText, e.Font, new SolidBrush(currentItem.ForeColor), e.Bounds, StringFormat.GenericDefault ); // 绘制焦点矩形(可选) e.DrawFocusRectangle(); }
关键说明
- 如果你只需要设置文本颜色,可以去掉
BackColor相关的代码,只保留文本颜色的绘制逻辑 - 若要避免随机颜色重复,可以维护一个已使用颜色的集合,生成颜色时做判断
- 自绘模式下,ListBox的项高度可以通过
ItemHeight属性调整
内容的提问来源于stack exchange,提问作者Chackycool
相关产品推荐
相关产品推荐

