C#Listview通过列和标题自动调整列大小

本文关键字:调整 标题 C#Listview | 更新日期: 2023-09-27 18:22:24

我需要一个listview来根据标题和内容的宽度自动调整其列的大小,而每隔一个答案只执行其中一个。

示例:

        listView1.GridLines = true;
        // Create three items and three sets of subitems for each item.
        ListViewItem item1 = new ListViewItem("item1asdfghjkl", 0);
        item1.SubItems.Add("1");
        item1.SubItems.Add("2");
        item1.SubItems.Add("3");
        ListViewItem item2 = new ListViewItem("item2", 1);
        item2.SubItems.Add("4");
        item2.SubItems.Add("5");
        item2.SubItems.Add("6");
        ListViewItem item3 = new ListViewItem("item3", 0);
        item3.SubItems.Add("7");
        item3.SubItems.Add("8");
        item3.SubItems.Add("9");
        // Create columns for the items and subitems. 
        // Width of -2 indicates auto-size.
        listView1.Columns.Add("Item Column", -2, HorizontalAlignment.Left);
        listView1.Columns.Add("Column 2", -2, HorizontalAlignment.Left);
        listView1.Columns.Add("Column 3", -2, HorizontalAlignment.Left);
        listView1.Columns.Add("Column 4", -2, HorizontalAlignment.Left);
        //these two lines
        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        //Add the items to the ListView.
        listView1.Items.AddRange(new ListViewItem[] { item1, item2, item3 });

这里需要注意的是,无论是哪种(或两者)调整大小的样式,都会截断某些内容,无论是页眉还是内容。

似乎甚至没有一种可靠的方法来获得内容的显示大小来手动调整列和标题的大小。

C#Listview通过列和标题自动调整列大小

Anton Kedrov在这里回答-基于列内容和标题的ListView AutoResizeColumns是最好的,但在我的情况下,我有一个超过50列的列表视图,我经常更新它的数据。AutoResizeColumns的工作速度要快得多,所以我也在写这个解决方案

设置为-2 的第一种方法

public void AutoUpdateColumnWidth(ListView lv)
{
    for (int i = 0; i <= lv.Columns.Count - 1; i++) {
        lv.Columns(i).Width = -2;
    }
}

我使用的第二种方法(多次通话时闪烁较少)

public void AutoUpdateColumnWidth(ListView lv)
{
    ListViewItem nLstItem = new ListViewItem(lv.Columns(0).Text);
    for (int i = 1; i <= lv.Columns.Count - 1; i++) {
        nLstItem.SubItems.Add(lv.Columns(i).Text);
    }
    v.Items.Add(nLstItem);
    lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
    lv.Items.RemoveAt(nLstItem.Index);
}

这很简单(尽管我花了一段时间才弄清楚)。。。

我们知道宽度必须至少与列标题一样大,这样我们才能看到所有的标题文本。除此之外,宽度可以扩展得更大以容纳内容。因此,我们执行以下操作:

  1. 将列自动调整为标题
  2. 遍历列,并将每列的最小宽度属性设置为当前列宽(这可以确保列永远不会太小而看不到标题)
  3. 从现在起,按内容自动调整列的大小

编辑:很抱歉,我忘了我没有使用标准列表视图,而是使用第三方产品BetterListView(有免费版本)。标准列表视图列似乎不支持最小宽度。我强烈推荐BetterListView作为一个很好的替代方案(更好的功能集和性能)。