使用ListView.Item.RemoveAt()时不会删除指定的项目

时间:2010-10-29 03:05:00

标签: c# winforms listview listviewitem

我尝试使用RemoveAt()方法从列表视图中删除特定项目。但当我第一次删除它时,一些物品会留下来。

例如:见下图

alt text

代码:

private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < listView1.Items.Count; i++) 
        {
            if (listView1.Items[i].SubItems[0].Text == "A1") 
            {
                listView1.Items.RemoveAt(i);
            }
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        for(int i = 0; i<3; i++)
        {
            ListViewItem lvi = new ListViewItem("A1");
            lvi.SubItems.AddRange(new string[] {"desc" + i.ToString(), i.ToString()});
            listView1.Items.Add(lvi);
        }

        for (int i = 0; i < 2; i++)
        {
            ListViewItem lvi = new ListViewItem("A2");
            lvi.SubItems.AddRange(new string[] { "desc" + i.ToString(), i.ToString() });
            listView1.Items.Add(lvi);
        }
    }

3 个答案:

答案 0 :(得分:5)

请参阅备注部分中的MSDN

  

从中移除项目时   集合,索引改变了   集合中的后续项目。   有关已删除项目的所有信息   被删除。您可以使用此方法   从中删除特定项目   通过指定索引来收集   要从中删除的项目   采集。要指定项目   删除而不是索引   item,使用Remove方法。去除   集合中的所有项目,使用   清晰的方法。

修改:请参阅Moot的回答。上面的链接/参考也适用于他/她的答案。

编辑2:

如果找到匹配项,只需将计数器放回原位。

    for (int i = 0; i < listView1.Items.Count; i++)
    {
        if (listView1.Items[i].SubItems[0].Text == "A1")
        {
            listView1.Items.RemoveAt(i);
            i--; // Back counter up one
        }
    }

答案 1 :(得分:4)

删除第一个A1时,列表缩小,1和2处的元素成为0和1处的元素。因此,当循环递增时,它会删除1处的A1(第三个)并跳过一个向下移动到0。

答案 2 :(得分:2)

执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
    var itemsToRemove = new List<ListViewItem>();

    foreach (ListViewItem item in listView1.Items)
    {
        if (item.SubItems[0].Text == "A1")
            itemsToRemove.Add(item);
    }

    foreach (var item in itemsToRemove)
        listView1.Items.Remove(item);
}
祝你好运!