ListView按列值分组

时间:2020-05-25 08:08:44

标签: c# winforms listview grouping

像这样的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通过for循环创建一个新的List。

还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

创建一个分组方法以应用该方法:

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的名称/索引。要取消分组,只需清除ListView.Groups属性即可。

SOQ61998298

相关问题