Указанные элементы не будут удалены при использовании ListView.Item.RemoveAt () - PullRequest
5 голосов
/ 29 октября 2010

Я пытался удалить определенные элементы из списка, используя метод 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 ]

5 голосов
/ 29 октября 2010

См. 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
        }
    }
4 голосов
/ 29 октября 2010

Когда вы удаляете первый A1, список сжимается, и элемент в 1 и 2 становится вашим элементом в 0 и 1. Таким образом, когда ваш цикл увеличивается, он удаляет A1 в 1 (третий) и пропускает тот, который опустился до 0.

2 голосов
/ 29 октября 2010

Выполните следующие действия:

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

Удачи!

...