C#ListView列宽自动


82

如何将ac#winformslistview控件的列宽设置为auto。宽度= -1 / -2之类的东西?

Answers:


106

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


请注意,尽管MSDN文章引用了ColumnHeader,但这仅表示该列。代码示例:myListView.Columns[0].Width = -1;
Eric G

103

用这个:

yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

这里


8
但是,如果您想要最大的标头或数据宽度怎么办?没有闪烁?
toddmo 2014年

@toddmo使用两个字符串。并且,如果需要,在listView.BeginUpdate();之间;... listView.EndUpdate();
Artem Zh。

23

我编写了一个程序,多次清除并重新填充了列表视图。由于某种原因,每当我添加width = -2的列时,我都会遇到一个问题,即第一列太长。我要做的就是创建此方法。

private void ResizeListViewColumns(ListView lv)
{
    foreach(ColumnHeader column in lv.Columns)
    {
        column.Width = -2;
    }
}

这种方法的优点在于,您几乎可以将其放在任何地方以调整所有列的大小。只要通过你的ListView


1
这会将宽度设置为ListView中最后一项的宽度
Qsiris 2012年

我使用您的代码,但是如果我每次只有一个水平滚动条时,列表视图中只有一列。如果至少有两列,则代码运行良好。您知道这种行为是从哪里来的吗?
原型

2

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

您可以这样称呼它:

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

1

例如,如果您想动态设置列的自动调整宽度,请扩大Fredrik的答案:将第一列的自动调整宽度设置为70:

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

1

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

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是适合标题所需的宽度。等等。


1

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

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

0

您可以使用类似的方法,在参数中传递所需的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();
    }

0

还值得注意的是,如果不先更改属性,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);
}

-1

我相信作者正在通过IDE寻找一种等效的方法,该方法将生成背后的代码并确保所有参数均已到位,等等。

在Windows窗体设计器上创建事件处理程序

我本人来自VB背景,这是我一直在寻找的内容,以下是针对不良点击的简短版本:

  1. 单击您要为其创建事件处理程序的窗体或控件。
  2. 在“属性”窗口中,单击“事件”按钮
  3. 在可用事件列表中,单击要为其创建事件处理程序的事件。
  4. 在事件名称右侧的框中,键入处理程序的名称,然后按Enter。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.