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

+0

DisplayAllBootSales의 기능은 무엇입니까? –

+0

@ bash.d 모든 부팅 판매를 표시 하시겠습니까? – DGibbs

답변

2

이 작업을 수행

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

도움을 주셔서 감사합니다.하지만이 오류는 "형식을 변환 할 수 없습니다."시스템 .Windows.Forms.ListViewItem 'to'Bootsale_project.BootSale ' " – Liamc3000

+0

지금 시도하십시오 :). 죄송합니다. 시합은 ... –

+0

'.OfType ()'을 쓰는 것을 잊었습니다. 그것을 지금 확인하십시오 ... –

2

오류 메시지가 표시됩니다. 반복되는 목록에서 항목을 제거 할 수 없습니다. 루프 foreach 외부의 항목을 제거해야합니다. 한 가지 간단한 해결 방법은 일반 for 루프를 대신 사용하는 것입니다. ,

[Serializable] 
public class BootSaleList : IDisplay 
{ 
    private List<BootSale> bootsales; 

    public List<BootSale> ReturnList() 
    { 
     return bootsales; 
    } 
} 

하고 완벽하게

1

당신은 foreach 문 내에서 컬렉션을 수정할 수 없습니다 작동합니다, 당신은 그러나 임시 목록을 사용할 수 있습니다

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

} 

여기서

0

코드를 보면 lstBootSalesBootSale의 목록이 있다고 가정 할 수 있습니다. 하지만 BootSale과 다른 것을 삭제하려고합니다. 또한 foreach는 대신 for를 사용 :이 작업을 수행하는

 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

관련 문제