У меня есть ListBox с привязкой к данным, который ведет себя странно. Свойство ListBox SelectionMode
установлено на MultiExtended
, и при нажатии кнопки мне нужно скопировать элементы в другой элемент управления, в данном случае TreeView. Однако по какой-то причине каждый итератор, который я пробовал, зацикливается только один раз. Я пытался и SelectedItems
и SelectedIndices
. Выдержка из кода:
var movedItems = new List<ListBoxUnderlyingObject>();
foreach (var selectedItem in listBox.SelectedItems)
{
var castItem = selectedItem as ListBoxUnderlyingObject;
var newNode = new TreeNode(castItem.SomeString);
newNode.Name = castItem.AnotherString;
newNode.Tag = castItem;
newNode.ForeColor = Color.RoyalBlue;
//parentNode was set earlier
parentNode.Nodes.Add(newNode);
movedItems.Add(selectedItem);
}
//use movedItems to remove items from listBox's underlying databound object and rebind
Независимо от того, сколько элементов выбрано, цикл выполняется только один раз. То же самое с SelectedIndices
. Если я попытаюсь сделать это с помощью пронумерованного итератора, произойдет сбой с ошибкой «индекс за пределами массива».
for(var i = 0;i < listBox.SelectedItems.Count;i++)
{
var castItem = listBox.SelectedItems[i] as ListBoxUnderlyingObject;
//etc., the previous line bombs on the second iteration
}
Если я кидаю Debug.WriteLine(listBox.SelectedItems.Count)
до или во время цикла, он всегда отражает правильный счет. Я знаю, что это, наверное, что-то глупое, но я в тупике. Помогите!
Follow Up
Я создал отдельный проект winforms, который почти точно имитирует поведение, и SelectedItems работает. Я полностью сбит с толку. Теперь я попытаюсь добавить новую форму в исходный проект и посмотреть, смогу ли я воссоздать там поведение.