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
通过for循环创建一个新列表。
还有其他方法吗?
答案
要在ListViewItem控件中将ListView对象分组:
- 将给定SubItems的ColumnHeader分组。
- 为每个组密钥创建一个新的ListViewGroup,
- 将其分配给分组的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属性。
以上是关于ListView按列值分组的主要内容,如果未能解决你的问题,请参考以下文章