使用listbox选择项目使用foreach从列表中删除

时间:2013-02-28 14:41:16

标签: c#

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

我完全难过了。

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

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

            DisplayAllBootSales();
        }
    }

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

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

5 个答案:

答案 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();
        }