You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改ListBox中包含特定字符串的列表项颜色?

修改ListBox中包含特定字符串项的颜色方法

嘿,我来帮你搞定这个ListBox项变色的问题!你原来的代码思路是对的——先遍历项找到包含特定字符串的内容,但直接修改lstBoxResidencies.Items[i]是没法改变颜色的,因为ListBox默认的字符串项没有自带的颜色属性。我们得用**自绘(OwnerDraw)**的方式来实现这个需求,具体步骤如下:

步骤1:设置ListBox的绘制模式

首先要把ListBox的DrawMode属性改成OwnerDrawFixed或者OwnerDrawVariable,这样我们才能自定义每个项的绘制样式。你可以在窗体设计器里直接改,也可以在代码里设置:

// 比如在窗体加载事件里设置
private void Form1_Load(object sender, EventArgs e)
{
    lstBoxResidencies.DrawMode = DrawMode.OwnerDrawFixed;
    // 绑定绘制事件
    lstBoxResidencies.DrawItem += lstBoxResidencies_DrawItem;
}

步骤2:实现DrawItem事件处理方法

接下来我们要写一个事件处理方法,每次ListBox绘制项的时候,判断该项是否包含目标字符串,然后设置对应的文本颜色:

// 定义要匹配的字符串(可以放在类级别,方便随时修改)
private string statusG = "Status: (1)";

private void lstBoxResidencies_DrawItem(object sender, DrawItemEventArgs e)
{
    // 先绘制默认的背景
    e.DrawBackground();

    // 确保索引有效(避免空项导致报错)
    if (e.Index >= 0)
    {
        string itemContent = lstBoxResidencies.Items[e.Index].ToString();
        Brush textBrush;

        // 判断当前项是否包含目标字符串
        if (itemContent.Contains(statusG))
        {
            // 这里改成你想要的颜色,比如红色
            textBrush = Brushes.Red;
        }
        else
        {
            // 使用系统默认的文本颜色
            textBrush = SystemBrushes.WindowText;
        }

        // 绘制文本到项的区域
        e.Graphics.DrawString(itemContent, e.Font, textBrush, e.Bounds);
    }

    // 绘制焦点框(可选,提升交互体验)
    e.DrawFocusRectangle();
}

为什么原来的代码不行?

ListBox默认显示的是字符串对象,这些对象没有ForeColor或BackColor属性。只有通过自绘模式,我们才能接管每个项的绘制过程,自定义颜色、字体等样式。

这种方法还有个好处:不管你是一开始加载项,还是后续动态添加/修改项,ListBox都会自动重新绘制,符合条件的项都会自动变色,不需要手动再遍历一次~

内容的提问来源于stack exchange,提问作者Serhat Akat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:14:07