Foreach 루프를 사용하여 패널의 모든 컨트롤을 삭제하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1607983

  •  05-07-2019
  •  | 
  •  

문제

여기에 내가 가진 코드는 다음과 같습니다.

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

또 다른 방법 !

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top