我有一个奇怪的数据绑定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)
,它总是反映正确的计数。我知道这可能是愚蠢的事,但我很难过。救命啊!
跟进
我创建了一个单独的winforms项目,它几乎完全模仿了行为,并且SelectedItems可以工作。我完全不知所措。现在,我将尝试在原始项目中添加一个新表单,看看我是否可以在那里重新创建行为。
答案 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映射到该属性的属性。祝你好运。