将项目插入C#Winforms列表视图

时间:2011-10-27 08:34:54

标签: c# winforms listview

以下一行给我带来了严重的麻烦:

listView1.Items.Insert(0, new ListViewItem("Test", listView1.Groups[0]));

我想要做的就是在列表视图中插入一个项目。列表视图处于详细模式,并启用了组。插入的项目应该进入索引0处的第一个组。 但是,该项目始终作为组中的最后一项添加。好像插入(...)的第一个参数没有效果......

我在这里缺少什么?

顺便说一句:列表视图已禁用排序!

3 个答案:

答案 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);
   }
 }

这是结果:    enter image description here

答案 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表达式而不是辅助类。但我无法弄清楚如何。