【问题标题】:Inserting an item into a C# Winforms listview将项目插入 C# Winforms 列表视图
【发布时间】:2011-12-16 08:10:28
【问题描述】:

下面这行让我很头疼:

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

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

我在这里遗漏了什么?

顺便说一句:列表视图上的排序被禁用!

【问题讨论】:

标签: c# winforms listview


【解决方案1】:

你可以试试:

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

这是结果:

【讨论】:

  • 对不起,我忘记了 this.listView1.Items.Insert(0, item);我添加了一个示例。
  • 我尝试了您的示例代码,但它给我的结果与您的屏幕截图不同。这里 Test2 总是在 Test1 之后插入。呼!?
  • 我在 Visual Studio 2010 中运行这个示例。也许 MS 修复了一个错误?
  • 我也是,VS2010,.NET 4.0。您是否对列表视图的属性进行了一些更改?
【解决方案2】:

我也有这个问题。我没有使用任何组或排序。尽管如此,如果我尝试在任何索引处插入,它总是显示在最后。我必须创建一个“排序器”,强制列表视图始终使用与 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 表达式而不是辅助类。但我不知道怎么做。

【讨论】:

  • 这对我有帮助,谢谢。但是,在特定索引处将新图像缩略图插入到 LargeImageList 中是另一回事!可能必须创建新的 ImageList 并更新 listview.LargeImageList。
【解决方案3】:

某种魔法,

如果您将项目添加到列表视图, 并将 G 组分配给该项目,该项目将显示不合适。

现在,如果你得到持有该项目 (G) 的组,将其名称更改为某个临时值,然后改回原来的名称,一切都会显示 OK。

所以不是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多