With ListView
and ListBox
, you can have multiple selections when you set the property to do so. There are different ways to delete all selected items from a ListView
and a ListBox
, right or wrong. I have some lessons learned on the topic.
1. Use For Each
loop in ListView
. (It works)
For Each i As ListViewItem In ListView1.SelectedItems
ListView1.Items.Remove(i)
Next
2. Use For Each loop in ListBox
. (It doesn’t work)
- The
For-Each
loop does not work correctly with ListBox
as it does with ListView
. It causes a System.InvalidOperationException
: List that this enumerator is bound to has been modified. An enumerator can only be used if the list does not change.
3. A fix to the problem is to copy the selected items to a list.
Dim lst As New List(Of Object)
For Each a As Object In ListBox1.SelectedItems
lst.Add(a)
Next
For Each a As Object In lst
ListBox1.Items.Remove(a)
Next
4. Use Index, the right way and the wrong way.
The following snippet works but it must use an inverse loop.
For i As Integer = ListBox1.SelectedIndices.Count - 1 To 0 Step -1
ListBox1.Items.RemoveAt(ListBox1.SelectedIndices.Item(i))
Next
The other way (using a normal loop) will not work.
But amazingly, the following modification works.
For i As Integer = 0 To ListBox1.SelectedIndices.Count - 1
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
Next
5. Use Do While
loop. (This would be the best one based on its clear logic)
Do While (ListBox1.SelectedItems.Count > 0)
ListBox1.Items.Remove(ListBox1.SelectedItem)
Loop
In fact, the ListBox1.SelectedItem
(or SelectedIndex
) is always the first one of the ListBox1.SelectedItems
(or SelectedIndices
).