Foreach 루프를 사용하여 패널의 모든 컨트롤을 삭제하려면 어떻게해야합니까?
문제
여기에 내가 가진 코드는 다음과 같습니다.
private void ClearSearchResults()
{
foreach (Control X in panel1.Controls)
{
panel1.Controls.Remove(X);
}
}
문제는이 메소드를 실행하면 단일 항목 만 삭제 된 다음 버튼을 다시 클릭하여 메소드가 다시 실행될 수 있으면 다른 항목이 삭제됩니다.
내 패널에 10 개의 컨트롤이 있으면 모든 컨트롤을 삭제하려면 프로그램에서 "삭제"버튼을 여러 번 클릭해야합니다.
이 경우 무엇을 할 수 있습니까?
해결책
이것이 당신을 위해 효과가 있습니까?
private void ClearSearchResults()
{
panel1.Controls.Clear();
}
CKRET 의견을 강조하기 위해 편집되었습니다.
다른 팁
일반적으로 컬렉션에서 제거 할 수있는 동안 열거 가능한 열거 가능한 것을 반복하는 동안 컬렉션에서 제거 할 수 없습니다. Foreach를 사용하는 대신 일반적인 접근 방식은 거꾸로 작동하는 루프를 사용하는 것입니다.
private void ClearSearchResults()
{
for(int i=panel1.Controls.Count-1;i>=0;--i) {
panel1.Controls.RemoveAt(i);
// or
// Control X = panel1.Controls[i];
// panel1.Controls.Remove(X);
}
}
그러나이 경우 명확하게 사용하십시오.
panel1.Controls.Clear();
나는 당신이 그것을 반복하는 동안 아이템을 제거 할 때 ienumareble을 바꾸고 있다고 생각합니다.
Foreach 대신 간단한 루프를 사용하십시오.
처음에는 foreach 루프 내에서 ienumerable 컬렉션을 편집해서는 안됩니다. 루프 또는 잠시 동안 사용해야합니다.
즉
private void ClearSearchResults()
{
while (panel1.Controls.Count > 0)
{
panel1.Controls.RemoveAt(0);
}
}
또는 그냥 사용하십시오 :
panel1.Controls.Clear();
아마도 :
panel1.Controls.Clear()
사용하는 패널의 종류를 모르기 때문에 일반적으로 전화 할 수 있습니다. panel1.Controls.Clear
private void ClearSearchResults()
{
foreach (Control X in panel1.Controls)
{
panel1.Controls.Remove(X);
}
if (panel1.Controls.Count > 0)
{
ClearSearchResults();
}
}
int n;
n = panel1.Controls.Count-1;
for (int i = 0; i <= n; i++ )
{
Control c = panel1.Controls[0];
panel1.Controls.Remove(c);
}
실제로 당신은 사용할 수 없습니다 Remove
반복자를 깨뜨리기 때문에 간단한 솔루션은 다음과 같습니다.
var controls = in c from panel1.Controls select c;
foreach(Controls _control in controls)
{
panel1.Controls.Remove(_control);
}
그러나 물론 당신은 루프를 고수하고 싶지 않은 다음 계속해서 사용합니다. panel1.Controls.Clear()
while (panel1.Controls.Count != 0)
{
foreach (Control c in panel1.Controls)
{
panel1.Controls.Remove(c);
}
}
또 다른 방법 !