Pergunta

Aqui está o código que eu tenho:

private void ClearSearchResults()
    {
        foreach (Control X in panel1.Controls)
        {
            panel1.Controls.Remove(X);
        }
    }

O problema é, quando eu executar este método, apenas um único item é excluído, então se eu clicar em um botão novamente para que o método pode ser executado novamente, outra é excluída.

Se eu tiver 10 controle no meu painel, eu teria de clicar no botão "Delete" no meu programa muitas vezes para todo o controle a ser apagada.

O que posso fazer neste caso?

Foi útil?

Solução

Será que este trabalho para você?

private void ClearSearchResults()
{
    panel1.Controls.Clear();
}

editados para enfatizar o comentário CKret.

Outras dicas

Você, em geral, não pode remover de uma coleção durante a iteração de um enumeráveis ??gerado a partir dele. Em vez de usar foreach, a abordagem típica é usar um por trás de loop de trabalho:

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

No entanto, neste caso, basta usar claro:

panel1.Controls.Clear();

Eu acredito que você está alterando o IEnumareble quando você remover um item a partir dele durante a iteração-lo.

Tente usar um loop for simples em vez de um foreach.

Para começar, você não deve editar a coleção IEnumerable dentro de um loop foreach. Você deve estar usando um loop ou um tempo.

i.

private void ClearSearchResults()
    {
        while (panel1.Controls.Count > 0)
        {
            panel1.Controls.RemoveAt(0);
        }
    }

ou apenas use:

 panel1.Controls.Clear();

Talvez isto:

panel1.Controls.Clear()

Como eu não sei o tipo de painel que você usa, você pode geralmente chamar 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);
            }

Na verdade, você não pode usar Remove porque quebra o iterador de modo solução simples seria algo como isto:

var controls = in c from panel1.Controls select c;
foreach(Controls _control in controls)
{
   panel1.Controls.Remove(_control);
}

mas é claro que você não querer ficar com loop, em seguida, vá em frente e uso panel1.Controls.Clear()

while (panel1.Controls.Count != 0)
{
    foreach (Control c in panel1.Controls)
    {
        panel1.Controls.Remove(c);
    }
}

Outra maneira!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top