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 :

V. Studio 2017 - Boucle sur boutons d'un Form


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 7
    Points
    7
    Par défaut V. Studio 2017 - Boucle sur boutons d'un Form
    Bonjour à tous,

    J'ai un petit soucis en VB, je veux boucler sur tous les boutons contenus dans un form en faisant un for each mais ça me pointe une erreur sur l'occurence "bouton" en me mettant "Flat apparence n'est pas un membre de "control". (Cf. code ci dessous)

    Je débute en VB et je pense que je n'utilise pas la bonne syntaxe pour agir sur les paramètres de mes boutons contenu dans un form.... Sauriez vous quelle est la bonne syntaxe pour que je puisse modifier mes paramètres flatappearence ?

    Merci beaucoup pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
     
            boucle_survolage_des_boutons()
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub boucle_survolage_des_boutons()
     
            For Each bouton As Control In Form1.Controls
     
                If TypeOf bouton Is Windows.Forms.Button Then
     
                    bouton.FlatAppearance.MouseDownBackColor = Color.FromArgb(175, 17, 23)
                    bouton.FlatAppearance.MouseOverBackColor = Color.FromArgb(241, 105, 111)
                End If
            Next
     
    End Sub

  2. #2
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Bonjour,

    Tu fais bien le test de savoir si ton contrôle est de type Button. Donc, quand tu entres dans le if, tu sais que ton contrôle est de type Button. Cependant, ta variable "bouton" est bien de type Control, qui ne contient pas les propriétés du type Button. Pour ce faire, il faut que tu indiques explicitement que tu convertis ton "bouton" en Button :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CType(bouton, Button).FlatAppearance.MouseDownBackColor = Color.FromArgb(175, 17, 23)

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    il faut comprendre la notion de type d'une variable et type d'une instance contenu dans la variable

    For Each bouton As Control In Form1.Controls
    ceci déclare une variable bouton de type Control
    et plus loin tu écris bouton.FlatAppearance
    or la classe Control ne contient pas de propriété nommée FlatAppearance donc ca te le dis

    après oui la classe button en as surement une (si tu essayes d'écrire ca ^^) et tu as fait TypeOf pour vérifier mais le langage est stricte
    il faut donc déclarer une variable de type Button et mettre l'instance de la variable bouton en précisant le type via DirectCast

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       For Each ctrl As Control In Form1.Controls 
                If TypeOf ctrl Is Windows.Forms.Button Then
                    dim bouton = DirectCast(ctrl, Windows.Forms.Button) ' cette ligne plantera si ctrl n'est pas de type Button, mais c'est testé par le If donc c'est bon
                    bouton.FlatAppearance.MouseDownBackColor = Color.FromArgb(175, 17, 23)
                    bouton.FlatAppearance.MouseOverBackColor = Color.FromArgb(241, 105, 111)
                End If
            Next
    au passage la version Linq + méthode anonyme du même code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Form1.Controls.OfType<Button>.ToList.ForEach(Sub(bouton) 
                                                    bouton.FlatAppearance.MouseDownBackColor = Color.FromArgb(175, 17, 23)
                                                    bouton.FlatAppearance.MouseOverBackColor = Color.FromArgb(241, 105, 111)
                                                 End Sub)
    si tu veux garder la syntaxe avec ta boucle tu peux quand même utiliser OfType qui permet de récupérer toutes les instances de ce type parmis la collection et donc c'est déjà casté

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    CType
    même si fonctionnellement on aura le même effet qu'avec DirectCast CType n'est pas la même chose, il est capable de convertir dans certains cas
    DirectCast ne peut que caster et il est donc plus performant que CType pour du cast explicite (même si c'est de peu)

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci les gars vous êtes super forts! Je testerai tout ça demain et je vous dirait ce qu’il en est ☺️ Merci à vous bonne soirée

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Je viens de tester.

    Et effectivement, il semble que seule l'utilisation de directcast fonctionne... En effet, en utilisant ctype, il ne se passe rien (alors oui je rentre bien dans ma boucle, les instructions s'effectuent, on sort bien de la boucle etc, mais l'application des couleurs ne s'effectue pas...

    D'autre part, j'ai modifié la boucle car mes boutons sont sur un panel (lui même dans mon Form1 justement)... Je ne savais pas que la boucle n'irait chercher que les controls directement à la "racine" de la form1, autrement dit, pas ceux qui sont dans les panels... Du coup évidement j'ai du remplacer "Windows.Forms.Button" par "Windows.Form1.Panel1.Button"........ C'est pas mal mais dans certaines situation ce serait bien que TOUS les boutons (tous panels et hors panels confondus soient pris en compte )

    En gros littéralement parlant, pour moi ce serait logique que quand j'écris "Tu cherches chaque controls du Form1", que la macro aille voir partout et tous les controls lol

    D'ailleurs je ne saisi toujours pas pourquoi on est obligé de d'abord mettre "ctrl as control" puis ensuite de convertir ctrl en button alors qu'il serait plus "logique" de mettre directement "crt as button" directement.... Mais évidement j'avais testé ça et ça me mettait une erreur......

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    ce qui peut paraitre logique pour quelqu'un ne l'est peut etre pas pour un autre, chacun ses cas de développement (et un débutant a souvent une logique incomplète ^^)
    avec la méthode qui ne retourne que ce qu'il y a sur le niveau d'arborescence rien ne t'empêche de créer une méthode recursive qui retournera tous les niveaux
    alors qu'avec une méthode qui retourne tout,
    si quelqu'un ne veut que ce qu'il y a sur le niveau il ne pourrait pas
    donc non il n'y a pas de doute microsoft a bien fait de faire comme ca

    pour info tu peux créer une méthode d'extension pour avoir la liste en récursif, et la rendre disponible sur la classe control (form hérite de control)
    après tu pourrais écrire for each ctrl in telleForm.AllControls




    pour ctrl as control c'est que form.Controls retourne une collection de control
    si tu fais form.Controls.OfType(of button) alors tu peux marquer as button car ceci retourne une liste de button

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci pour tes conseils Pol63

    J'utilise VBA d'habitude; qui est beaucoup plus simple à utiliser (à mon sens) que VB (car moins de possibilités je suppose).
    Mais du coup en VBA j'ai jamais utilisé de fonctions récursives. J'ai vu qu'on peut s'en servir pour parcourir des dossiers mais j'ai toujours utilisé une simple boucle pour cela (avec un Dir() "dedans tout simplement").

    Pour le sujet qui nous intéresse ici, utiliser une méthode d'extension, ça a l'air super mais très loin de mon niveau de compréhension pour le moment... je suis loin d'avoir ton niveau hahah. Merci en tout cas pour tout ça

    Merci à tous pour votre contribution

  9. #9
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour à tous,

    Juste pour faire simple et répondre à la question de départ (si c'est toujours nécessaire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            For Each TB As Object In Me.Controls    ' Pour chaque TB, qui est un objet contenu dans la collection des Controls
                If TB.GetType.Name = "Button" Then   ' du Form actif ui-même (Me), s’il est de type Button, 
                    ListBox1.Items.Add(TB.Name)     ' alors écrire le nom dans ListBox1
                End If                      
            Next

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    gettype.name n'est pas du tout une bonne idée
    ca perd l'info d'héritage
    fullname ca aurait pu être mieux car ca permet déviter de confondre avec une classe du même nom dans un autre namespace mais en fait même pas car en cas de renommage de la classe ca ne fonctionne plus
    certes dans l'exemple button ne posera de problème, mais il faut penser plus global qu'un simple exemple

Discussions similaires

  1. action en boucle sur bouton + initialiser l'appli ?
    Par Lorenzo77 dans le forum Delphi
    Réponses: 7
    Dernier message: 17/05/2006, 18h45
  2. Boucle sur des boutons radios
    Par jmarey dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/05/2006, 11h03
  3. [FLASH MX] Animation sur bouton en boucle
    Par mascagne dans le forum Flash
    Réponses: 3
    Dernier message: 04/03/2006, 10h36
  4. [FLASH 8] boucle fonction sur bouton
    Par bractar dans le forum Flash
    Réponses: 2
    Dernier message: 31/01/2006, 18h34
  5. [MFC] Boucle sur un bouton
    Par karl3i dans le forum MFC
    Réponses: 6
    Dernier message: 17/02/2004, 11h37

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