ListView按列值分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ListView按列值分组相关的知识,希望对你有一定的参考价值。

像这样的ListView

Name    |    IP        |  Port
--------------------------------
Alice   | 192.168.0.1  |  1000
Bob     | 192.168.0.1  |  1000
Carol   | 192.168.0.1  |  1000
Dave    | 192.168.0.2  |  2000
Eve     | 192.168.0.2  |  2000

我想通过IP分组,例如{Alice,Bob,Carol}和{Dave,Eve}

如果为System.Collections.Generic.List,则使用FindAll

但是它是ListViewItemCollection,如何分组?

我想到的方法是使用ListViewItemCollection通过f​​or循环创建一个新列表。

还有其他方法吗?

答案

要在ListViewItem控件中将ListView对象分组:

  1. 将给定SubItemsColumnHeader分组。
  2. 为每个组密钥创建一个新的ListViewGroup
  3. 将其分配给分组的Group对象的ListViewItem属性。

创建grouping方法以应用该方法:

private void GroupListViewItems(int columnIndex)
{
    if (!listView1.Columns.Cast<ColumnHeader>()
        .Select(c => c.Index).Contains(columnIndex))
        return;

    listView1.BeginUpdate();
    listView1.Groups.Clear();

    var groups = listView1.Items.Cast<ListViewItem>()
        .GroupBy(x => x.SubItems[columnIndex].Text);

    foreach(var group in groups.OrderBy(x => x.Key))
    {
        var g = new ListViewGroup(group.Key);

        listView1.Groups.Add(g);
        group.ToList().ForEach(x => x.Group = g);
    }

    listView1.Columns.Cast<ColumnHeader>().ToList().ForEach(x => x.Width = -2);
    listView1.EndUpdate();
}

...可能是重载,以按其名称传递列:

private void GroupListViewItems(string columnName)
{
    var columnHeader = listView1.Columns.Cast<ColumnHeader>()
        .FirstOrDefault(x => x.Text.ToLower().Equals(columnName.ToLower()));

    if (columnHeader != null)
        GroupListViewItems(columnHeader.Index);
}

...调用方法并传递ColumnHeader的名称/索引。要ungroup项目,只需清除ListView.Groups属性。

SOQ61998298

以上是关于ListView按列值分组的主要内容,如果未能解决你的问题,请参考以下文章

按列值分组的列值更新mysql排名

如何在 Pandas 数据框中按列值分组

如何按列值的计数进行分组并对其进行排序?

按列值的前导字符对数据行进行分组

如何按列值分组应该只出现在第一行

按列值查询某些行的联合和分组