0

我正在尝试使用通过单击按钮运行的此方法,该方法将从列表框中检索所选项目,然后从列表中删除该项目。每当我运行代码时,我都会收到此错误:“此枚举器绑定到的列表已被修改。仅当列表未更改时才能使用枚举器。”。

我完全被难住了。

    public void DeleteSale()
    {
        foreach (BootSale b in lstBootSales.SelectedItems)
        {

            lstBootSales.Items.Remove(b.Id);
            lstBootSales.Items.Remove(b.Date);

            DisplayAllBootSales();
        }
    }

DisplayAllBootSales();之后只需刷新列表框值

我有一个列表“BootSale”,我在其中存储写入列表框的信息。我希望能够单击列表框中的项目,然后单击删除,它将从系统中完全删除

4

5 回答 5

2

错误消息说明了一切。您不能从正在迭代的列表中删除项目。foreach您必须删除循环之外的项目。一个简单的解决方法是改用常规for循环。

于 2013-02-28T14:43:05.017 回答
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;
    }
}

它会完美地工作

于 2013-02-28T14:43:09.427 回答
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;
}
于 2013-02-28T14:44:14.120 回答
1

最好的方法是循环列表 Top - Down (而不是 down - top)

for(int i = YourListItems.Count(); i > 0; i--)
{
    // Remove from list
}

这种方式将防止任何索引错误。

祝你好运

于 2013-02-28T14:54:03.390 回答
0

查看您的代码,我可能会假设,其中lstBootSales包含BootSale. 但是您正试图删除与 BootSale 不同的东西。也使用for代替 foreach:

        for (int i = 0; i < lstBootSales.SelectedItems.Count; i++)
        {
            lstBootSales.Items.Remove(lstBootSales.SelectedItems[i]);

            DisplayAllBootSales();
        }
于 2013-02-28T14:47:31.950 回答