Вы должны быть осторожны при переборе ListBox, потому что вы можете изменить базовую коллекцию. Используя foreach таким, какой вы есть, вы используете базовый перечислитель. Я рекомендую вам изменить ваш итератор следующим образом (пример C #):
foreach (ListItem li in listbox.Items.ToArray())
{
if (li.Selected)
{
Controltest2.Remove(li.Value);
}
}
Делая это, вы изменяете коллекцию Array, а не коллекцию списка. Это предполагает LINQ
для объекта, и вам может потребоваться вызвать Cast<t>
, чтобы заставить его работать в некоторых случаях.
Причина этого ниже:
Оператор foreach повторяет группу
вложенных утверждений для каждого
элемент в массиве или объекте
коллекция. Утверждение foreach
используется для перебора коллекции
чтобы получить нужную информацию, , но
не должны использоваться для изменения
содержимое коллекции, чтобы избежать
непредсказуемые побочные эффекты
Источник: MSDN
Чтобы получить нужный текст после итерации, используйте .Value
вместо .Text
. Конечно, есть и другие способы итерации, такие как обратный цикл с индексированным циклом for, но это уже другая тема:)