2013-04-13 3 views
1

동적으로 컨트롤을 추가하는 GroupBox가 있습니다. 내가 추가 한 컨트롤은 두 가지 유형 DevExpress.XtraEditors.TextEditWindows.Forms.Label 의있는 나는이 올바르게 TextEdit 컨트롤 아닌 Label 컨트롤을 제거하고WinForm에서 동적으로 추가 된 컨트롤 제거

foreach (Control control in salesBox.Controls) 
{ 
    control.Dispose(); 
    salesBox.Controls.Remove(control); 
} 

다음 사용하여 이러한 컨트롤을 제거하려합니다. 루프는 Label 컨트롤을 반복하지 않습니다.

답변

1

Foreach 내에서 컬렉션의 내용을 변경할 수 없습니다. 너는 내가 믿는 이와 같은 것을 할 필요가있다. salesbox.Controls의 길이가 변경 되었기 때문에

List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList(); 

foreach(Control c in toRemove) 
{ 
salesBox.Controls.Remove(c); 
c.Dispose(); 
} 
+1

이 작동 것() 메서드 – Nabegh

+0

맞아, ControlCollection은 IEnumerable 이 아닙니다. 해결할 답변을 수정했습니다. System.Linq 네임 스페이스가 필요합니다 –

0

Foreach는 반복 할 수 없습니다. 추가하거나 항목을 제거하면 당신은 더 나은 for 당신은

for(int i=0;i<salesBox.Controls.Count;i++) 
    {  if(salesBox.Controls[i] is DevExpress.XtraEditors.TextEdit) //your condition here 
      { 
      salesBox.Controls.Remove(salesBox.Controls[i]); 
      i--; 
      } 
    } 
+0

콜렉션의 항목 수보다 더 높은 값이 될 수 있으므로 뒤로 이동해야합니다. 따라서 예외가 발생합니다. –

+0

어때요? – aliassce

+0

편집 했으므로 피어 리뷰를해야합니다. –

3

당신이 반복되는 컬렉션을 수정하는 때문에이 작동하지 않습니다에 의해 그것을 할 수 있습니다 사용하십시오. Dispose() 메서드를 호출하면 부모의 Control 컬렉션에서도 컨트롤이 제거됩니다. 부작용은 짝수 번호의 컨트롤 만 처리한다는 것입니다. 이 두 루프 중 하나를 수행하면 작업이 완료됩니다.

while (salesBox.Controls.Count > 0) salesBox.Controls[0].Dispose(); 

for (int ix = salesBox.Controls.Count-1; ix >= 0; ix---) salesBox.Controls[ix].Dispose(); 

또는 패널에 유지하거나 패널을 처리하십시오.

3

Controls 컬렉션에서 모든 컨트롤을 제거하는 가장 쉬운 방법은 전화의 Clear 방법 :

salesBox.Controls.Clear(); 

열거를 무효화하고 예측할 수없는 결과를 얻을 또는 심지어에 따라 한 InvalidOperationException을 던질 수있는 컬렉션을 수정 컬렉션 형식 (MSDN의 IEnumerable.GetEnumerator Method의 "설명"절 참조). foreach은 열거자를 사용하기 때문에 반복되는 컬렉션을 변경하면 안됩니다. 거꾸로 반복 선택적으로 삭제해야하는 경우

은 제거 항목 후 잘못된 인덱스 값을 얻기 위해,하는 for 문을 사용하지 않을 : salesBox.Controls이 ToList이 있다면

for (int i = salesBox.Controls.Count - 1; i >= 0; i--) { 
    Control c = salesBox.Controls[i]; 
    if (c is TextEdit || c is Label) { 
     salesBox.Controls.RemoveAt(i); 
    } 
} 
+0

Clear() 및 for 루프를 사용하는 경우 +1. –

+0

역 루프 아이디어가 마음에 들었습니다! – aliassce

+0

이전 편집에서 추가했지만 수정 검사 경찰이 마음에 들지 않았습니다. ( –

관련 문제