C# ListView 列宽自动

Posted

技术标签:

【中文标题】C# ListView 列宽自动【英文标题】:C# ListView Column Width Auto 【发布时间】:2010-11-18 10:54:18 【问题描述】:

如何将 c# winforms listview 控件的列宽设置为自动。像宽度 = -1 / -2 之类的东西?

【问题讨论】:

【参考方案1】:

使用这个:

yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);

yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

来自here

【讨论】:

但是如果你想要最大的标题或数据宽度呢?没有闪烁? @toddmo 使用两个字符串。并且,如果需要,在 listView.BeginUpdate(); 之间... listView.EndUpdate(); 不能同时使用两者。如果尝试将 ColumnHeaderAutoResizeStyle.ColumnContentColumnHeaderAutoResizeStyle.HeaderSize 一起“或”(导致值为“3”),则在运行时该行会给出异常 "System.ComponentModel.InvalidEnumArgumentException: 'The value of argument 'headerAutoResize' ( 3) 对 Enum 类型 'ColumnHeaderAutoResizeStyle' 无效。参数名称:headerAutoResize' "。或者,如果您执行这两行,第二行将覆盖第一个值,就好像第一行不存在一样。【参考方案2】:

还有另一种有用的方法称为AutoResizeColumn,它允许您使用所需参数自动调整特定列的大小。

你可以这样称呼它:

listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);

【讨论】:

【参考方案3】:

如果您在任何父面板中有 ListView(ListView 停靠填充),您可以使用简单的方法...

private void ListViewHeaderWidth() 
        int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
        foreach (ColumnHeader header in listViewInfo.Columns)
        
            header.Width = HeaderWidth;
        
    

【讨论】:

【参考方案4】:

另外值得注意的是,如果不先更改属性,ListView 可能无法按预期显示:

myListView.View = View.Details; // or View.List

对我来说,Visual Studio 似乎出于某种原因将其默认为 View.LargeIcon,因此在更改之前不会出现任何内容。

在 ListView 中显示单个列并为垂直滚动条留出空间的完整代码。

lisSerials.Items.Clear();
lisSerials.View = View.Details;
lisSerials.FullRowSelect = true;

// add column if not already present
if(lisSerials.Columns.Count==0)

    int vw = SystemInformation.VerticalScrollBarWidth;
    lisSerials.Columns.Add("Serial Numbers", lisSerials.Width-vw-5);


foreach (string s in stringArray)

    ListViewItem lvi = new ListViewItem(new string[]  s );
    lisSerials.Items.Add(lvi);

【讨论】:

【参考方案5】:

你可以使用这样的东西,在参数中传递你想要的 ListView

    private void AutoSizeColumnList(ListView listView)
    
        //Prevents flickering
        listView.BeginUpdate();

        Dictionary<int, int> columnSize = new Dictionary<int,int>();

        //Auto size using header
        listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

        //Grab column size based on header
        foreach(ColumnHeader colHeader in listView.Columns )
            columnSize.Add(colHeader.Index, colHeader.Width);

        //Auto size using data
        listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);

        //Grab comumn size based on data and set max width
        foreach (ColumnHeader colHeader in listView.Columns)
        
            int nColWidth;
            if (columnSize.TryGetValue(colHeader.Index, out nColWidth))
                colHeader.Width = Math.Max(nColWidth, colHeader.Width);
            else
                //Default to 50
                colHeader.Width = Math.Max(50, colHeader.Width);
        

        listView.EndUpdate();
    

【讨论】:

【参考方案6】:

我相信作者正在通过 IDE 寻找一种等效的方法,该方法将生成后面的代码并确保所有参数都到位等。从 MS 中找到了这个:

Creating Event Handlers on the Windows Forms Designer

我自己来自VB背景,这是我一直在寻找的,这是点击不良的简要版本:

    单击要为其创建事件处理程序的窗体或控件。 在“属性”窗口中,单击“事件”按钮 在可用事件列表中,单击要为其创建事件处理程序的事件。 在事件名称右侧的框中,键入处理程序的名称并按 ENTER

【讨论】:

【参考方案7】:

此解决方案将首先根据列数据调整列的大小,如果调整后的宽度小于标题大小,它将调整列的大小以至少适合标题。这是一个非常丑陋的解决方案,但它确实有效。

lstContacts.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
colFirstName.Width = (colFirstName.Width < 60 ? 60 : colFirstName.Width);
colLastName.Width = (colLastName.Width < 61 ? 61 : colLastName.Width);
colPhoneNumber.Width = (colPhoneNumber.Width < 81 ? 81 : colPhoneNumber.Width);
colEmail.Width = (colEmail.Width < 40 ? 40 : colEmail.Width);

lstContacts 是 ListView。 colFirstName 是一列,其中 60 是适合标题所需的宽度。 等等。

【讨论】:

使用 Math.Max: colFirstName.Width = Math.Max(colFirstName.Width, 60);【参考方案8】:

如果您想即时设置列的自动调整宽度,请扩展 Fredrik 的回答 例如:将第一列的自动大小宽度设置为 70:

myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

【讨论】:

【参考方案9】:

我制作了一个程序,可以多次清除并重新填充我的列表视图。出于某种原因,每当我添加宽度 = -2 的列时,我都会遇到第一列太长的问题。我为解决这个问题所做的就是创建这个方法。

private void ResizeListViewColumns(ListView lv)

    foreach(ColumnHeader column in lv.Columns)
    
        column.Width = -2;
    

这种方法的好处是您几乎可以将它放在任何地方来调整所有列的大小。只需传递您的ListView

【讨论】:

这会将宽度设置为 ListView 中最后一项的宽度 我使用你的代码,但如果我的列表视图中只有一列,每次我都会得到一个水平滚动条。如果至少有两列,则代码运行良好。你知道这种行为是从哪里来的吗?【参考方案10】:

您给出了答案:-2 会将列自动调整为列标题中文本的长度,-1 将自动调整为列中最长的项目。 All according to MSDN。请注意,在 -1 的情况下,您需要在添加项目后设置列宽。因此,如果您添加一个新项目,您还需要根据ListView 控件中的数据分配要自动调整大小的列的宽度属性。

【讨论】:

请注意,虽然 MSDN 文章引用了 ColumnHeader,但这只是指列。代码示例:myListView.Columns[0].Width = -1;

以上是关于C# ListView 列宽自动的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时调整 Android listview 列宽?

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

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

如何控制Listview每列的宽度自适应这列最长的内容

.NET ListView、最大字符数或最大列宽?可以覆盖/扩展吗?

C# ListView用法