清除列表框C中的多项目#

时间:2014-06-10 05:13:49

标签: c# listbox

我尝试了什么:

尝试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?

仍然没有效果。我做错了什么?

2 个答案:

答案 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所做的任何更改都会改变SelectedItemsSelectedIndices之类的内容。一旦您创建了一个独立的数组并将所选项放入其中,您对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()导致的问题。