Visual Basic .Net:Créer dynamiquement des contrôles
Un article de WikiTuto.
Sommaire |
Explication
Alors voilà, l'affaire est toute bête, et tient en peu de mots : il est possible de créer et de détruire des contrôles en cours d'exécution, via les instructions appropriées.
Créer un nouveau contrôle par du code n'est pas plus compliqué que créer une nouvelle variable : on retrouve le mot-clé Dim, et la spécification de la classe du contrôle. Sans omettre le constructeur New, indispensable dès que la déclaration porte sur autre chose qu'un type simple. On aura ainsi une ligne du genre :
Dim Toto as New Button
Où Toto sera la propriété Name du nouveau bouton créé. Mais à ce stade, nous n'avons créé qu'un bouton désincarné, virtuel, si j'ose dire, et qui n'appartient à aucun ensemble de notre application. Si l'on veut par exemple que le nouveau bouton soit visible (et en général, c'est vivement recommandé), il est indispensable de l'incorporer dans la collection Controls de la Form :
Controls.Add(Toto)
Toto est dorénavant un contrôle comme un autre de la Form. Si, pour libérer de l'espace, on veut à un moment où à un autre détruire le contrôle, il suffira de lui appliquer la méthode Dispose.
Remarque
Si l'on crée un contrôle dynamiquement, par du code, celui-ci se voit donc déclaré par l'instruction Dim au sein d'une procédure. Par conséquent, ce contrôle va être considéré par le langage comme une variable (objet) locale à la procédure. En toute logique, il sera donc impossible de faire référence à ce contrôle par son nom (sa propriété Name), dans une autre procédure !
La parade sera d'incorporer, comme nous l'avons fait, ce contrôle à la collection Controls de la Form (et éventuellement, à d'autres collections créées par nos soins). De là, nous pourrons accéder au contrôle, depuis n'importe quelle procédure, via son indice dans la collection... Ouf.
Attribution de noms
Le seul détail qui nous reste à régler - mais par rapport à ce qu'on s'est cogné jusque là, ça va être du cake - c'est de savoir comment on va faire pour attribuer automatiquement des noms (des propriétés Name) à toute une série de contrôles créées à la chaîne par du code.
Pour cela, il suffit par exemple de concaténer un nom (mettons, Toto), et un nombre généré par une boucle. De toutes façons, l'essentiel est que les noms soient tous différents : le reste, on s'en fiche un peu, puisqu'on ne se resservira des contrôles qu'en les désignant par leur indice dans la collection dans laquelle nous les aurons rangés.
Exemple
Voilà, pour résumer, un code qui accomplit les tâches suivantes :
- il crée et affiche les unes en dessous des autres 20 nouvelles Checkbox
- il les intègre dans la collection Mescases
- il branche le changement d'état de chacune de ces cases sur une procédure unique, ClicMesCases
Exercices
Pour Le maillon faible, l'intérêt est évidemment de trouver un moyen de programmer la série de questions par une boucle. De sorte que s'il y avait 25 questions et non 5, le code n'en serait pas plus long.
Dim MesCases As New Collection
Private Sub Button1_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer For i = 1 To 20 Dim x As New CheckBox x.Name = "Macase" & Str(i) Controls.Add(x) x.Left = 50 x.Top = i * 20 x.Width = 150 x.Text = "Je suis une case" MesCases.Add(x) AddHandler x.CheckedChanged, AddressOf ClicMesCases Next i End Sub
Pour gérer le clic sur ces cases et afficher laquelle a déclenché l'événement, nous retrouverons donc un code déjà vu, sur un mode un brin laborieux (puisque l'emploi d'une collection personnalisée MesCases nous interdit de récupérer directement l'indice via IndexOf) :
Private Sub ClicMesCases(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim i, tut As Integer
For i = 1 To MesCases.Count
If MesCases(i).name = sender.name Then
tut = MsgBox("vous avez cliqué sur la case n°" & i, vbOK)
End If
Next i
End Sub
Et voilà. Bon, avec ça, on va pouvoir faire des noeuds très jolis (et très gros) à nos neurones.
| Exercice | Exécutable | Sources |
|---|---|---|
| Damier | [1] | [2] |
Voir aussi
- La notion de Collection
- Désigner les contrôles par leur indice
- La boucle For Each ... Next
- Tester le type d'un contrôle
- Créer ses propres collections par du code
- Créer dynamiquement des contrôles
- Remarque finale
- Retour au sommaire
Source : Christophe Darmangeat



