none
Fonctionnement étrange lors de la suppression d'un groupe de contrôles dans un FlowLayoutPanel RRS feed

  • Question

  • J'ai un groupe de contrôles (UserControls) dans un LayOutPanel.

    Je veux éliminer tous les contrôles appelés "lames" (pour les remplacer par d'autres). Voici mon code  (10 contrôles sont dans le FlowLayoutpanel) :

        Private Sub EffacerLaConfigurationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EffacerLaConfigurationToolStripMenuItem.Click
            Dim Us As UserControl1
            For Each Us In FlowLayoutPanel1.Controls
                FlowLayoutPanel1.Controls.Remove(Us)
                Us = Nothing
                NombreDeLames = NombreDeLames - 1
            Next Us
    

    Lorsque je clique sur l'élément correspondant du menu, seule une partie des contrôles disparaissent. Il faut que je clique 4 fois pour les faire disparaître tous.

    Un élément de menu de contrôle m'indique bien que 5 contrôles restent après le premier clic, 2 après le second, 1 après le troisième et 0 après le quatrième.

    Je ne comprends pas du tout ce qu'il se passe...

    Quelqu'un peut-il me l'expliquer et m'aider à corriger le code ?


    Pierre Allemand

    dimanche 29 avril 2012 21:46

Réponses

  • Bonjour,

    Vous supprimer un élément d'une collection que vous parcourez. L'algo de base pour ce genre d'opération est de parcourir la collection en partant de la fin :

    Ci-joint la version corrigée :

    For i As Integer = FlowLayoutPanel1.Controls.Count - 1 To 0 Step -1
        FlowLayoutPanel1.Controls.RemoveAt(i)
        NombreDeLames = NombreDeLames - 1
    Next

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 30 avril 2012 06:33
    Modérateur

Toutes les réponses

  • Bonjour,

    Vous supprimer un élément d'une collection que vous parcourez. L'algo de base pour ce genre d'opération est de parcourir la collection en partant de la fin :

    Ci-joint la version corrigée :

    For i As Integer = FlowLayoutPanel1.Controls.Count - 1 To 0 Step -1
        FlowLayoutPanel1.Controls.RemoveAt(i)
        NombreDeLames = NombreDeLames - 1
    Next

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 30 avril 2012 06:33
    Modérateur
  • Merci beaucoup.

    Pierre Allemand

    lundi 30 avril 2012 07:28