.NET ListView、最大字符数或最大列宽?可以覆盖/扩展吗?
Posted
技术标签:
【中文标题】.NET ListView、最大字符数或最大列宽?可以覆盖/扩展吗?【英文标题】:.NET ListView, max number of characters, or maximum column width? Possible to override/expand? 【发布时间】:2011-07-30 09:41:38 【问题描述】:我有一个显示堆栈跟踪的 .NET ListView 控件。我使用 ListView 因为我需要操作某些行的字体/颜色。
但是,关于列的宽度,无论是显示的字符数,还是一列可以包含的像素数,似乎都有某种最大值。
这里有一个简单的LINQPad 示例来说明问题:
void Main()
using (var fm = new Form())
ListView lv = new ListView();
fm.Controls.Add(lv);
lv.Dock = DockStyle.Fill;
lv.View = View.Details;
lv.Columns.Add("C", -1, HorizontalAlignment.Left);
string line = new string('W', 258) + "x";
lv.Items.Add(line);
line = new string('W', 259) + "x";
lv.Items.Add(line);
lv.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent);
lv.Columns[0].Width.Dump();
fm.ShowDialog();
截图:
如您所见,包含 258 个 W + 一个 X 的行显示了 x,而包含一个额外 W 的下一行不显示 x。
那里的宽度计算的输出显示该列的当前宽度是2864像素。
问题是:我可以在 ListView 上调整什么来解决这个限制吗?
【问题讨论】:
请注意,我还需要能够选择单独的行,因此某些 rtf 或 html 控件的变体不好。但是,如果另一个控件可以做同样的事情,即基于列表的项目、字体/颜色控制,那么我全都听好了。 【参考方案1】:此行为记录在MSDN pages for ListViewItem
:
ListViewItem 的文本不应超过 259 个字符,否则可能会出现意外行为。
According to a Microsoft employee:
为什么列表视图项的文本长度限制为 259 个字符是 因为列表视图是为显示对象集合而设计的 文件,而不是用于通用控制。所以它类似于文件名 windows 文件系统的 MAX_PATH 的长度限制。
还有一个Microsoft Support article 关于这个。 ListViewItem
确实存储了全文,只是长度有限的显示。
但是,如果您自定义ListView
并将其设置为OwnerDraw
,则似乎可以显示全文:
public class MyListView : ListView
public MyListView()
OwnerDraw = true;
DrawItem += new DrawListViewItemEventHandler(MyListView_DrawItem);
private void MyListView_DrawItem(object sender, DrawListViewItemEventArgs e)
e.Graphics.DrawString(e.Item.Text, e.Item.Font,
new SolidBrush(e.Item.ForeColor), e.Bounds);
这将显示每个ListViewItem
的全文。这样做的缺点是您还需要自定义绘制其他视觉状态(例如选定状态、焦点状态等),除非您可以通过某种方式将它们路由到原始绘图代码。
我不知道这样做是否还有其他副作用。
【讨论】:
这个不行,文字全乱了,不能点击每个ListViewItem的。以上是关于.NET ListView、最大字符数或最大列宽?可以覆盖/扩展吗?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 8.1 应用程序:使用换行、最大行数或最大高度识别 TextBlock 的 UI 文本截断
vb 6.0 Listview控件 怎样实现根据字符长度自动调整列宽?