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

发布于 2024-09-29 20:40:40 字数 1041 浏览 5 评论 0原文

我尝试使用 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);
        }
    }

I have tried to remove specific items from a listview using the RemoveAt() method. But When I remove it the first time some items will stay.

For example: see the image below

alt text

Code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泛泛之交 2024-10-06 20:40:40

请参阅 MSDN 中的 < em>备注部分。

当您从
集合,索引更改为
集合中的后续项目。
有关已删除项目的所有信息
被删除。您可以使用此方法
从中删除特定项目
通过指定索引来收集
要从中删除的项目
收藏。要将项目指定为
删除而不是索引
项目,使用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
        }
    }

See MSDN in the Remarks section.

When you remove an item from the
collection, the indexes change for
subsequent items in the collection.
All information about the removed item
is deleted. You can use this method to
remove a specific item from the
collection by specifying the index of
the item to remove from the
collection. To specify the item to
remove instead of the index to the
item, use the Remove method. To remove
all items from the collection, use the
Clear method.

Edit: See Moot's answer. Link / reference above applies to his/her answer as well.

Edit 2:

Just back the counter up one if you find a match.

    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
        }
    }
唠甜嗑 2024-10-06 20:40:40

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

When you delete the first A1, the list shrinks, and the element at 1 and 2 become your element at 0 and 1. So, when your loop increments, it deletes the A1 at 1 (the third one) and skips the one which moved down to 0.

灼痛 2024-10-06 20:40:40

执行以下操作:

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

祝你好运!

Do the following:

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

Good luck!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文