像这样的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。
还有其他方法吗?
答案 0 :(得分:1)
要在ListViewItem控件中将ListView个对象分组:
创建一个分组方法以应用该方法:
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属性即可。