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 :

[VS2005] Probleme avec InitializeComponent


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Par défaut [VS2005] Probleme avec InitializeComponent
    Bonjour,

    Lorsqu'on crée son propre UserControl, et qu'on l'ajoute à un formulaire, Visual Studio 2005, remplie automatiquement sa methode InitializeComponent, on définissant les propriétés du Usercontrol. Ce qui cause des problèmes si le UserControls à des valeurs par défaut.

    Par exemple : Dans le UserControl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class MyUserControl
     
        Private _MyProperty As String = "0.000000"
        Public Property MyProperty() As String
            Get
                Return Me._MyProperty
            End Get
            Set(value As String)
                Me._MyProperty = value
            End Set
        End Property
     
    End Class
    Dans le formulaire qui contient mon UserControl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Class Form1
     
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent
     
        End Sub
     
    End Class
    Dans le fichier form1.Designer.vb
    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
        . . .
     
        'REMARQUE*: la procédure suivante est requise par le Concepteur Windows Form
        'Elle peut être modifiée à l'aide du Concepteur Windows Form.  
        'Ne la modifiez pas à l'aide de l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
     
            . . .
     
            '
            'MyUserControl1
            '
            Me.MyUserControl1.Dock = System.Windows.Forms.DockStyle.Fill
            Me.MyUserControl1.MyProperty = "0.000000"
            Me.MyUserControl1.Location = New System.Drawing.Point(0, 18)
            Me.MyUserControl1.Name = "MyUserControl1"
            Me.MyUserControl1.Size = New System.Drawing.Size(304, 123)
            Me.MyUserControl1.TabIndex = 0
     
            . . .
     
        End Sub
    Comment faire en sorte (certainement un attribut sur la propriété MyUserControl.MyProperty) que VS2005 ne génère pas la ligne d'initialisation de la propriété dans InitializeComponent ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.MyUserControl1.MyProperty = "0.000000"

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    un attribut permet de spécifier à vs de ne pas enregistrer (sérialiser pour etre exact) une propriété

    <system.componentmodel.designerserializationvisibility(hidden)>

    ou un truc dans le genre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Le designer ne génère pas de sérialisation si la valeur de ta propriété est la valeur par défaut.
    Il suffit simplement de lui indiquer quelle est la valeur par défaut

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        Private _MyProperty As String = "0.000000"
        <DefaultValue("0.000000")> _
        Public Property MyProperty() As String
            Get
                Return Me._MyProperty
            End Get
            Set(value As String)
                Me._MyProperty = value
            End Set
        End Property

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Par défaut
    Merci pour vos réponses, l'attribut system.componentmodel.designerserializationvisibilityhidden semble fonctionner. Merci Kelpan, j'avais cru constater ce phenomène, mais certaine propriété corresponde à des classes pour lesquelle on ne peut pas définir de valeur par défaut.

  5. #5
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Citation Envoyé par belfaigore Voir le message
    Merci Kelpan, j'avais cru constater ce phenomène, mais certaine propriété corresponde à des classes pour lesquelle on ne peut pas définir de valeur par défaut.
    Pas tout compris ?

    Il est tout de même important de savoir que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <system.componentmodel.designerserializationvisibilityhidden(hidden)>_
    ne te permet pas de définir une valeur persistante dans le code d'initialisation pour une valeur différente de celle par défaut (exemple si tu définis une valeur autre que celle par défaut au moment du design)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Par défaut
    Citation Envoyé par Kelpan Voir le message
    Pas tout compris ?
    Si tu crées deux class MaClass1 et MaClass2 et que dans MaClass1 tu as une propriété de type MaClass2, tu ne peux pas lui affecter de valeur par défaut ; ou le designer, au lieu de mettre la valeur par défaut mettra Nothing comme valeur de la propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class MaClass1
     
        'Propriété avec une valeur par défaut, mais non reprise dans un designer de VS2005
        Private _MaClass2 As New MaClass2("Toto")
        Public Property MaClass2 As MaClass2
            Get
                Return Me._MaClass2
            End Get
            Set(value As MaClass2)
                Me._MaClass2 = value
            End Set
        End Property    
     
    End Class
    Citation Envoyé par Kelpan Voir le message
    Il est tout de même important de savoir que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <system.componentmodel.designerserializationvisibilityhidden(hidden)>_
    ne te permet pas de définir une valeur persistante dans le code d'initialisation pour une valeur différente de celle par défaut (exemple si tu définis une valeur autre que celle par défaut au moment du design)
    Existe-il une autre solution ? Comment sont fait les contrôles de la boite à outils ? toutes les propriétés d'un textbox par exemple ne sont pas reprises dans le designer, pourtant on peut malgrès tout les changer, et si celles-ci sont différentes de la valeur par défaut, alors elles sont ajoutées au designer.

  7. #7
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Les propriétes qui apparaissent dans le designer sont des propriétés de type "ValueType" et celles qui référencent des objets qui héritent de Component.

    Quoiqu'il en soit tu ne peux pas affecter une instance de classe à une propriété en mode design...

    Pour info, les propriétés qui apparaitrons dans InitializeComponent sont indiquées en Gras dans la toolbox Propriété.
    Si tu click droit sur une zone, un menu te proprose de réinitialiser la valeur à celle par défaut.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    Citation Envoyé par Kelpan Voir le message
    Quoiqu'il en soit tu ne peux pas affecter une instance de classe à une propriété en mode design...


    à priori si : designerserializationvisibility(content)
    par contre il faut un sub new accessible sans paramètre

    et ca déroule les propriétés de la classe objet ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    à priori si : designerserializationvisibility(content)
    par contre il faut un sub new accessible sans paramètre

    et ca déroule les propriétés de la classe objet ...
    En effet, pour stoker les valeurs d'une classe qui héritent de component, il te faut cet attribut.

    Voici un exemple d'utilisation, si ça peut t'aider...

    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
     
    ' Ecran de base sur lequel je veux faire apparaitre
    ' MyClass1 en mode design
    Public Class EcranBase
        Inherits System.Windows.Forms.Form
     
        ' Instance par défaut
        Private m_clsClass1 As New Class1
     
        ' Seulement en readonly qui garanti la présence de l'instance par défaut
        ' les propriétés de l'instance seront serialisées sur l'écran qui hérite 
        <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
        Public ReadOnly Property MyClass1() As Class1
            Get
                Return m_clsClass1
            End Get
        End Property
    End Class
     
    Public Class Class1
        Inherits Component
     
        Public Enum ItemEnum As Integer
            [Serialise] = 0
            [Non_Serialise] = 1
        End Enum
     
        ' Valeur de la propriété à Non_Serialise par défaut
        Private Int_Property As ItemEnum = ItemEnum.Non_Serialise
     
        ' Sur l'écran qui serialise cette propriété,
        ' la valeur ne sera serialisé que si elle est différente de Non_Serialise
        <DefaultValue(GetType(ItemEnum), "Non_Serialise")> _
        Public Property MyProperty() As ItemEnum
            Get
                Return Int_Property
            End Get
            Set(ByVal Value As ItemEnum)
                Int_Property = Value
            End Set
        End Property
    End Class
    Pour en revenir sur l'instance affecter aux propriétés, je me suis mal exprimé. On travaille effectivement avec des instances en mode design. Mais, je vais peut être titiller sur les mots, ce n'est pas une instance qui est stockée, mais seulement les valeurs des propriétés qui te permettent de recréer cette instance.

  10. #10
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    J'allais oublier ...

    Pour les propriétés un peu plus complexes tel que BackColor, Font , etc ...
    Il y a des méthodes qui existent pour définir s'il doivent être serialisées ou non.

    => Définit si le propriété doit être sérialisée
    ShouldSerialize[MyProperty]

    => Réinitialise la valeur par défaut
    Reset[MyProperty]

    Je pense que tu peux trouver des infos plus précis sur MSDN.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Par défaut
    je vous remercie pour vos réponses, la solution du designerserializationvisibility(content), semble me convenir.

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

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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