Groupe de controle & création dynamique

cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016 - 6 mars 2012 à 18:26
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 20 sept. 2016 à 18:02
Bonjour,

en .net les groupes de contrôle (avec index) n'existe plus.
Il y a plusieurs solutions manuelles pour palier à ce souci.
j'ai trouvé comment ajouter en handle à une procédure tel ou tel contrôle
Par contre je n'arrive pas à trouver comment je pourrais charger dynamiquement des contrôles et ensuite les associer à une procédure?

De plus comment charger dynamiquement un control dans une boucle for , vu que qu'il n'y a plus d'index on est obligé de charger les contrôles un a un ?

Si quelqu'un à des astuces/infos...

Merci...

19 réponses

Utilisateur anonyme
6 mars 2012 à 20:12
Bonjour,

Tu peux procéder comme ça (par exemple):
Public Class Form1
    Dim Panel1 As Panel = New Panel
    Dim Bouton() As Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(Panel1)
                For i As Integer = 0 To 3
            ReDim Preserve Bouton(i)
            Bouton(i) = New Button
            Bouton(i).Text = "Bouton " & i.ToString
            If i > 0 Then Bouton(i).Top = Bouton(i - 1).Top + Bouton(i).Height
            AddHandler Bouton(i).Click, AddressOf Bouton_Click
            Me.Panel1.Controls.Add(Bouton(i))
        Next
    End Sub

    Private Sub Bouton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim Index As Integer = Panel1.Controls.IndexOf(sender)
        Me.Text "BOUTON " & Index
    End Sub
End Class

Tu remarqueras que j'ai mis les boutons dans un "Panel" puisque on utilise l'index des contrôles y contenus.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
4
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
6 mars 2012 à 20:36
Bonjour,

A la place des tableaux dynamiques, il y a aussi les collections : List(Of ...)

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
6 mars 2012 à 20:49
Salut Acive

vaut mieux se servir du tag pour indexer les boutons
Bouton(i).tag = i.ToString
comme ça le .text est libre
et dans l'évenement click

Private Sub Bouton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
messagebox.show("bouton " & directcast(sender,button).tag.tostring)
    End Sub
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
7 mars 2012 à 08:18
Bonjour,

merci pour cette astuces...

à quoi sert exactement :
Bouton(i).Text = "Bouton " & i.ToString


Doit on forcement utilisé la valeur text ou tag? le fait que button() soit un tableau n'est il pas suffisant pour que
 Dim Index As Integer = Panel1.Controls.IndexOf(sender)


renvoi l'index du button clické?

-> Nhenry quel est l'avantage de la collection sur le tableau simple...
j'ai vu qu'il existait aussi les dictionnary aussi mais l’intérêt dans ce cas ...? pour trier les control?


Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
7 mars 2012 à 10:41
Salut

Doit on forcement utilisé la valeur text ou tag?

le text va écrire un texte sur ton bouton

combien de boutons veux tu créer ?
0
Utilisateur anonyme
7 mars 2012 à 11:49
Salut,
Attendez, le texte du bouton n'a rien à voir avec son indexation sur le panel, nous n'avons pas besoin du tout d'utiliser du tout son texte ou son Tag (ShayM)
Si je l'ai changé c'est uniquement pour votre confort visuel.
Public Class Form1
'on crée un nouvel Panel pour acceuilir les bouton
    Dim Panel1 As Panel = New Panel
    'on crée un groupe de boutons (vide)
    Dim Bouton() As Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(Panel1)' on ajoute le contrôle Panel1 à la Form1 (Me)
        For i As Integer = 0 To 3 'on traite 4 boutons (0 à 3)
            ReDim Preserve Bouton(i)'on dimensionne le nouvel bouton
            Bouton(i) = New Button 'on crée le nouvel bouton
'On a pas besoin de lui écrire un texte...            
'Bouton(i).Text = "Bouton " & i.ToString

