Como posso usar um loop foreach para apagar todo o controle em um painel?
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?
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!