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 :

[VB.NET] Enregistrement des propriétés dans l'éditeur.


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut [VB.NET] Enregistrement des propriétés dans l'éditeur.
    Bonjour,

    Ce post est la suite de http://www.developpez.net/forums/viewtopic.php?t=442314.

    Mon problème est le suivant. J'ai réussi à faire une page de propriété personnalisée à partir de la classe UITypeEditor. Mais comment faire pour ces propriétés s'enregistrent dans le code (comme le reste des propriétés). Pour l'instance, mes propriétés sont conservées jusqu'à ce que je ferme l'éditeur. Mais lorsque je le réouvre, plus rien (normal puisque rien enregistré en code ....).

    Quelqu'un a t il une idée à ce sujet ?

    Merci d'avance.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Oui j'ai une idée

    Postes le code de EditValue()

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Voici le code la méthode.

    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
    Public Overloads Overrides Function EditValue(ByVal context As ITypeDescriptorContext, ByVal provider As IServiceProvider, ByVal value As Object) As Object
            Dim srvProp As IWindowsFormsEditorService
            Dim pageProp As FormatDonneeForm
            Dim propriete As FormatDonnee
     
            ' Récupère la valeur de la propriété.
            propriete = DirectCast(value, FormatDonnee)
     
            ' Récupère le service pour définir la propriété.
            srvProp = DirectCast(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService)
            If Not srvProp Is Nothing Then
     
                ' Ouvre la fenêtre de propriété.
                pageProp = New FormatDonneeForm(propriete)
                If srvProp.ShowDialog(pageProp) = DialogResult.OK Then
                    propriete = pageProp.Propriete
                End If
     
                ' Détruit le formulaire de propriété.
                pageProp.Dispose()
            End If
     
            ' Retourne le résultat.
            Return propriete
        End Function

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Que dit le debugger de la valeur de propriete au moment du return ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Je ne peux pas utiliser le debugger sur une page de propriétés ....

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    ah oui.
    Alors insère des lignes Debug.WriteLine(propriete) pour tracer la valeur dans la fenêtre output.

    PS : bonne nuit

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Ca ne fait rien. Que cherches tu exactement ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Personne n'a d'idée à ce sujet. Je reformule en essayant de mieux m'expliquer.

    Comment faire pour que les propriétés paramétrées par un éditeur personnalisé (UITypeEditor) soit inscrit dans le code en mode Design ?

    J'ai remarqué que si ma propriété est un type simple (String, Integer, ...) il le fait automatiquement mais comment le faire lorsque le type est complexe (classe personnalisée), ca ne marche plus.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    J'ai avancé dans mes recherches .... J'ai trouvé une classe permettant de faire ce que je veux (CodeDomSerializer).

    Le problème est que je ne la trouve pas dans System.ComponentModel.Design.Serialization. Quelqu'un serait-il pouquoi ?

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Je n'avais pas compris ton problème.
    Je pensais que la valeur de propriété n'était pas prise en compte à la sortie de l'éditeur.

    Pour créer du code, c'est autre chose.
    C'est possible mais ça me semble extremement compliqué.
    Si on reviens un peu en arrière, il est toujours préférable d'exposer une collection. C'est la méthode standard et Visual Studio est conçu pour ça...

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Voila ou je suis rendu.

    Dans la MSDN, il est dit que pour que le code soit généré il faut créer une instance de type CodeDomSerializer. D'ailleurs, il y a l'exemple d'illustration qui va avec. J'ai donc créer ce code.

    La classe Objet qui représente mon type personnalisé.
    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
    Imports System.ComponentModel
    Imports System.ComponentModel.Design.Serialization
     
     
    <DesignerSerializerAttribute(GetType(ObjetSerializer), GetType(CodeDomSerializer))> _
    Public Class Objet
     
        Private _parametre1 As String
     
        Public Property Parametre1() As String
            Get
                Return _parametre1
            End Get
            Set(ByVal Value As String)
                _parametre1 = Value
            End Set
        End Property
     
        Public Sub New(ByVal param1 As String)
            _parametre1 = param1
        End Sub
     
        Public Overrides Function toString() As String
            Return _parametre1
        End Function
     
    End Class
    Et le code de mon sérializeur ... (copie de l'exemple de la MSDN).
    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
    Imports System.ComponentModel.Design.Serialization
    Imports System.CodeDom
     
     
    Public Class ObjetSerializer
        Inherits CodeDomSerializer
     
        Public Overrides Function Deserialize(ByVal manager As IDesignerSerializationManager, ByVal codeObject As Object) As Object
            Dim baseClassSerializer As CodeDomSerializer
     
            baseClassSerializer = CType(manager.GetSerializer(GetType(Objet).BaseType, GetType(CodeDomSerializer)), CodeDomSerializer)
     
            Return baseClassSerializer.Deserialize(manager, codeObject)
        End Function
     
        Public Overrides Function Serialize(ByVal manager As IDesignerSerializationManager, ByVal value As Object) As Object
            Dim baseClassSerializer As CodeDomSerializer
            Dim commentaire As CodeCommentStatement
            Dim codeObject As Object
     
            baseClassSerializer = CType(manager.GetSerializer(GetType(Objet).BaseType, GetType(CodeDomSerializer)), CodeDomSerializer)
            codeObject = baseClassSerializer.Serialize(manager, value)
     
            Return codeObject
        End Function
     
    End Class
    Mais je ne comprend pas, ca ne fait rien de plus .......

    Une idée peut-être ???? :

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    J'ai trouvé la solution à mon problème.

    Si ca interesse quelqu'un je peux diffuser les grandes idées.

  13. #13
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Bien sûr que cela interressera la communauté .Net de dvp
    Envoies

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Je prépare un petit expemple bien propre et je le poste dès qu'il est prêt ...

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Voici le code promis .... Il est divisé en plusieurs classes.

    Cette première classe est l'objet dit complexe (pas de base quoi) qui va typer la propriété de notre controle test.
    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
    Option Explicit On 
    Option Strict On
     
     
    Public Class Objet
     
        Private _entier As Integer
        Private _chaine As String
     
        Public Property Entier() As Integer
            Get
                Return _entier
            End Get
            Set(ByVal Value As Integer)
                _entier = Value
            End Set
        End Property
     
        Public Property Chaine() As String
            Get
                Return _chaine
            End Get
            Set(ByVal Value As String)
                _chaine = Value
            End Set
        End Property
     
        Public Sub New(ByVal entier As Integer, ByVal chaine As String)
            _entier = entier
            _chaine = chaine
        End Sub
     
    End Class
    La seconde classe est la classe d'édition de la propriété de notre contrôle test. C'est elle qui va déterminer le mode d'édition de la propriété dans le Designer de visual studio.
    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
    Option Explicit On 
    Option Strict On
     
     
    Imports System.Windows.Forms.Design
    Imports System.ComponentModel
    Imports System.Drawing.Design
     
     
    Public Class ObjetEditor
        Inherits UITypeEditor
     
        Public Overloads Overrides Function EditValue(ByVal context As ITypeDescriptorContext, ByVal provider As IServiceProvider, ByVal value As Object) As Object
            Dim srvProp As IWindowsFormsEditorService
            Dim pageProp As ObjetForm
            Dim propriete As Objet
     
            ' Récupère la valeur de la propriété.
            propriete = DirectCast(value, Objet)
     
            ' Récupère le service pour définir la propriété.
            srvProp = DirectCast(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService)
            If Not srvProp Is Nothing Then
     
                ' Ouvre la fenêtre de propriété.
                pageProp = New ObjetForm(propriete)
                If srvProp.ShowDialog(pageProp) = DialogResult.OK Then
                    propriete = pageProp.Propriete
                End If
     
                ' Détruit le formulaire de propriété.
                pageProp.Dispose()
            End If
     
            ' Retourne le résultat.
            Return propriete
        End Function
     
        Public Overloads Overrides Function GetEditStyle(ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle
            Return UITypeEditorEditStyle.Modal
        End Function
     
    End Class
    Cette classe est le formulaire de définition des propriétés de type Objet.
    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
    Option Explicit On 
    Option Strict On
     
     
    Public Class ObjetForm
        Inherits Form
     
        Private _propriete As Objet
     
        Public ReadOnly Property() As Objet
            Get
                Return _propriete
            End Get
        End Property
     
        Public Sub New(ByVal propriete As Objet)
            MyBase.New()
            _propriete = propriete
        End Sub
     
    End Class
    Cette classe est le code de notre contrôle test.
    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
    Option Explicit On 
    Option Strict On
     
     
    Imports System.ComponentModel.Design.Serialization
    Imports System.ComponentModel
    Imports System.Drawing.Design
     
     
    <RootDesignerSerializerAttribute(GetType(ControleSerializer), GetType(CodeDomSerializer), True), _
    DesignerSerializerAttribute(GetType(ControleSerializer), GetType(CodeDomSerializer))> _
    Public Class Controle
        Inherits UserControl
     
        Private _attribut As Objet
     
        <EditorAttribute(GetType(ObjetEditor), GetType(UITypeEditor))> _
        Public Property Attribut() As Objet
            Get
                Return _attribut
            End Get
            Set(ByVal Value As Objet)
                _attribut = Value
            End Set
        End Property
     
        Public Sub New()
            MyBase.New()
            _attribut = New Objet(0, "")
        End Sub
     
    End Class
    Et enfin, cette classe est la classe de sérialisation de notre contrôle test.
    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
    Option Explicit On 
    Option Strict On
     
     
    Imports System.ComponentModel.Design.Serialization
    Imports System.CodeDom
     
     
    Public Class ControleSerializer
        Inherits CodeDomSerializer
     
        Public Overrides Function Serialize(ByVal manager As IDesignerSerializationManager, ByVal value As Object) As Object
            Dim propriete As CodeFieldReferenceExpression
            Dim lignesCode As CodeStatementCollection
            Dim serialiseur As CodeDomSerializer
            Dim codeObject As Object
     
            ' Récupère le sérialiseur de l'objet.
            serialiseur = CType(manager.GetSerializer(GetType(Controle).BaseType, GetType(CodeDomSerializer)), CodeDomSerializer)
     
            ' Sérialise l'objet de base.
            codeObject = serialiseur.Serialize(manager, value)
     
            ' Crée une collection de lignes de code si besoin.
            If codeObject Is Nothing Then : lignesCode = New CodeStatementCollection
            Else : lignesCode = DirectCast(codeObject, CodeStatementCollection)
            End If
     
            ' Sérialise la propriété 'Attribut.Entier'.
            propriete = New CodeFieldReferenceExpression(New CodeThisReferenceExpression, manager.GetName(value))
            propriete = New CodeFieldReferenceExpression(propriete, "Attribut")
            propriete = New CodeFieldReferenceExpression(propriete, "Entier")
            lignesCode.Add(New CodeAssignStatement(propriete, New CodePrimitiveExpression(DirectCast(value, Controle).Attribut.Entier)))
     
            ' Sérialise la propriété 'Attribut.Chaine'.
            propriete = New CodeFieldReferenceExpression(New CodeThisReferenceExpression, manager.GetName(value))
            propriete = New CodeFieldReferenceExpression(propriete, "Attribut")
            propriete = New CodeFieldReferenceExpression(propriete, "Chaine")
            lignesCode.Add(New CodeAssignStatement(propriete, New CodePrimitiveExpression(DirectCast(value, Controle).Attribut.Chaine)))
     
            ' Retourne le code de l'objet sérialisé.
            Return lignesCode
        End Function
     
        Public Overrides Function Deserialize(ByVal manager As IDesignerSerializationManager, ByVal codeObject As Object) As Object
            Dim serialiseur As CodeDomSerializer
     
            ' Récupère le sérialiseur de l'objet.
            serialiseur = CType(manager.GetSerializer(GetType(Controle).BaseType, GetType(CodeDomSerializer)), CodeDomSerializer)
     
            ' Désérialise l'objet.
            Return serialiseur.Deserialize(manager, codeObject)
        End Function
     
    End Class
    Voila, je vous ai tout dévoilé. Bien sur, si vous avez des questions, n'hésitez pas, je reste à l'écoute ....

  16. #16
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    En tout cas merci de ta contribution

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/09/2007, 11h53
  2. Réponses: 4
    Dernier message: 22/06/2007, 19h02
  3. [VB.NET] Utilisation des sessions dans Session_End ?
    Par San Soussy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/02/2005, 17h40
  4. [VB.NET] Enregistrement des éléments d'une listBox
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 9
    Dernier message: 18/05/2004, 15h48
  5. Comment cacher des propriétés dans un nouvel objet ?
    Par Pedro dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/10/2003, 19h53

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