'on les place à la suite (sinon ils vont se chevaucher)
            If i > 0 Then Bouton(i).Top = Bouton(i - 1).Top + Bouton(i).Height
'on lui attribue le Handler pour gérer le Click
            AddHandler Bouton(i).Click, AddressOf Bouton_Click
'on l'ajoute comme contrôle au Panel1
            Me.Panel1.Controls.Add(Bouton(i))
        Next
    End Sub

    Private Sub Bouton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
'on lit son index par rapport au groupe de contrôles contenus dans le Panel1        
Dim Index As Integer = Panel1.Controls.IndexOf(sender)
        Me.Text "BOUTON " & Index
    End Sub
End Class

Des questions?


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
7 mars 2012 à 13:33
Dim Index As Integer = Panel1.Controls.IndexOf(sender)


me donne une erreur
plutot
Dim Index As Integer = Panel1.Controls.IndexOf(CType(sender, Control


si tu as dans la panel d'autre control tu risques
de te tromper avec les indexs

private Panel1 As Panel = New Panel
private Bouton() As Button
private labels() As Label

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Controls.Add(Panel1)
        For i As Integer = 0 To 3
            ReDim Preserve Bouton(i)
            Bouton(i) = New Button
            Bouton(i).Text = "Bouton " & i.ToString
            If i > 0 Then Bouton(i).Top = Bouton(i - 1).Top + Bouton(i).Height
            AddHandler Bouton(i).Click, AddressOf Bouton_Click
            Me.Panel1.Controls.Add(Bouton(i))
            ReDim Preserve labels(i)
            labels(i) = New Label
            labels(i).Left = Bouton(i).Right + 3
            labels(i).Text = "LABEL " & i.ToString
            If i > 0 Then labels(i).Top = labels(i - 1).Top + labels(i).Height
            AddHandler labels(i).Click, AddressOf labels_Click
            Me.Panel1.Controls.Add(labels(i))
        Next
end sub
 Private Sub Bouton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim Index As Integer = Panel1.Controls.IndexOf(CType(sender, Control))
        MessageBox.Show("BOUTON = " & Index)
    End Sub

    Private Sub labels_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim Index As Integer = Panel1.Controls.IndexOf(CType(sender, Control))
        MessageBox.Show("LABEL = " & Index)
    End Sub
0
Utilisateur anonyme
7 mars 2012 à 13:40
Salut Shay,
Dim Index As Integer = Panel1.Controls.IndexOf(sender)
me donne une erreur

Je n'ai aucune erreur moi...
Mais ton code est encore mieux adapté.

Le fait d'avoir mis les boutons dans un panel c'était justement pour éviter de confondre tous les contrôles, comme ça nous avons "le panel des boutons".


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
7 mars 2012 à 13:47
Je n'ai aucune erreur moi...

mais à explicit ON
0
Utilisateur anonyme
7 mars 2012 à 13:54
Ok, je ne l'ai pas mise...
De toute façon notre ami got a déjà de quoi faire avec cette méthode (entre autres).

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
7 mars 2012 à 15:11
C'est clair je vais tester tout ça...

Merci beaucoup ;-)

Mais sans test vu ce que j'ai compris du code, je pense que je vais pouvoir rayer ça de mes gros point noir pour la migration de mon appli VB6 :-p

a+
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
7 mars 2012 à 15:18
Juste une petite chose pour etre sur...

pour l'index que je recupére dans la sub qui à le(s) handle.
de toute façon le sender est bien defini donc meme si dans la form j'ai par exemple des text box indexée il ne les confondra pas?
et je pourrai faire un truc dans le genre
index  = me.controls.adressof(sender)


non?

le mieux c'est que je test :-p

je m'y met ;-)
0
Utilisateur anonyme
7 mars 2012 à 15:28
Dans les exemples ci-dessus le seul contrôle présent est le Panel1 donc
Me.Controls.Count sera = 1 (si c'est le seul sur la Form)
Car les boutons sont le contenu du Panel1, ce qui fait:
Panel1.Controls.Count sera = 4 (tes 4 boutons contenus dans le Panel1)

Je m'embrouille tout seul, j'explique mal mais je me comprends...

Teste le code...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
7 mars 2012 à 22:03
En faisant les test je comprend ce que tu veux dire ;-)

En fait on recupere un index qui est une index de tous les control de la feuille... et pas un index coresspondant a l'index de création ...
Ca complexifie un peu la chose mais ça devrait le faire. En gros savoir dans quel ordre je charge mes différents control pour ensuite avoir des "index reels". En ayant pris soins de récupérer la valeur de l'index de départ si il y a des controles deja présent sur la frm...

Merci :-)
0
Utilisateur anonyme
8 mars 2012 à 00:24
C'est pour ça que j'avais mis un Panel, pour éviter de complexifier la chose.

