我尝试了什么:
尝试1:
for(int x = listBox1.SelectedIndices.Count - 1; x>= 0; x--)
{
int idx = listBox1.SelectedIndices[x];
listBox2.Items.Add(listBox1.Items[idx]);
listBox1.Items.RemoveAt(idx);
}
尝试2:
ArrayList tmpArr = new ArrayList();
foreach (object obj in listBox1.SelectedItems)
{
listBox2.Items.Add(obj);
tmpArr.Add(obj);
}
foreach (object obj in tmpArr.ToArray())
{
listBox1.Items.Remove(obj);
}
还尝试了以下帖子中的所有内容:How to remove multiple selected items in ListBox?
仍然没有效果。我做错了什么?
答案 0 :(得分:1)
var selectedItems = new object[listBox1.SelectedItems.Count];
listBox1.SelectedItems.CopyTo(selectedItems, 0);
foreach (var item in selectedItems)
{
listBox1.Items.Remove(item);
}
或使用一些LINQ来简化代码:
foreach (var item in listBox1.SelectedItems.Cast<object>().ToArray())
{
listBox1.Items.Remove(item);
}
这里的原因是您获得所有选定的项目并将它们放入另一个列表中。最初的问题是,您对ListBox
所做的任何更改都会改变SelectedItems
和SelectedIndices
之类的内容。一旦您创建了一个独立的数组并将所选项放入其中,您对ListBox
所做的任何操作都不会影响该数组,因此您可以正常枚举它。
答案 1 :(得分:0)
listbox1.BeginUpdate();
for (int x = listBox1.SelectedIndices.Count - 1; x >= 0; x--)
{
int idx = listBox1.SelectedIndices[x];
listBox1.Items.RemoveAt(idx);
}
listbox1.EndUpdate();
如果您无法保证列表中的每个对象都是唯一的,那么这是正确的方法,以确保删除正确的选定项目。
如果列表框中有相同对象的倍数,则必须通过“index”引用它们,否则如果按“item”删除它,它将删除它找到的任何匹配项的第一个实例。
我正在编写一个总线路径规划器,它要求在列表中复制路点标记。这些被存储为字符串,所以例如我可能有“w1”,“w2”,“w3”......“w2”(想想一辆公共汽车沿着一条大街走,绕着几个街区然后返回在另一边了解为什么我有这个...我只需要在道路中心的路标标记,而不是在每条车道上)
如果我选择了最后一个“w2”标记作为范围的一部分并使用selectedItem()方法来删除它们,它将删除第一个“w2”,而不是第二个。通过使用SelectedIndex()方法,它会根据位置而不是值进行删除,因此可以安全地保留重复值。
我只是想添加一下,因为我刚刚处理过同样的问题,所以亲眼看到了由SelectedItem()导致的问题。