IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

VB 2010: Les checkbox avec CType [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut VB 2010: Les checkbox avec CType
    Bonsoir à vous. J'ai besoin de votre aide.
    Pour pratiquer j'ai créé un petit exercice:

    Nom : jdyb.jpg
Affichages : 373
Taille : 10,3 Ko

    Je veux cocher tous les checkbox en cliquant sur le bouton.
    Je sais, j'ai déjà posé ce problème qui a été résolu avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            cocher(Me)
        End Sub
     
     Public Sub cocher(ByVal cont As Control)
            For Each CBX In cont.Controls.OfType(Of CheckBox)()
                CBX.Checked = True
     
            Next
        End Sub
    Mais moi je veux savoir pourquoi ce code ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Private Sub cocher(ByVal cont As Control)
            If TypeOf (cont) Is CheckBox Then
                CType(cont, CheckBox).Checked = True
            End If
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            cocher(Me)
        End Sub
    Merci à vous.
    J'apprends la programmation pour le plaisir

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Ça va être compliqué de répondre à la question étant donné que les 2 codes fonctionnent ; et encore heureux le premier n'est qu'un "raccourci" vers le second.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Chez moi le 2ème code ne fonctionne pas (et le compilateur ne génère aucune erreur)
    J'apprends la programmation pour le plaisir

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    ah oui lu un peu trop vite tu as juste oublié la boucle dans le second code ; dans le premier tu dis bien de prendre dans la collection de contrôle de ton argument ceux de type CheckBox alors que dans le second tu dis si l'argument (at pas les contrôles qu'il contient) est une CheckBox.
    Du coup comme Form n'est pas un CheckBox tu n'entres pas dans le If et la méthode ne "fait rien"
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Merci pour l'aide mais je n'ai as encore compris
    Je laisse pour demain après midi. C'est l'heure du lit.
    à +
    J'apprends la programmation pour le plaisir

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Me est l'instance en cours d'utilisation, donc l'instance du Form
    ta fenetre n'est pas un checkbox c'est une fenetre

    il te manque une boucle quelquepart pour traiter me.Controls au lieu de me
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 267
    Points : 0
    Points
    0
    Par défaut
    bonjour,voici la solution a ton probléme pour tous cocher les CheckBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Me.cocher()
        End Sub
     
        Private Sub cocher()
            For Each cc As Control In Me.Controls
                If TypeOf cc Is CheckBox Then
                    DirectCast(cc, CheckBox).Checked = True
                End If
            Next
        End Sub

  8. #8
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Merci à vous.
    Me est l'instance en cours d'utilisation, donc l'instance du Form
    ta fenetre n'est pas un checkbox c'est une fenetre
    J'ai compris cette erreur.

    Le code de hacker59 est celui que je cherche, ça marche et j'ai bien compris sa logique. Mais reste une question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Me.cocher()
        End Sub
     
        Private Sub cocher()
            For Each cc As Control In Me.Controls
                If TypeOf cc Is CheckBox Then 'si cette condition est vrai donc cc est un Checkbox
                    'quel est l'interêt de passer par CType "convertir un Checkbox en Checkbox"
                    'pourqoui ne pas juste faire: cc.checked=True
                    'Mais je l'ai essayé et ça ne compile pas
                    CType(cc, CheckBox).Checked = True
                End If
            Next
        End Sub
    Merci à vous
    J'apprends la programmation pour le plaisir

  9. #9
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tu confonds 2 choses, le type de la variable (le type donné à la variable lors de sa déclaration) et le type de ce que contient la variable (possiblement le même mais pas forcément).

    cc n'est pas un CheckBox ; cc est une variable de type Control référençant un objet de type CheckBox (ce qui est possible parce que CheckBox hérite de Control).
    la classe Control n'a pas de propriété Checked ; donc tenter d'utiliser Checked sur une variable de type Control provoquera une erreur (sauf cas de liaison tardive).
    Le test permet de s'assurer que la variable référence bien un objet du bon type et donc quand c'est le cas on sait de manière sûre qu'on peut demander de convertir (via CType) ou considérer (via DirectCast) notre variable dans le type testé (ici CheckBox).
    Comme CType et Directcast retourne une valeur du type demandé (ici CheckBox) tu peux donc utiliser sa propriété Checked en toute tranquilité.

    À noter que l'implémentation de OfType reprend exactement cela : test TypeOf + DirectCast ; si on devait l'écrire à la main ça donnerait en gros ceci (en mettant de côté la gestion d'erreur et la séparation entre validation immédiate et exécution tardive) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Iterator Function OfType(Of TResult)(source As IEnumerable) As IEnumerable(Of TResult)
        For Each obj In source
            If TypeOf obj Is TResult Then Yield DirectCast(obj, TResult)
        Next
    End Function
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  10. #10
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Merci infiniment Sehnsucht, explication bien détaillée.
    Mon erreur est donc: (If TypeOf cc Is CheckBox)==(cc=Checkbox).
    Tout le code devient donc clair
    (Par contre Implémentation OfType, c'est trop fort pour moi pour le moment)
    Une autre fois "a big thanks"
    J'apprends la programmation pour le plaisir

  11. #11
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Comme récapitulatif, ça peut aider les tous débutants comme moi, voilà différentes manières de procéder:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Public Class Form1
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            ToutCocher1(Me)
            '  ToutCocher2(Me)
            ' ToutCocher3()
            ' ToutCocher4()
        End Sub
     
        ' ========== 111111111111111 ====================================
        Public Sub ToutCocher1(ByVal cont As Control)
            For Each CHBX In cont.Controls.OfType(Of CheckBox)()
                CHBX.Checked = True
            Next
        End Sub
     
        '============ 2222222222222222222 =================================
        Public Sub ToutCocher2(ByVal cont As Control)
            If TypeOf cont Is Form Then
                For Each elem In cont.Controls.OfType(Of CheckBox)()
                    elem.Checked = True
                Next
            End If
        End Sub
     
        '============= 33333333333333333 ======================================
        Public Sub ToutCocher3()
            For Each cont In Me.Controls
                If cont.Name Like "Check*" Then
                    cont.checked = True
                End If
            Next
        End Sub
     
        ' ============== 44444444444444444444 ===================================
        Public Sub ToutCocher4()
            For Each cont In Me.Controls
                If TypeOf cont Is CheckBox Then
                    CType(cont, CheckBox).Checked = True
                End If
            Next
        End Sub
     
    End Class
    J'apprends la programmation pour le plaisir

  12. #12
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tes versions 2 et 3 sont un peu "idiotes"
    Pour la version 2, rien n'empêche de vouloir cocher tous les Checkox d'un Panel, d'un GroupBox, ou d'un CustomControl ; tester si l'argument est donc de type Form c'est pas judicieux (à ce compte là autant directement demander un argument de type Form plutôt que Control)
    Pour la version 3, rien n'empêche de nommer ses contrôles comme on veut (et d'une manière générale c'est plutôt recommandé) et surtout dans l'absolu (donc d'une manière générale) il faut essayer de garder un code avec le moins de dépendances (que ce soit par rapport aux noms données qu'aux types des choses qu'on manipule). Sans parler du fait qu'elle ne compilera pas sous Option Strict On car comme je l'ai déjà dit la classe Control n'a pas de propriété Checked. Et puis ça serait drôle pour une application bancaire si j'ai un formulaire pour gérer des chèques (Check en anglais) je risque de vouloir "cocher" tout un tas de contrôles qui n'ont rien à voir avec des CheckBox

    La seule version vraiment viable c'est la version 1 ; on lui donne un control et elle coche tous les checkbox qu'il contient (donc 0 si il en a pas ou s'il ne peut contenir d'autres controles) ; la version 4 est pas potable mais il faudrait vraiment lui passer un argument (sinon elle ne sert que pour le form actuel) et il faudrait (mais ça reste plus accessoire) remplacer CType par DirectCast (qui convient mieux lors des conversion où il y a un lien d'héritage [ou d'implémentation] entre le type actuel et le type demandé)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Selectionner toutes les CheckBoxs avec boucle imbriquée.
    Par Azaxx dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/07/2011, 15h51
  2. Bug avec les CheckBox
    Par L4BiN dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 19/06/2006, 17h47
  3. [Tableaux] pb avec les checkbox
    Par splouf dans le forum Langage
    Réponses: 29
    Dernier message: 12/01/2006, 16h52
  4. Réponses: 1
    Dernier message: 30/11/2005, 15h57
  5. Pb avec les checkbox: tout sélectionner,récupération valeurs
    Par bubble_gum dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/10/2004, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo