Modification de contrôle créé dynamiquement

Résolu
cs_bny Messages postés 24 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 31 mai 2010 - 17 janv. 2007 à 20:59
cs_bny Messages postés 24 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 31 mai 2010 - 18 janv. 2007 à 19:51
Voici mon problème : Je crée des contrôles de façon dynamique dans mon programme cependant je ne sais pas comment faire pour pouvoir les modifier après leur création (à l'aide d'un bouton par exemple).  Je vais vous donner un exemple de création dynamique de checkbox...mais après la création je ne suis pas capable de créer un bouton pour les cocher toutes.  Le code est en Visual Basic Compact Framework...je ne sais pas si cela pose un problème, si vous avez la solution en VB .NET elle sera la bienvenue.

'Fonction qui affiche les Checkboxes de façon dynamique
    Public Sub afficheCheckBoxes(ByVal nb As Integer)
        'Déclaration des variables de positionnement des windows form        Dim YCB As Integer 6, XCB As Integer 2
        For nb = 1 To nb
            'Création de la liste des élèves en checkbox
            Dim cbeleve As New Windows.Forms.CheckBox()
            cbeleve.Size = New System.Drawing.Size(115, 15)
            cbeleve.Location = New System.Drawing.Point(XCB, YCB)          
            cbeleve.Text = "eleve" & nb
            Panel.Controls.Add(cbeleve)          
            YCB += 17
        Next
    End Sub

'Fonction pour cocher tous les checkboxes élèves
    Public Sub selectAll(ByVal nb As Integer)
        Dim cpt As Integer
        For cpt = 1 To nb
                cbeleve.checked = true
        Next
    End Sub

Il ne vois pas le cbeleve dans ma fonction selectAll...je sais que c'est normal j'ai aussi essayé de le mettre en variable globale mais sans succès.  Alors si vous avez une solution ce serait grandement apprécié.

3 réponses

cs_bny Messages postés 24 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 31 mai 2010
18 janv. 2007 à 19:51
Yay, j'ai trouvé la solution par moi-même finalement....pour ceux que ça pourrait intéresser je vais vous l'expliquer.  Il faut se créer une nouvelle classe qui représente un tableau de CheckBox ainsi on peut gérer tous les checkbox créés.  Voici le code de ma classe :

Public Class CheckBoxArray
    Inherits System.Collections.CollectionBase

'Mon host est un panel, si vous voulez créer le CheckBox sur un Form
'n'oubliez pas de le spécifier
    Private ReadOnly HostPanel As System.Windows.Forms.Panel

'Pour créer un nouveau CheckBox dans le tableau
    Public Sub New(ByVal host As System.Windows.Forms.Panel)
        HostPanel = host
        Me.AddNewCheckBox()
    End Sub

    Default Public ReadOnly Property Item(ByVal Index As Integer) As System.Windows.Forms.CheckBox
        Get
            Return CType(Me.List.Item(Index), System.Windows.Forms.CheckBox)
        End Get
    End Property

    Public Function AddNewCheckBox() As System.Windows.Forms.CheckBox
        ' Crée un instance de classe de CheckBox
        Dim aCheckBox As New System.Windows.Forms.CheckBox()
        ' Met le Checkbox dans la collection interne
        Me.List.Add(aCheckBox)
        ' Ajoute le checkbox dans le panel voulu utilisant le nom du panel
        HostPanel.Controls.Add(aCheckBox)
        ' Propriétés initiales du CheckBox
        aCheckBox.Size = New System.Drawing.Size(115, 15)
        aCheckBox.Font = New System.Drawing.Font(Drawing.FontFamily.GenericSansSerif, 8, Drawing.FontStyle.Regular)
        'Pour aligner les CheckBox
        If Count = 1 Then
            aCheckBox.Top = 6
        Else
            aCheckBox.Top = ((Count - 1) * 17) + 6
        End If
        aCheckBox.Left = 3
        aCheckBox.Tag = Me.Count
        aCheckBox.Text = "Eleve " & Me.Count.ToString
        Return aCheckBox
    End Function

    'Fonction pour retirer un CheckBox en utilisant la position de celui-ci
    'dans le tableau de CheckBox...peut être utile
    Public Sub Remove(ByVal nb As Integer)
        ' Regarde s'il y a un checkbox à effacer
        If Me.Count > 0 Then
            'Efface le CheckBox Voulu sur le form ainsi que dans la collection
            HostPanel.Controls.Remove(Me(nb - 1))
            Me.List.RemoveAt(nb - 1)
        End If
    End Sub

End Class

Et voici le code pour en créer comme bon vous semble :

'Fonction qui affiche le Chat de façon dynamique
    Public Sub afficheCB(ByVal nb As Integer)
        'Déclaration de mon tableau de CheckBox
        cbeleve = New CheckBoxArray(PanelChat)
        For nb = 1 To nb
            'Fonction qui met un nouveau CheckBox
            cbeleve.AddNewCheckBox()
        Next
    End Sub

Et la fonction pour tous les cocher :

'Fonction pour cocher tous les checkboxes élèves
    Public Sub selectAll(ByVal nb As Integer)
        For cpt As Integer = 0 To nb
            cbeleve(cpt).Checked = True
        Next
    End Sub

Voici le site où j'ai trouvé ma solution :
http://msdn2.microsoft.com/en-us/library/aa289500(VS.71).aspx
3
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
18 janv. 2007 à 00:37
normal Dim cbeleve As New Windows.Forms.CheckBox() crée UNE seule instance d'objet ! Pour faire mieu fait :

public x as new collection
...
x.add cbeleve
...
for i as integer = 1 to c.count
   x(i).checked=true
next

@+

E.B.
0
cs_bny Messages postés 24 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 31 mai 2010
18 janv. 2007 à 14:23
J'ai testé ta solution avec un programme VB .NET et elle marche très bien, cependant mon programme est en VB Compact Framework et celui-ci m'envoie l'erreur suivante lorsque j'essaie ta solution : "La version ciblée du .NET Compact Framework ne prend pas en charge la liaison tardive."...je croyais que la solution .NET marcherais sur le CF, alors s'il y en a qui connaissent une solution pour VB CF elle serait grandement appréciée.

Merci tout de même EBArtSoft, je saurai comment faire en .NET c'est toujours pratique.
0
Rejoignez-nous