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

时间:2014-09-17 16:54:52

标签: c# .net listview

我需要一个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 });

这里的注释是,无论哪种(或两者)调整样式,都会切断标题或内容。

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

2 个答案:

答案 0 :(得分:0)

Anton Kedrov在这里回答 - ListView AutoResizeColumns based on both Column content and header是最好的一个,但在我的情况下,我有一个包含超过50列的列表视图,我经常更新其数据,在这种情况下,我注意到listview的这个.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 :(得分:0)

这很简单(虽然我需要一段时间才弄明白)......

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

  1. 将列自动调整为标题。
  2. 遍历列并将每列的最小宽度属性设置为当前列宽(这可确保您的列永远不会太小而无法看到标题)。
  3. 从现在开始,按内容自动调整列数。
  4. 编辑:我很抱歉,我忘记了我没有使用标准列表视图,而是第三方产品BetterListView(免费版本可用)。标准列表视图列似乎不支持最小宽度。我确实推荐BetterListView作为一个很好的选择(更好的功能集和性能)。