2013-04-14 3 views
2

Avant que je produis des boutons dans mon programme, il est censé les effacer à l'aide:Supprimer des boutons de tableau dynamique

for (int i = 0; i < buttons.Length; i++) 
    this.Controls.Remove(buttons[i]); 

Cependant tous les boutons de la génération précédente restent. Qu'est-ce qui pourrait en être la cause?

(est inférieure à la totalité de la fonction, les changements dans d'autres fonctions bouton numérique.)

int numButtons = 5; 
    Button[] buttons = new Button[10]; 

    private void generate_buttons() 
    { 
     for (int i = 0; i < buttons.Length; i++) 
     { 
      this.Controls.Remove(buttons[i]); 
     } 
     for (int i = 0; i < numButtons; i++) 
     { 
      buttons[i] = new Button(); 
      buttons[i].Name = "btn" + i.ToString(); 
      buttons[i].Text = Convert.ToString(i + 1); 
      buttons[i].Size = new Size(40, 24); 

      int yOffset = 40; 
      int xOffset = 20 + i * 42; 
      buttons[i].Location = new Point(xOffset, yOffset); 
      buttons[i].BackColor = System.Drawing.SystemColors.Control; 
      buttons[i].Enabled = false; 
      buttons[i].Click += new EventHandler(this.clickMe); 
      buttons[i].Visible = true; 
      this.Height = yOffset + 104; 
      this.Width = xOffset + 75; 
     } 
     Controls.AddRange(buttons); 
    } 

Répondre

2

Bien que vous supprimez les boutons de la collection de contrôle, vous n'êtes pas le retirer de votre tableau buttons. Ajouter

Array.Clear(buttons, 0, buttons.Length); 

J'ai aussi modifié la boucle de suppression de disposer explicitement de toutes les ressources détenues par le bouton comme indiqué here on MSDN.

for (int i = 0; i < buttons.Length; i++) 
{ 
    //you can change break to 'continue' if you remove buttons 
    //from the array randomly so that if it encounters a null 
    //it will carry on reading the rest of the array. 
    if (buttons[i] == null) 
     break; 


    //dispose any button resources and event handlers so no references remain 
    buttons[i].Click -= new EventHandler(this.clickMe); 
    this.Controls.Remove(buttons[i]); 
    buttons[i].Dispose(); 
} 

Array.Clear(buttons, 0, buttons.Length); 

//.. 
+0

Merci! Ceci est vraiment utile. – user1576628

-2

regarder dans une collection de liste générique à la place. Cela vous permet d'utiliser les méthodes .Add() et .Remove() /. RemoveAt() pour ajouter et supprimer des éléments plus facilement.

Tutoriel/Exemples: http://www.dotnetperls.com/list

Questions connexes