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

WinForm ListBox如何在单个项内实现多行内容显示?

解决WinForm ListBox单个列表项显示多行内容的问题

默认ListBox的Normal绘制模式不支持项内换行,哪怕你用\n也只会显示成普通字符。下面给两种可行的实现方法:

方法一:自绘ListBox项(推荐)

通过设置ListBox的自绘模式,手动处理文本换行和绘制,步骤如下:

  1. 在设计器里选中你的listBox_BusRoute,设置DrawMode属性为OwnerDrawVariable。
  2. 给ListBox添加DrawItem和MeasureItem事件的处理方法:
// 测量项的高度,确保能容纳多行文本
private void listBox_BusRoute_MeasureItem(object sender, MeasureItemEventArgs e)
{
    if (e.Index < 0) return;
    var listBox = sender as ListBox;
    string text = listBox.Items[e.Index].ToString();
    // 计算文本所需的高度
    SizeF size = e.Graphics.MeasureString(text, listBox.Font, listBox.ClientSize.Width);
    e.ItemHeight = (int)Math.Ceiling(size.Height);
}

// 手动绘制每个项,处理换行逻辑
private void listBox_BusRoute_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) return;
    var listBox = sender as ListBox;
    string text = listBox.Items[e.Index].ToString();
    
    e.DrawBackground();
    // 用TextRenderer绘制支持换行的文本
    TextRenderer.DrawText(e.Graphics, text, listBox.Font, e.Bounds, listBox.ForeColor, 
        TextFormatFlags.WordBreak | TextFormatFlags.Left | TextFormatFlags.Top);
    e.DrawFocusRectangle();
}
  1. 你原来添加项的代码可以保持不变,自绘逻辑会自动解析\n实现换行:
foreach (var bus in allBus)
{
    string busRouteInfoText = $"Название маршрута: {bus[1]}\n" +
                      $"Номер автобуса: {bus[0]}\n" +
                      $"Дата отправления и прибытия: {bus[2]} - {bus[3]}\n" +
                      $"Стоимость билета: {bus[4]}";
    listBox_BusRoute.Items.Add(busRouteInfoText);
}

方法二:改用ListView控件(备选)

如果不想写自绘代码,可以用ListView控件替代,设置后原生支持多行项:

  1. 在设计器里添加ListView,设置View为Details,HeaderStyle为None,MultiLine为true,FullRowSelect为true。
  2. 添加一列,把列宽设为ListView的宽度。
  3. 修改添加项的代码:
foreach (var bus in allBus)
{
    string busRouteInfoText = $"Название маршрута: {bus[1]}\n" +
                      $"Номер автобуса: {bus[0]}\n" +
                      $"Дата отправления и прибытия: {bus[2]} - {bus[3]}\n" +
                      $"Стоимость билета: {bus[4]}";
    listView_BusRoute.Items.Add(new ListViewItem(busRouteInfoText));
}

这种方法无需自绘,但ListView的交互逻辑和ListBox略有区别,可根据需求选择。

内容的提问来源于stack exchange,提问作者Никита Кольчев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:42:48