Итерация SelectedItems в ListBox возвращает только первый элемент - PullRequest
2 голосов
/ 08 июня 2011

У меня есть 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 работает. Я полностью сбит с толку. Теперь я попытаюсь добавить новую форму в исходный проект и посмотреть, смогу ли я воссоздать там поведение.

Ответы [ 3 ]

0 голосов
/ 09 июня 2011

Ну, оказывается, я сделал скрытную важную информацию. В списке включено поведение перетаскивания, и часть этого является обработчиком для события MouseDown. В обработчике есть такой код:

private void listBox_MouseDown(object sender, MouseEventArgs e)
{
    if (listBox.Items.Count = 0) return;
    listBox.DoDragDrop(listBox.SelectedItem, DragDropEffects.Move);
}

Если я закомментирую этот обработчик, SelectedItems будет работать правильно. Теперь я должен выяснить, как правильно выполнять перетаскивание, но это другой вопрос.

0 голосов
/ 09 января 2013

У меня возникла та же проблема, и я был на грани сумасшествия.У меня нет объяснения, но у меня есть обходной путь: установите свойство DisplayMember ListBox.Он «должен» работать с методом ToString (), но по какой-то причине он не работает, поэтому я реализовал свойство, которое возвращает значение ToString, и сопоставил DisplayMember с этим свойством.Я желаю тебе удачи.

0 голосов
/ 09 июня 2011

См. Пример , указанный в MSDN .Вместо использования выбранного элемента / items / index / indexes они рекомендуют выполнять итерацию по каждому элементу списка и использовать метод GetSelected , чтобы определить, был ли выбран данный индекс.

...