在ListBox中迭代SelectedItem只返回第一个项目

时间:2011-06-08 17:38:04

标签: .net winforms listbox iteration selecteditem

我有一个奇怪的数据绑定ListBox。 ListBox的SelectionMode属性设置为MultiExtended,单击按钮时,我需要将项目复制到另一个控件,在本例中为TreeView。但是,出于某种原因,我尝试过的每个迭代器只循环一次。我尝试了SelectedItemsSelectedIndices。代码摘录:

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),它总是反映正确的计数。我知道这可能是愚蠢的事,但我很难过。救命啊!

跟进

我创建了一个单独的winforms项目,它几乎完全模仿了行为,并且SelectedItems可以工作。我完全不知所措。现在,我将尝试在原始项目中添加一个新表单,看看我是否可以在那里重新创建行为。

3 个答案:

答案 0 :(得分:0)

参见示例listed on MSDN。他们建议您迭代每个列表项并使用GetSelected Method来确定是否已选择给定的索引,而不是使用所选的项/项/索引/索引。

答案 1 :(得分:0)

嗯,事实证明我做了隐瞒了一些重要信息。列表框启用了拖放行为,其中一部分是MouseDown事件的处理程序。处理程序中包含以下代码:

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

如果我将此处理程序注释掉,SelectedItems行为正确。现在我必须弄清楚如何正确地执行拖放操作,但这是一个不同的问题。

答案 2 :(得分:0)

我遇到了同样的问题,它让我濒临疯狂。我没有解释,但我有一个解决方法:设置ListBox的DisplayMember属性。它“应该”使用ToString()方法,但由于某种原因它不起作用,所以我实现了一个返回ToString值并将DisplayMember映射到该属性的属性。祝你好运。