2013-02-28 151 views
0

我想要使用这种方法是从一个按钮单击,将从列表框中检索选择项目,然后从列表中删除此项目。每当我运行代码时,我得到这个错误: “这个枚举器所绑定的列表已被修改,枚举器只能在列表没有改变时使用。”使用列表从列表中删除使用列表框选择的项目

我完全难住了。

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

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

      DisplayAllBootSales(); 
     } 
    } 

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

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

+2

枚举时不能修改集合。 – MarcinJuraszek 2013-02-28 14:43:03

+0

DisplayAllBootSales是做什么的? – 2013-02-28 14:43:55

+0

@ bash.d显示所有启动销售? – DGibbs 2013-02-28 14:51:05

回答

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; 
    } 
} 

,它会很好地工作

+0

感谢您的帮助尝试过,但得到错误“无法转换类型”系统.Windows.Forms.ListViewItem'到'Bootsale_project.BootSale'“ – Liamc3000 2013-02-28 14:53:16

+0

现在就试试吧:)。对不起'布特说... – 2013-02-28 15:00:33

+0

忘了写'.OfType ()'。请现在检查它... – 2013-02-28 15:06:10

2

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

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; 
} 
0

看你的代码,我可能会认为,lstBootSales有一个BootSale的列表。但是您试图删除与BootSale不同的内容。还可以使用for代替的foreach:要做到这一点

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

      DisplayAllBootSales(); 
     } 
1

最好的办法是循环列表顶部 - 向下(不降反升 - 顶部)

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

这样将防止任何索引错误。

Goodluck