Удаление выбранных элементов из списка - программирование

Удаление выбранных элементов из списка

Я хочу это сделать, но при каждом удалении изменяется список, поэтому он выдает исключение во время выполнения, даже если я пытался сделать новый объект.

Я пробовал вот так:

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
   selectedItems = lstClientes.SelectedItems;
if (lstClientes.SelectedIndex != -1)
{ 
    foreach (string s in selectedItems)
        lstClientes.Items.Remove(s);
}
else
    MessageBox.Show("Debe seleccionar un email");
4b9b3361

Ответ 1

Вы не можете изменять коллекцию при повторении (используя foreach) через нее. Вместо этого используйте обратный цикл for:

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
selectedItems = lstClientes.SelectedItems;

if (lstClientes.SelectedIndex != -1)
{ 
    for (int i = selectedItems.Count - 1; i >= 0; i--)
        lstClientes.Items.Remove(selectedItems[i]);
}
else
    MessageBox.Show("Debe seleccionar un email");

Использование обратной петли гарантирует, что вы не пропустите ее после удаления.

Ответ 2

selectedItems = lstClientes.SelectedItems;

Эта строка не создает новую коллекцию, а устанавливает ссылку на нее в списке. Таким образом, вы выполняете итерацию через коллекцию и пытаетесь сразу удалить элементы из нее. Это невозможно

Вы можете использовать это, например:

foreach (string s in lstClientes.SelectedItems.OfType<string>().ToList())
   lstClientes.Items.Remove(s);

Ответ 3

Просто так:

while (lst.SelectedItems.Count > 0)
{
   lst.Items.Remove(lst.SelectedItems[0]);
}

Ответ 4

lst.Items.Remove(lst.Items[lst.SelectedIndex]);

Вы можете использовать это, если вы не хотите цитировать

Примечание. Это работает только с удалением 1 объекта (при выборе нескольких элементов он удаляет только первый выбранный элемент)

Ответ 5

Я нашел лучшее решение.

        if (listBoxIn.SelectedItems.Count != 0)
        {
            while (listBoxIn.SelectedIndex!=-1)
            {
                listBoxIn.Items.RemoveAt(listBoxIn.SelectedIndex);                  
            }
        }

Ответ 6

Сегодня я столкнулся с этой же проблемой и хотел что-то более чистым, и придумал решение Linq:

foreach (int index in myListBox.SelectedIndices.Cast<int>().Select(x => x).Reverse())
    myListBox.Items.RemoveAt(index);

В основном то же самое, что и решение Patrick для итерации назад и удаления выбранных элементов. Однако вместо повтора итерации назад мы отменяем список элементов для удаления и итерации вперед. Мы больше не итерации по исходному перечислению, поэтому нам разрешено удалять элементы внутри foreach.

Ответ 7

Это самый простой способ удалить выбранные элементы

 for(int v=0; v<listBox1.SelectedItems.Count; v++) {
            listBox1.Items.Remove(listBox1.SelectedItems[v]);
        }

Ответ 8

Создайте глобальную переменную:

public partial class Form1 : Form
    {

        Int32 index;
    }

Затем при выбранном изменении индекса сохраните этот индекс в указанном var:

 private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e)
        {

           layerindex = lsbx_layers.SelectedIndices[0];//selected index that has fired the event
         }

Наконец, удалите элемент:

 lsbx_layers.Items.RemoveAt(Layerindex);