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 :

Appeler une propriété de la classe Control [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut Appeler une propriété de la classe Control
    Bonjour,

    Comment fait-on pour appeler une propriété commune à des contrôles lorsque cette propriété n'est pas membre de la classe Control ?

    Exemple ci-dessous : j'ai un form contenant des contrôles de nature différente comportant tous une propriété BorderWidth (par construction).
    Je ne peux pas boucler dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            For Each c As Control In Me.Controls
                c.borderwidth = 1  ' ne marche pas : borderwidth n'est pas membre de la classe control
            Next
        End Sub
    Pourtant si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            For Each c As Control In Me.Controls
                         MessageBox.Show(c.Name)
            Next
        End Sub
    je vois bien s'afficher tous mes contrôles.

    Quelle est la parade ? Existe-t-il une instruction à rajouter dans les classes définissant mes contrôles pour indiquer que ces classes doivent "bénéficier" des outils de la classe control ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    la méthode simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select case true
      case typeof c is TelControlAyantBorderwidth
        directcast(c,TelControlAyantBorderwidth).BorderWidth = valeur
      case typeof c is AutreTypeControlAyantBorderwidth
        directcast(c,AutreTypeControlAyantBorderwidth).BorderWidth = valeur
    end select
    la méthode plus évoluée, pas forcément plus performante mais qui a le mérite de ne pas avoir une ligne de code par type de controle possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim prop = c.gettype.getproperty("BorderWidth", reflection.public or reflection.instance)
    if prop is nothing then continue for 'cette instance de c n'a pas de propriété borderwidth
    prop.setvalue(c,valeur, nothing)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    comportant tous une propriété BorderWidth (par construction)
    Qu'est-ce que tu entends par "par construction" ? Tu as créé tes propres classes de contrôle ?

    Si c'est ça, crée une interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Interface IControlWithBorderWidth
        Property BorderWidth As Integer
    End Interface
    (avec éventuellement les autres propriétés dont tu as besoin)

    Implémente cette interface dans les contrôles que tu as créés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class MyButton
        Inherits BUtton
        Implements IControlWithBorderWidth
     
        Public Property BorderWidth As Integer Implements IControlWithBorderWidth.BorderWidth
     
    End Class
    Et dans ta boucle, teste si le contrôle implémente l'interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            For Each c As Control In Me.Controls
                Dim bw = TryCast(c, IControlWithBorderWidth)
                If bw IsNot Nothing Then
                    bw.borderwidth = 1  ' ne marche pas : borderwidth n'est pas membre de la classe control
                End If
            Next
        End Sub

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Je suis bien dans le cas soulevé par Tomlev. Je note les 2 solutions. A ce stade, elles me semblent à peu près similaires en terme de rendu, sauf si vous avez une objection.
    Je pensais qu'il y avait plus simple (dans le sens où, tout de même, un textbox ou un combobox sont bien des contrôles au sens banal du terme), mais bon...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    si la classe control n'a pas de propriété borderwidth mais seulement certains controles alors dire que ce sont des controles ne signifie rien et ne sert à rien
    control est une classe comme une autre, les classes dérivées ont des propriétés spécifiques

    après l'interface si c'est possible c'est mieux, mais s'il y a dans le lots des controles que tu n'as pas créé alors ca ne convient pas
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    OK, pigé.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/04/2007, 18h07
  2. [VB.Net] Comment accéder à une propriété de sous-classes ?
    Par druidev dans le forum Windows Forms
    Réponses: 13
    Dernier message: 05/09/2006, 15h14
  3. appel à une fonction dans la classe Action
    Par imane_bennouna dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/08/2006, 11h09
  4. Réponses: 7
    Dernier message: 06/04/2006, 18h17
  5. [C#]liste de choix dans une propriété d'un user control
    Par LeDeveloppeurDotNet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/10/2005, 12h41

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