Groupe de controle & création dynamique

cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 6 mars 2012 à 18:26 - Dernière réponse : NHenry 14131 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 21 avril 2018 Dernière intervention
- 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...
Afficher la suite 

20 réponses

Répondre au sujet
Utilisateur anonyme - 6 mars 2012 à 20:12
+4
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
NHenry 14131 Messages postés vendredi 14 mars 2003Date d'inscription 21 avril 2018 Dernière intervention - 6 mars 2012 à 20:36
0
Utile
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
---
Commenter la réponse de NHenry
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 6 mars 2012 à 20:49
0
Utile
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
Commenter la réponse de cs_ShayW
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 7 mars 2012 à 08:18
0
Utile
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
Commenter la réponse de cs_got
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 7 mars 2012 à 10:41
0
Utile
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 ?
Commenter la réponse de cs_ShayW
Utilisateur anonyme - 7 mars 2012 à 11:49
0
Utile
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
Commenter la réponse de Utilisateur anonyme
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 7 mars 2012 à 13:33
0
Utile
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
Commenter la réponse de cs_ShayW
Utilisateur anonyme - 7 mars 2012 à 13:40
0
Utile
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
Commenter la réponse de Utilisateur anonyme
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 7 mars 2012 à 13:47
0
Utile
Je n'ai aucune erreur moi...

mais à explicit ON
Commenter la réponse de cs_ShayW
Utilisateur anonyme - 7 mars 2012 à 13:54
0
Utile
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
Commenter la réponse de Utilisateur anonyme
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 7 mars 2012 à 15:11
0
Utile
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+
Commenter la réponse de cs_got
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 7 mars 2012 à 15:18
0
Utile
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 ;-)
Commenter la réponse de cs_got
Utilisateur anonyme - 7 mars 2012 à 15:28
0
Utile
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
Commenter la réponse de Utilisateur anonyme
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 7 mars 2012 à 22:03
0
Utile
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 :-)
Commenter la réponse de cs_got
Utilisateur anonyme - 8 mars 2012 à 00:24
0
Utile
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
Commenter la réponse de Utilisateur anonyme
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 8 mars 2012 à 07:25
0
Utile
Bonjour,

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

Merci
Commenter la réponse de cs_got
NHenry 14131 Messages postés vendredi 14 mars 2003Date d'inscription 21 avril 2018 Dernière intervention - 8 mars 2012 à 08:40
0
Utile
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).

Commenter la réponse de NHenry
Utilisateur anonyme - 8 mars 2012 à 12:14
0
Utile
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
Commenter la réponse de Utilisateur anonyme
0
Utile
1

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
NHenry 14131 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 21 avril 2018 Dernière intervention - 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.
Commenter la réponse de botamc

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.