Comment utiliser une boucle foreach pour supprimer tous les contrôles d'un panneau?

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

  •  05-07-2019
  •  | 
  •  

Question

Voici le code que j'ai:

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

Le problème est que, lorsque j'exécute cette méthode, un seul élément est supprimé. Si je clique à nouveau sur un bouton pour que la méthode puisse s'exécuter à nouveau, un autre est supprimé.

Si j'ai 10 contrôles dans mon panneau, je devrai cliquer sur le bouton "Supprimer". bouton de mon programme plusieurs fois pour supprimer tout le contrôle.

Que puis-je faire dans ce cas?

Était-ce utile?

La solution

Est-ce que cela fonctionne pour vous?

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

Modifié pour souligner le commentaire de CKret.

Autres conseils

En général, vous ne pouvez pas supprimer une collection lors de l'itération d'un énumérable généré à partir de celle-ci. Au lieu d'utiliser foreach, l'approche typique consiste à utiliser une boucle for en marche arrière:

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

Cependant, dans ce cas, utilisez simplement clear:

panel1.Controls.Clear();

Je pense que vous modifiez le paramètre IEnumareble lorsque vous en supprimez un élément en l'itérant.

Essayez d'utiliser une simple boucle for au lieu d'une foreach.

Pour commencer, vous ne devriez pas éditer la collection IEnumerable dans une boucle foreach. Vous devriez utiliser une boucle for ou un peu de temps.

I.e.

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

ou utilisez simplement:

 panel1.Controls.Clear();

Peut-être ceci:

panel1.Controls.Clear()

Comme je ne connais pas le type de panneau que vous utilisez, vous pouvez généralement appeler 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);
            }

En fait, vous ne pouvez pas utiliser Remove , car cela rompt l'itérateur. Une solution simple ressemblerait à ceci:

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

mais bien sûr, vous ne voulez pas vous en tenir à Loop, continuez et utilisez panel1.Controls.Clear ()

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

Autre moyen!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top