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

如何让ListBox滚动条可见且生效?当前横向滚动条无法拖动

解决ListBox横向滚动条无效问题

问题情况

ListBox已开启横向滚动条,但滚动条无法拖动,文本直接超出控件范围,无法查看完整内容。相关实现代码如下:

填充ListBox项的代码

listBox1.Items.Add(string.Format("Місце {0} | В роботі з {1} | {2} |({3} хв) | {4}", temp[7].Substring(6, 4), temp[8].Substring(11, 5),temp[2], rezult,rezvalSub));

DrawItem事件处理代码

private void listBox1_DrawItem_1(object sender, DrawItemEventArgs e)
{
    string itemText = (string)listBox1.Items[e.Index];
    if (itemText.EndsWith("+"))
    {
        e.Graphics.FillRectangle(new SolidBrush(Color.Yellow), e.Bounds);
    }
    else if (itemText.EndsWith("-"))
    {
        e.Graphics.FillRectangle(new SolidBrush(Color.Red), e.Bounds);
    }
    else
    {
        e.Graphics.FillRectangle(new SolidBrush(Color.White), e.Bounds);
    }

    if (e.Index < 0) return;
    TextRenderer.DrawText(e.Graphics, itemText, listBox1.Font, e.Bounds, listBox1.ForeColor, TextFormatFlags.Left);
}

问题原因

使用自定义DrawItem事件绘制文本时,ListBox无法自动计算所有项的实际宽度,导致横向滚动条的滚动范围(HorizontalExtent属性)未正确设置,因此滚动条拖动无效。

解决方案

手动计算所有项的最大宽度,设置给ListBox的HorizontalExtent属性,让控件明确横向需要滚动的范围。

步骤1:添加计算最大项宽度的方法

private int GetListBoxMaxItemWidth()
{
    int maxWidth = 0;
    using (Graphics g = listBox1.CreateGraphics())
    {
        foreach (string item in listBox1.Items)
        {
            int itemWidth = TextRenderer.MeasureText(item, listBox1.Font).Width;
            if (itemWidth > maxWidth)
            {
                maxWidth = itemWidth;
            }
        }
    }
    return maxWidth;
}

步骤2:填充完所有项后设置滚动范围

在向ListBox添加完所有项的代码之后,调用上述方法并赋值:

// 所有项添加完成后执行
listBox1.HorizontalExtent = GetListBoxMaxItemWidth();

可选优化:简化DrawItem中的字符串判断

原代码中字符串截取判断可简化为EndsWith,更简洁高效,如上述修改后的DrawItem代码所示。

完成以上修改后,横向滚动条就能正常拖动,查看超出控件范围的完整文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:01:11