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

Windows Forms Discussion :

Proprietes inter dependantes dans un usercontrol


Sujet :

Windows Forms

  1. #1
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut Proprietes inter dependantes dans un usercontrol
    Bonjour,

    j'essaye de creer un userControl sous VB2008 Express. Le but du jeu de ce control serait de pouvoir afficher un angle em radians sous plusieurs formats differents (radians, degres, grades, degres/minutes, etc...).

    J'ai donc une propriete ValRad pour la valeur en radian a afficher et une propriete Caption pour la valeur a afficher en focntion du format choisi.

    Quand je teste mon controle, si je modifie la propriete ValRad, la prorpiete Caption n'est pas mise a jour tant que je ne clique pas sur le champ "Caption" dans la liste des proprietes et reciproquement si je modifie la valeur de la propriete "Caption", la propriete "ValRad" n'est mise a jour qu'en cliquant dessus.

    Voici le principe du code que j'ai pour le moment :

    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
    
    Imports System.Math
    PublicClass UserControl1
    Private ValeurRadian AsDouble
    PublicProperty ValRad() AsDouble
    Get
    Return ValeurRadian
    EndGet
    Set(ByVal value AsDouble)
    ValeurRadian = value
    Caption = (value / PI * 180).ToString
    EndSet
    EndProperty
    Private CaptionDisplayed AsString
    PublicProperty Caption() AsString
    Get
    Return CaptionDisplayed
    EndGet
    Set(ByVal value AsString)
    CaptionDisplayed = value
    TextBox1.Text = value
    ValeurRadian = Val(value) / 180 * PI
    EndSet
    EndProperty
    EndClass
    
    Je suis bien conscient aussi qu'il y a un risque de faire une boucle infinie si je ne mets pas un flag quelquepart, le changement d'une propriete entrainant le changement d'une autre, etc... mais pour proceder pas a pas j'aimerais pour le moment au moins que la deuxieme propriete soit mise a jour au changement de la premiere, je verrai ensuite pour eviter le phenomene de cascade
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  2. #2
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Pour éviter l'effet de cascade, tu n'as qu'à changer le champ derrière la propriété, et non la propriété elle-même

  3. #3
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Mais je veux changer la propriete ! A priori (...) ce n'est pas ca qui m'inquiete le plus, je voudrais d'abord mettre la deuxieme propriete a jour de telle maniere que si l'utilisateur en mode creation, change une propriete, la deuxieme soit elle aussi mise a jour dans la liste des proprietes, hors pour le mmoment je dois cliquer sur l'intitule de la deuxieme propriete pour voir sa valeur mise a jour.
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  4. #4
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Ah ok, je vois le problème... a priori le designer ne voit pas le changement de valeur de la propriété, il faudrait le lui signaler... mais je ne sais pas trop comment

  5. #5
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Je propose de sortir le changement de valeurradian et l'affichage de la property et d'utiliser RefreshProperties(RefreshProperties.All) pour chaque property (déclenche le refresh complet dans le designer) :
    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
     
    Imports System.Math
    Imports System.ComponentModel
    Public Class UserControl1
     
        Private ValeurRadian As Double
     
        <Category("Custom Property"), RefreshProperties(RefreshProperties.All)> _
        Public Property ValRad() As Double
            Get
                Return ValeurRadian
            End Get
            Set(ByVal value As Double)
                ValeurRadian = value
                ChangeCaptionInternal((value / PI * 180).ToString)
            End Set
        End Property
        Private CaptionDisplayed As String
     
        Private Sub ChangeCaptionInternal(ByVal value As String)
            CaptionDisplayed = value
            TextBox1.Text = value
            ValeurRadian = Val(value) / 180 * PI
        End Sub
     
        <Category("Custom Property"), RefreshProperties(RefreshProperties.All)> _
        Public Property Caption() As String
            Get
                Return CaptionDisplayed
            End Get
            Set(ByVal value As String)
                ChangeCaptionInternal(value)
            End Set
        End Property
     
    End Class
    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  6. #6
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Bien vu... je me doutais qu'il devait y avoir un attribut pour ça, mais je le cherchais plutôt dans System.Design que dans System.ComponentModel

  7. #7
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Citation Envoyé par tomlev Voir le message
    je le cherchais plutôt dans System.Design que dans System.ComponentModel
    Ah ben tiens, toi aussi tu t'y perds la dedans ! Ca me rassure !

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  8. #8
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Un grand merci !
    Je viens de tester et effectivement ca semble repondre a mes besoins. J'avoue que je n'avais aucune chance de trouver cette solution par moi meme vu mes connaissances... Je vais essayer de comprendre un peu ce ComponentModel, c'est pas gagne.

    Pour info j'ai juste ajoute un petit test au code fourni par Olsimare pour eviter que la valeur en Radian ne soit modifiee par le changement de caption quand celui ci est provoque par le changement de valeur en radian (oui je sais c'est un peu confus ), ca donne donc ca chez moi :

    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
    
    Imports System.Math
    Imports System.ComponentModel
    PublicClass UserControl1
    Private ChangeFromVal AsBoolean
     
    Private ValeurRadian AsDouble
    <Category("Custom Property"), RefreshProperties(RefreshProperties.All)> _
    PublicProperty ValRad() AsDouble
    Get
      Return ValeurRadian
    EndGet
    Set(ByVal value AsDouble)
      ChangeFromVal = True
      ValeurRadian = value
      ChangeCaptionInternal((value / PI * 180).ToString)
    EndSet
    EndProperty
     
    Private CaptionDisplayed AsString
    <Category("Custom Property"), RefreshProperties(RefreshProperties.All)> _
    PublicProperty Caption() AsString
    Get
      Return CaptionDisplayed
    EndGet
    Set(ByVal value AsString)
      ChangeCaptionInternal(value)
    EndSet
    EndProperty
     
    PrivateSub ChangeCaptionInternal(ByVal value AsString)
    CaptionDisplayed = value
    TextBox1.Text = value
    If ChangeFromVal = FalseThen
      ValeurRadian = Val(value) / 180 * PI
    Else
      ChangeFromVal = False
    EndIf
    EndSub
     
    EndClass
    
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  9. #9
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.



    Mais j'aurais plutôt fait une sub ChangeValRadInternal car perso, je trouve que ce traîner des booléens inter-propriété/sub, ça perd vachement en lisibilité.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/02/2007, 12h04
  2. Problème d'initialisation d'un booléen dans un UserControl
    Par -Jolan- dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/02/2007, 21h58
  3. [C#] SqlConnection dans un UserControl
    Par rohstev dans le forum ASP.NET
    Réponses: 1
    Dernier message: 08/09/2006, 13h47
  4. Réponses: 5
    Dernier message: 10/07/2006, 08h23
  5. [VB.Net] Comment utiliser CSS dans un UserControl ?
    Par GEFIRO1 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 27/04/2006, 09h27

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