.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控件 怎样实现根据字符长度自动调整列宽?

vb 6.0 Listview控件 怎样实现根据字符长度自动调整列宽?

具有固定列宽和最大高度的 CSS 表格

如何将 html 列宽固定为其内容的最大宽度?

C# ListView 列宽自动调整