2013-02-28 159 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