2012-06-02 2 views
3

Je suis un nouveau programmeur à vb.net, alors excusez pour ce qui est susceptible d'être l'ignorance. Je suis en train de créer un interface graphique simple pour une interface de base de données, avec de nombreux éléments parents et enfants. Sur un formulaire, je crée des boutons en fonction du nombre d'éléments (parents/enfants). J'ai la création des boutons ainsi:vb.net supprimer beaucoup de boutons créés dynamiquement

For RowNumber As Integer = 0 To NoOfRows 
     Dim Buttoni As New Button 
     Buttoni.Location = New Point(LocationX, LocationY) 
     Buttoni.Width = 100 
     Buttoni.Height = 40 
     Buttoni.Visible = True 
     Buttoni.Text = DatasetA.Tables(0).Rows(RowNumber).Item("Name") 
     ButtonName = "Button" + RowNumber.ToString 

     If LocationX < FormWidth - (SpacePerButtonX * 2) Then 
      LocationX = LocationX + SpacePerButtonX 
     Else 
      LocationX = 50 
      LocationY = LocationY + SpacePerButtonY 
     End If 

     AddHandler Buttoni.Click, AddressOf DynamicButtonClick 
     Me.Controls.Add(Buttoni) 
     Buttoni.BringToFront() 'brings newest buttons to front! 
    Next 

Mais je suis aux prises avec un moyen de supprimer les boutons pour faire place à un nouveau jeu pour les remplacer ... Je peux supprimer un seul sur son clic, mais je voudrais supprimer tous les boutons qui ont été créés de cette manière avant de les recréer.

J'espère que cela a du sens et qu'il y a un moyen assez simple d'y parvenir ..?

+1

VB.NET dans quel environnement? WPF? Winforms? WebForms? WP7? Silverlight? MVC? – Oded

Répondre

1

Il est difficile de savoir exactement ce que vous voulez faire. Je suppose que vous pouvez simplement utiliser la même technique dans le sens inverse, quelque chose comme

 For i As Integer = Me.Controls.Count - 1 To 0 Step -1 
      Dim ctrl = Me.Controls(i) 

      If TypeOf (ctrl) Is Button Then 
       ctrl.Dispose()   '' NOTE: disposing the control also removes it 
      End If 
     Next 
3

Je vais ajouter, dans votre boucle de création, une valeur à la propriété Tag. Cela aidera à différencier les boutons créés de façon dynamique des boutons créés statiquement dans votre formulaire.

Buttoni.Tag = 1 

Ensuite, supprimer un bouton, boucle dans l'ordre inverse sur la collection Me.Controls,
vérifier si vous obtenez un bouton et si la propriété Tag IsNot Rien

For x as Integer = Me.Controls.Count - 1 to 0 step -1) 
    Dim b as Button = TryCast(Me.Controls(x), Button) 
    If b IsNot Nothing AndAlso b.Tag IsNot Nothing then 
     b.Dispose()  '' NOTE: disposing the button also removes it 
    End If 
Next 
+0

@HansPassant, merci pour votre modification. Attention à élaborer sur la fuite méchante? Je ne suis pas au courant de cela et j'ai un peu de code qui fait la suppression. Un lien est suffisant. – Steve

+0

http://stackoverflow.com/a/4195285/17034 et un tas de questions que vous trouverez à partir de la recherche "erreur de création fenêtre poignée" –

+0

@HansPassant merci encore, c'est énorme, comment ai-je raté ce pour tout ce temps ? Demain sera une journée de nettoyage au travail. – Steve

0

Créer un bouton et supprimez-le en double-cliquant! Code facile:

Dim b As New Button 
Private btn As Button ' this is a reference object 
Private ptX, ptY As Integer 
Private drag As Boolean 
Private Sub nodebtn_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    If e.Clicks = 2 Then 
     b.Dispose() 
    End If 

    If e.Button = MouseButtons.Left Then 
     drag = True 
     btn = CType(sender, Button) 
     ptX = e.X : ptY = e.Y 
    End If 
End Sub 

Private Sub nodebtn_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    If drag Then 
     btn.Location = New Point(btn.Location.X + e.X - ptX, btn.Location.Y + e.Y - ptY) 
     Me.Refresh() 
    End If 
End Sub 
Private Sub nodebtn_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    drag = False 
End Sub 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    b.Location = New Point(10, 10) 
    b.Size = New Size(110, 29) 
    b.BringToFront() 
    b.Text = "Button" 
    AddHandler b.MouseDown, AddressOf nodebtn_MouseDown 
    AddHandler b.MouseMove, AddressOf nodebtn_MouseMove 
    AddHandler b.MouseUp, AddressOf nodebtn_MouseUp 
    Me.Controls.Add(b) 
End Sub 
Questions connexes