我知道如何从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
?
答案 0 :(得分:10)
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()
。
答案 1 :(得分:2)
这是因为您修改了要迭代的列表。使用for语句来防止这种情况发生:
for(var i=0; i<List_Frente.CheckedItems.Count; i++)
{
((IList)List_Frente.CheckedItems).Remove(List_Frente.CheckedItems[0]);
}
正如this MSDN-Article中所述,CheckedListBox.CheckedItemCollection
明确地实现了IList.Remove
- 方法,这意味着您必须将实例强制转换为IList
才能使其正常工作。
答案 2 :(得分:2)
while (checkedListBox.CheckedItems.Count > 0) {
checkedListBox.Items.RemoveAt(checkedListBox.CheckedIndices[0]);
}
答案 3 :(得分:0)
这很有效。
object[] items = new object[checkedListBox.Items.Count];
checkedListBox.Items.CopyTo(items, 0);
checkedListBox.Items.Clear();
checkedListBox.Items.AddRange(items);
我的目标是回归一个更美丽,更少hacky的解决方案。
答案 4 :(得分:0)
可能是这篇文章的插件。
清除所有项目。
checkedListBox1.Items.Clear();