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 :

Propriété modifiée depuis ControlDesigner ne persiste pas


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Points : 166
    Points
    166
    Par défaut Propriété modifiée depuis ControlDesigner ne persiste pas
    Bonsoir (bonne nuit même)

    1. J'ai un controle (vraiment stupide pour tester) directement hérité d'un label, mais avec un ControlDesigner custom.
    2. J'ai ajouté une instance de ce control à un form;
    3. Quand je change une propriété du control pendant le DesignTime depuis le context menu "smart tag", la propriété est changée (graphiquement & dans les smart tags & dans le panneau "Properties"), mais le changement n'est pas visible en runtime.

    Note:
    - Après le runtime, mon label a bien toujours la couleur que je lui avai donné (comme s'il y avait une couleur DesignTime et une autre couleur RunTime quelque part)
    - Si entre la modification de la propriété et l'exécution (RunTime), je déplace le label sur le form, le runtime affiche la bonne valeur
    - Si je change la même propriété depuis le panneau "Properties", le runtime affiche la bonne valeur

    Il doit me manquer un refresh/update/...
    une idée?

    Zebrette.

    Le "Custom label:"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Designer(GetType(PTDesigner))> _
    Public Class PersistanceTest
        Inherits Label
    End Class
    Son Designer est défini comme suit:
    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
     
    Public Class PTDesigner
        Inherits System.Windows.Forms.Design.ControlDesigner
        Private _ActionLists As DesignerActionListCollection
        'Construction de la liste d'action custom
        Public Overrides ReadOnly Property ActionLists() As System.ComponentModel.Design.DesignerActionListCollection
            Get
                If _ActionLists Is Nothing Then
                    _ActionLists = New DesignerActionListCollection()
                    _ActionLists.Add(New PTActionList(Me.Control))
                End If
                Return _ActionLists
            End Get
        End Property
    End Class
    l'action list (avec une seule propriétés changeable)
    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
     
    Friend Class PTActionList
        Inherits DesignerActionList
        Private PT As PersistanceTest
        Private designerActionSvc As DesignerActionUIService
        'Constructeur
        Public Sub New(ByVal component As IComponent)
            MyBase.New(component)
            PT = DirectCast(component, PersistanceTest)
        End Sub
        'Propriétés changeable depuis le context menu "smart tag" pendant le DesignTime
        Public Property C As Color
            Get
                Return PT.ForeColor
            End Get
            Set(ByVal value As Color)
                PT.ForeColor = value
            End Set
        End Property
    End Class

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Points : 166
    Points
    166
    Par défaut
    Comme ca ca marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        Public Property C As Color
            Get
                Return PT.ForeColor
            End Get
            Set(ByVal value As Color)
                Dim p As PropertyDescriptor = TypeDescriptor.GetProperties(PT, False)("ForeColor")
                p.SetValue(PT, value)
                'PT.ForeColor = value
            End Set
        End Property
    Encore une fois après 5h de recherche, je poste sur le forum... et je trouve dans les 5 min. voir ici §IV-B

    Mais j'ai pas trop compris pourquoi...

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour zebrette.
    Il me semble qu'il manque des choses pour le runtine.

    1/- un "wrapper" de la prop reelle C (le forecolor ) doit etre defini dans ton class label PT avec le meme nom ou un nom different peu importe.
    Car 2 codes sont generes par designer.vb :
    -un code pour serializer la prop afin de la retrouver à la prochaine session de designer.vb
    -un code genere par le designer( quand tu espionne le fichier designer.vb).
    Ce code ajoute le control droppe et le sette.Celui est destine au runtime.

    S'il n'y a pas le "wrapper" de prop reelle ce code n'est pas seriliaze et les props settes sont perdues au runtime.


    2/- pour modifier la prop "wrapper" il faut passer par TypeDescriptor car au runtime on utilise la reflexion.....
    ton code modifie :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    Imports System.ComponentModel.Design
    Imports System.Windows.Forms.Design
    Imports System.ComponentModel
     
    <Designer(GetType(PTDesigner))> _
    Public Class PersistanceTest
        Inherits Label
        'prop wrapper reelle que tu cherches à setter
        Public Property C() As Color
            Get
                Return Me.ForeColor
            End Get
            Set(ByVal value As Color)
                Me.ForeColor = value
                'rafraichit ton controle
                Invalidate()
            End Set
        End Property
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
     
            'pour rafraichir
            Me.ResizeRedraw = True
        End Sub
    End Class
    Public Class PTDesigner
        Inherits ControlDesigner
        Private _ActionLists As DesignerActionListCollection
        'Construction de la liste d'action custom
        Public Overrides ReadOnly Property ActionLists() As System.ComponentModel.Design.DesignerActionListCollection
            Get
                If _ActionLists Is Nothing Then
                    _ActionLists = New DesignerActionListCollection()
                    _ActionLists.Add(New PTActionList(Me.Control))
                End If
                Return _ActionLists
            End Get
        End Property
    End Class
    Friend Class PTActionList
        Inherits DesignerActionList
        Private PT As PersistanceTest
        Private designerActionSvc As DesignerActionUIService
        'Constructeur
        Public Sub New(ByVal component As IComponent)
            MyBase.New(component)
            PT = DirectCast(component, PersistanceTest)
        End Sub
        ' le TypeDescriptor pour le runtime  
        ' A helper method to retrieve control properties.
        ' GetProperties ensures undo and menu updates to work properly. 
        Private Function GetPropertyByName(ByVal propName As String) As PropertyDescriptor
            Dim prop As PropertyDescriptor
            prop = TypeDescriptor.GetProperties(PT)(propName)
     
            If Nothing Is prop Then
                Throw New ArgumentException("Matching property not found.", propName)
            Else
                Return prop
            End If
        End Function
        'Propriétés changeable depuis le context menu "smart tag" pendant le DesignTime
        Public Property C() As Color
            Get
                Return PT.ForeColor
            End Get
            Set(ByVal value As Color)
                'on sette en passant par TypeDescriptor 
                GetPropertyByName("C").SetValue(PT, value)
            End Set
        End Property
    End Class
    Il est 4:59 gmt+1....
    Je travaille parfois de nuit car comme on dit la nuit porte conseil......
    Alors bon reveil..........................

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Points : 166
    Points
    166
    Par défaut
    Salut Mab'

    Merci pour ces explications (même si je ne suis pas sur d'en avoir perçu l'essence profonde) ca me permet de m'assurer que ma "solution" n'était pas un peu merdique.

    Pour ce qui est de la persistance des changements DesignTime -> RunTime, il semble que le wrapper ne soit pas nécessaire; mais pour la serialization peut être?

    Concernant le constructeur que tu as ajouté au Lablel: si je ne met rien entre InitializeComponent() et le ResizeRedraw, je n'ai pas besoin de constructeur, c'est fait par défaut, non?

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

Discussions similaires

  1. Trouver les fichiers modifiés depuis une date/heure précise
    Par sinok dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 18/07/2006, 17h56
  2. supprimer fichiers non modifiés depuis X jours
    Par tyrax dans le forum Langage
    Réponses: 2
    Dernier message: 17/05/2006, 18h10
  3. Les liens depuis Thunderbird ne marchent pas
    Par Cazaux-Moutou-Philippe dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 20/03/2006, 22h27
  4. Réponses: 2
    Dernier message: 08/03/2006, 22h06
  5. Acceder au serveur mysql depuis le local mais pas internet
    Par Homegrown dans le forum Installation
    Réponses: 9
    Dernier message: 25/11/2005, 23h35

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