【问题标题】:Specified items will not be deleted when using ListView.Item.RemoveAt()使用 ListView.Item.RemoveAt() 时不会删除指定的项目
【发布时间】:2011-05-02 05:04:46
【问题描述】:

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

例如:见下图

代码:

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

【问题讨论】:

    标签: c# winforms listview listviewitem


    【解决方案1】:

    请参阅备注部分中的MSDN

    当您从 集合,索引更改为 集合中的后续项目。 有关已删除项目的所有信息 被删除。您可以使用此方法 从 通过指定的索引收集 要从中删除的项目 收藏。将项目指定为 删除而不是索引 项,请使用 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,@TSS,如果你把for循环改成从末尾开始,转到0,就可以去掉i--;
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      执行以下操作:

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

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多