以下一行给我带来了严重的麻烦:
listView1.Items.Insert(0, new ListViewItem("Test", listView1.Groups[0]));
我想要做的就是在列表视图中插入一个项目。列表视图处于详细模式,并启用了组。插入的项目应该进入索引0处的第一个组。 但是,该项目始终作为组中的最后一项添加。好像插入(...)的第一个参数没有效果......
我在这里缺少什么?
顺便说一句:列表视图已禁用排序!
答案 0 :(得分:6)
您可以尝试:
ListViewItem item = new ListViewItem("Test");
this.listView1.Items.Insert(0, item);
this.listView1.Groups[0].Items.Insert(0, item);
可以找到详细的讨论here。
此示例将三个组添加到列表视图,并在组的第一个位置添加项目:
for (int groupIndex = 0; groupIndex < 3; ++groupIndex) {
this.listView1.Groups.Add("GroupKey" + groupIndex, "Test" + groupIndex);
for (int index = 0; index < 5; ++index) {
ListViewItem item = new ListViewItem("Test " + groupIndex + "/" + index,
this.listView1.Groups[groupIndex]);
this.listView1.Items.Insert(0, item);
this.listView1.Groups[groupIndex].Items.Insert(0, item);
}
}
for (int groupIndex = 2; groupIndex >= 0; --groupIndex) {
for (int index = 0; index < 5; ++index) {
ListViewItem item = new ListViewItem("Test2 " + groupIndex + "/" + index,
this.listView1.Groups[groupIndex]);
this.listView1.Items.Insert(0, item);
this.listView1.Groups[groupIndex].Items.Insert(0, item);
}
}
这是结果:
答案 1 :(得分:2)
某种巫术,
如果您将项目添加到列表视图, 并将组G分配给该项目,该项目将显示在原位。
现在,如果您让组持有项目(G),将其名称更改为某个临时值,然后更改回原始名称,一切都将显示确定。
所以而不是
listView1.Items.Insert(0, new ListViewItem("Test", listView1.Groups[0]));
DO
Dim LVI as new ListViewItem("Test")
listView1.Items.Insert(0, LVI)
LVI.Group = listView1.Groups[0]
Dim TempStr as string = LVI.Group.Header
LVI.Group.Header = "whatever"
LVI.Group.Header = TempStr
答案 2 :(得分:1)
我也有这个问题。我没有使用任何组或排序。不过,如果我尝试插入任何索引,它总是会显示最后。我必须创建一个“分类器”,强制listview始终使用与Items集合相同的顺序。
class CompareByIndex : IComparer
{
private readonly ListView _listView;
public CompareByIndex(ListView listView)
{
this._listView = listView;
}
public int Compare(object x, object y)
{
int i = this._listView.Items.IndexOf((ListViewItem)x);
int j = this._listView.Items.IndexOf((ListViewItem)y);
return i - j;
}
}
并使用它
this.listView1.ListViewItemSorter = new CompareByIndex(this.listView1);
我希望我可以使用lambda表达式而不是辅助类。但我无法弄清楚如何。