5

我有一个显示堆栈跟踪的 .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();
    }
}

截屏:

listview问题截图

如您所见,包含 258 个 W + 一个 X 的行显示了 x,而包含一个额外 W 的下一行不显示 x。

宽度计算的输出显示该列的当前宽度为 2864 像素。

问题是:有什么我可以在 ListView 上调整来解决这个限制的吗?

4

1 回答 1

9

此行为记录在MSDN 页面中ListViewItem

ListViewItem 的文本不应超过 259 个字符,否则可能会出现意外行为。

根据微软员工的说法

为什么列表视图项的文本长度限制为 259 个字符是因为列表视图是为显示文件等对象的集合而设计的,而不是用于通用控制。所以它类似于windows文件系统的MAX_PATH中的文件名长度限制。

还有一篇关于此的Microsoft 支持文章。确实存储了全文,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. 这样做的缺点是您还需要自定义绘制其他视觉状态(例如选定状态、焦点状态等),除非您可以以某种方式将它们路由到原始绘图代码。

我不知道这样做是否有任何其他副作用。

于 2011-04-05T23:51:51.900 回答