WinForm ListBox如何在单个项内实现多行内容显示?
解决WinForm ListBox单个列表项显示多行内容的问题
默认ListBox的Normal绘制模式不支持项内换行,哪怕你用\n也只会显示成普通字符。下面给两种可行的实现方法:
方法一:自绘ListBox项(推荐)
通过设置ListBox的自绘模式,手动处理文本换行和绘制,步骤如下:
- 在设计器里选中你的
listBox_BusRoute,设置DrawMode属性为OwnerDrawVariable。 - 给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(); }
- 你原来添加项的代码可以保持不变,自绘逻辑会自动解析
\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控件替代,设置后原生支持多行项:
- 在设计器里添加ListView,设置
View为Details,HeaderStyle为None,MultiLine为true,FullRowSelect为true。 - 添加一列,把列宽设为ListView的宽度。
- 修改添加项的代码:
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,提问作者Никита Кольчев
相关产品推荐
相关产品推荐

