.net 在列表框中迭代SelectedItems只返回第一项

.net 在列表框中迭代SelectedItems只返回第一项,.net,winforms,listbox,iteration,selecteditem,.net,Winforms,Listbox,Iteration,Selecteditem,我有一个行为异常的数据绑定列表框。ListBox的SelectionMode属性设置为MultiExtended,单击按钮后,我需要将项目复制到另一个控件,在本例中是树视图。然而,出于某种原因,我尝试过的每个迭代器只循环一次。我尝试了SelectedItems和selectedices。代码摘录: var movedItems = new List<ListBoxUnderlyingObject>(); foreach (var selectedItem in listBox.Sel

我有一个行为异常的数据绑定列表框。ListBox的
SelectionMode
属性设置为
MultiExtended
,单击按钮后,我需要将项目复制到另一个控件,在本例中是树视图。然而,出于某种原因,我尝试过的每个迭代器只循环一次。我尝试了
SelectedItems
selectedices
。代码摘录:

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
如果我在循环之前或循环期间抛出一个
Debug.WriteLine(listBox.SelectedItems.Count)
,它总是反映正确的计数。我知道这可能是件愚蠢的事,但我被难住了。救命啊

跟进


我已经创建了一个单独的winforms项目,它几乎完全模拟了行为,SelectedItems可以工作。我完全困惑不解。现在,我将尝试在原始项目中添加一个新表单,看看是否可以在那里重新创建该行为。

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

请参见示例。他们建议您迭代每个列表项,并使用来确定给定的索引是否已被选中,而不是使用选定的项/项/索引/索引。

好吧,事实证明我确实保留了一些关键信息。listbox启用了拖放行为,其中一部分是MouseDown事件的处理程序。处理程序中包含以下代码:

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

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

嗯,事实证明我确实保留了一些关键信息。listbox启用了拖放行为,其中一部分是MouseDown事件的处理程序。处理程序中包含以下代码:

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

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

我也遇到了同样的问题,这让我快要发疯了。我没有解释,但我有一个解决方法:设置ListBox的DisplayMember属性。它“应该”与ToString()方法一起工作,但由于某些原因它不工作,因此我实现了一个返回ToString值的属性,并将DisplayMember映射到该属性。祝你好运。

我也遇到过同样的问题,这让我快要发疯了。我没有解释,但我有一个解决方法:设置ListBox的DisplayMember属性。它“应该”与ToString()方法一起工作,但由于某些原因它不工作,因此我实现了一个返回ToString值的属性,并将DisplayMember映射到该属性。祝你好运。

这是完整的代码吗?您是使用
DataSource
进行绑定,还是只向列表框添加项?是否在循环中删除了项目?铸造一个项目并将其添加到列表中不应该是任何问题的唯一原因。添加了treeview代码。它使用数据源进行绑定。否,循环完成后才会删除项。在调试器下-如果计数为5,是否允许您检查并查看列表框。SelectedItems[0-4]?@John Arlen,否。listBox.SelectedItems[1]引发索引超出范围异常。listBox.SelectedItems[0]工作正常。这是完整的代码吗?您是使用
DataSource
进行绑定,还是只向列表框添加项?是否在循环中删除了项目?铸造一个项目并将其添加到列表中不应该是任何问题的唯一原因。添加了treeview代码。它使用数据源进行绑定。否,循环完成后才会删除项。在调试器下-如果计数为5,是否允许您检查并查看列表框。SelectedItems[0-4]?@John Arlen,否。listBox.SelectedItems[1]引发索引超出范围异常。listBox.SelectedItems[0]工作正常。该示例与此情况无关。在这种情况下,ListBox是通过DataSource属性提供的,因此不可能遍历items集合并使用GetSelected选择一个项。该示例与这种情况无关。在本例中,ListBox是通过DataSource属性提供的,因此不可能遍历items集合并使用GetSelected选择一个项。