Et vu que tu les crées dynamiquement tu dois retenir leur position, par rapport à leur position sur le panel.

Moi aussi j'ai trouvé ça chiant mais je m'y suis fait rapidement.

Tu peux aussi les placer sur ta Form normalement (à partir de la boite à outils), donc le Button1, le 2 et le 3.
Et ensuite les appeler par leurs noms, du genre:
For i As Integer = 1 To 3
    Me.Controls("Button" & i.ToString).Text = i.ToString
Next

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
8 mars 2012 à 07:25
Bonjour,

et ne peut on pas récupérer l'index du control qui a le focus?

Merci
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 mars 2012 à 08:40
Bonjour,

Tu as dans l'évènement, le Sender (objet ayant envoyé l'évènement), ensuite, à toi de retrouver dans un tableau ou collection l'index (IndexOf).

0
Utilisateur anonyme
8 mars 2012 à 12:14
et ne peut on pas récupérer l'index du control qui a le focus?

Eh bien, tu lui ajoutes un Handler...

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(Panel1) ' on ajoute le contrôle Panel1 à la Form1 (Me)
        For i As Integer = 0 To 3 'on traite 4 boutons (0 à 3)
            ReDim Preserve Bouton(i) 'on dimensionne le nouvel bouton
            Bouton(i) = New Button 'on crée le nouvel bouton
            'on les place à la suite (sinon ils vont se chevaucher)
            If i > 0 Then Bouton(i).Top = Bouton(i - 1).Top + Bouton(i).Height
            'on lui attribue le Handler pour gérer le Click
            AddHandler Bouton(i).Click, AddressOf Bouton_Click
            AddHandler Bouton(i).GotFocus, AddressOf Bouton_GotFocus
            'on l'ajoute comme contrôle au Panel1
            Me.Panel1.Controls.Add(Bouton(i))
        Next
    End Sub

    Private Sub Bouton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub

    Private Sub Bouton_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim Index As Integer = Panel1.Controls.IndexOf(CType(sender, Control))
        Me.Text = Index
    End Sub


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0

Public Class Form1
Dim Panel1 As Panel = New Panel
Dim Bouton() As Button
Dim Index as integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Controls.Add(Panel1)
For i As Integer = 0 To 3
Index=i
ReDim Preserve Bouton(i)
Bouton(i) = New Button
Bouton(i).Text = "Bouton " & i.ToString
Bouton(i).tag = index
If i > 0 Then Bouton(i).Top = Bouton(i - 1).Top + Bouton(i).Height
AddHandler Bouton(i).Click, AddressOf Bouton_Click
Me.Panel1.Controls.Add(Bouton(i))
Next
End Sub

Private Sub Bouton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim cbouton As Button = DirectCast(sender, Button)
Index = Integer.Parse(cbouton.Tag)
MessageBox.Show("Bouton = " & Index)
End Sub
End Class
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 sept. 2016 à 18:02
Au lieu d'utiliser un tableau et de le redimensionner, je recommande plutôt l'usage d'une collection : List(Of Button) largement plus souple pour l'ajout/retrait.
0
Rejoignez-nous