Как удалить несколько отмеченных элементов из CheckedListBox

Я знаю, как удалить один checkedItem из checkedlistbox. Но теперь я хочу удалить все отмеченные элементы за один раз.

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

foreach (var item in List_Frente.CheckedItems)
            {
                List_Frente.Items.Remove(item);
            }

Но, как вы, наверное, знаете, это выдает мне сообщение об ошибке: List that this enumerator is bound to has been modified. An enumerator can only be used if the list does not change. Как я могу удалить все checkeditems одним щелчком мыши?


person Ghaleon    schedule 29.01.2013    source источник
comment
Не используйте foreach. Используйте for.   -  person Mike G    schedule 29.01.2013
comment
Я не знаком с winforms, но вы можете сделать List_Frente.CheckedItems.ToList()? если сможешь то решит проблему   -  person Federico Berasategui    schedule 29.01.2013
comment
@HighCore нет, просто ToString() =(   -  person Ghaleon    schedule 29.01.2013
comment
@HighCore foreach использует итератор. Вы не можете вносить изменения в коллекцию, пока есть активный итератор. Вы не можете сделать это в его текущей форме с foreach.   -  person Mike G    schedule 29.01.2013
comment
@mikeTheLiar, но как мне получить значение checkeditems без foreach?   -  person Ghaleon    schedule 29.01.2013
comment
for (i = 0; i < (List_Frente.Items.Count ; i++) Посетите эту страницу: msdn.microsoft.com/en-us/library/ e954th47.aspx   -  person Mike G    schedule 29.01.2013
comment
возможный дубликат Как мне просмотреть элементы в списке, а затем удалить этот элемент?   -  person nawfal    schedule 05.06.2013


Ответы (5)


вы можете сделать что-то вроде этого:

foreach (var item in List_Frente.CheckedItems.OfType<string>().ToList())
{
    List_Frente.Items.Remove(item);
}

Если вы хотите написать все это в одну строку:

List_Frente.CheckedItems.OfType<string>().ToList().ForEach(List_Frente.Items.Remove);

Конечно, это работает, только если ваши предметы одного типа. Однако выглядит все еще грубо.

Объяснение редактирования: ToList() создает новый список, и, таким образом, исходный список CheckedItems можно изменить, так как перечислитель теперь перечисляет наш вновь созданный список, а не исходный. OfType<string>() здесь только потому, что нам нужно что-то для вызова ToList().

person Jobo    schedule 29.01.2013
comment
ОМГ РАБОТАЕТ!! Спасибо Джобо! - person Ghaleon; 29.01.2013
comment
Добро пожаловать, это помогло бы всем здесь, если бы вы тогда приняли ответ :) - person Jobo; 29.01.2013
comment
Я знаю, я просто делал некоторые тесты, и мне нужно подождать несколько минут, прежде чем пометить как ответ ;P ... Не могли бы вы объяснить мне, почему так сработало? А не так, как я? - person Ghaleon; 29.01.2013
comment
@Ghaleon, потому что методы LinQ OfType<T> и ToList() создают новый экземпляр List, а затем вы повторяете его. Вместо итерации исходной коллекции, которая вызовет исключение, если вы удалите элемент из нее во время итерации. - person Federico Berasategui; 29.01.2013
comment
@Jobo Молодец! Вы можете добавить вариант LINQ к своему ответу: List_Frente.CheckedItems.OfType<string>().ToList().ForEach(List_Frente.Items.Remove); - person Spontifixus; 29.01.2013

Это потому, что вы изменяете список, который вы повторяете. Используйте оператор for, чтобы этого не произошло:

for(var i=0; i<List_Frente.CheckedItems.Count; i++)
{
    ((IList)List_Frente.CheckedItems).Remove(List_Frente.CheckedItems[0]);
}

Как указано в этой статье MSDN CheckedListBox.CheckedItemCollection явно реализует IList.Remove-метод, а это означает, что вам придется привести экземпляры к IList, чтобы это сработало.

person Spontifixus    schedule 29.01.2013
comment
Привет ! Нет такого метода, как ChedkItems.REMOVE() . Я пытался, но его не существует ;\ - person Ghaleon; 29.01.2013
comment
Ах да, ToList() тоже нет ;s - person Ghaleon; 29.01.2013
comment
Хм. Я внимательно изучил статью MSDN, в котором четко указано, что существует Remove-Метод, за исключением того, что его необходимо реализовать явно. Я изменю свой ответ соответственно. - person Spontifixus; 29.01.2013
comment
@Ghaleon Я исправил код. Эти классы, представленные в самых ранних версиях .NET, иногда не обладают всеми удобствами, которые есть у новых;) - person Spontifixus; 29.01.2013
comment
@Spontifixus спасибо и тебе, чувак! Я сохраню ваш код в своих кодах.txt, хе-хе xD +1 - person Ghaleon; 29.01.2013

Может быть дополнением к этому посту.

Чтобы очистить все элементы.

checkedListBox1.Items.Clear();
person user2331760    schedule 08.09.2015

Это работает.

object[] items = new object[checkedListBox.Items.Count];
checkedListBox.Items.CopyTo(items, 0);
checkedListBox.Items.Clear();
checkedListBox.Items.AddRange(items);

Я стремлюсь вернуться с более красивым и менее хакерским решением.

person Simply G.    schedule 29.01.2013

person    schedule
comment
+1 Могу подтвердить, что это работает. Хотя я чувствую себя глупо из-за того, что сам этого не видел, может быть, поэтому за него не было голосов? В любом случае, спасибо. - person ThatOneGuy; 09.05.2018