我正在尝试使用从按钮单击运行的此方法,该方法将从列表框中检索选择项目,然后从列表中删除此项目。每当我运行代码时,我都会收到此错误: “此枚举器绑定的列表已被修改。只有列表不更改时才能使用枚举器。”
我完全难过了。
public void DeleteSale()
{
foreach (BootSale b in lstBootSales.SelectedItems)
{
lstBootSales.Items.Remove(b.Id);
lstBootSales.Items.Remove(b.Date);
DisplayAllBootSales();
}
}
DisplayAllBootSales();
之后只需刷新列表框值
我有一个List“BootSale”,我存储了写入列表框的信息。我希望能够单击列表框中的项目,然后单击“删除”,它将从系统中完全删除
答案 0 :(得分:2)
错误消息说明了一切。您无法从正在迭代的列表中删除项目。您必须删除foreach
循环之外的项目。一个简单的解决方法是使用常规的for
循环。
答案 1 :(得分:2)
这样做:
class Foo {
BootSaleList bootsalelist;
public void DeleteSale()
{
foreach (BootSale b in lstBootSales.SelectedItems.OfType<BootSale>().ToArray())
{
//temp.Remove(b); -- no more of this guy
bootsalelist.ReturnList().Remove(b);
lstBootSales.Items.Remove(b);
// and no more of these guys:
//lstBootSales.Items.Remove(b.Id);
//lstBootSales.Items.Remove(b.Date);
//DisplayAllBootSales();
}
}
}
其中:
[Serializable]
public class BootSaleList : IDisplay
{
private List<BootSale> bootsales;
public List<BootSale> ReturnList()
{
return bootsales;
}
}
它会完美地运作
答案 2 :(得分:1)
您无法在foreach中修改集合,但是您可以使用临时列表,这些内容类似于:
public void DeleteSale()
{
List<T> temp = lstBootSales;
foreach (BootSale b in lstBootSales.SelectedItems)
{
temp.Items.Remove(b.Id);
temp.Items.Remove(b.Date);
DisplayAllBootSales();
}
lstBootSales = temp;
}
答案 3 :(得分:1)
最好的方法是循环列表Top - Down(而不是down-top)
for(int i = YourListItems.Count(); i > 0; i--)
{
// Remove from list
}
这种方式可以防止任何索引错误。
古德勒克
答案 4 :(得分:0)
查看您的代码我可能会认为,lstBootSales
包含BootSale
的列表。但是你试图删除与BootSale不同的东西。也可以使用for
代替foreach:
for (int i = 0; i < lstBootSales.SelectedItems.Count; i++)
{
lstBootSales.Items.Remove(lstBootSales.SelectedItems[i]);
DisplayAllBootSales();
}