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][VS 2005] user control: propriétés éditables via designer et initialisation..


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut [VB.NET][VS 2005] user control: propriétés éditables via designer et initialisation..
    Bonjour à tous! Je suis en train de créer un controle utilisateur basé sur une listview. J'ai définit des propriétés modifiables via le designer, me permettant de customiser mon composant, et c'est à ce moment là que çà se corse...

    Lorsque je lance ma form, les modifications apportées au moment du design à ces propriétés ne s'appliquent pas toujours:
    -certaines modifications sont prises en compte (propriétés définies comme type de base .net: integer, string, etc...)
    -pour les propriétés plus avancées (avec des types tel que ColumnCollection), rien ne se passe!

    En effet, dans le fichier form.designer.vb, le designer a bien généré les lignes pour mes propriétés "basiques", mais pas pour les autres...
    Pourquoi et comment faire?


  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Salut

    Et oui, le PropertyGrid est un composant balaise, mais pas magique!

    Il te faut specifier quel editeur utiliser pour afficher le contenu de la collection, cela se fait par les attributs des proprietes: Editor (il en exite d'autres: Category, DefaultValue, Description, DesingerSerialisationVsibility... qui te permetteront de parfaire ton usercontrol)

    Le theorique:
    http://msdn2.microsoft.com/en-us/lib...zc(VS.80).aspx

    La pratique:
    http://www.codeproject.com/csharp/dz...tioneditor.asp

    L'avantage c'est que tu as le moyen de creer ton propre editeur de collection.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Merci Piotrek d'avoir éclairé mon esprit... Hélàs je n'ai toujours pas avancé. En effet, la documentation MSDN sur les attributs de propriétés est vraiment minable... Alors parfaire mon contrôle utilisateur me fais désormais plus perdre de temps qu'autre chose. Bien entendu, Microsoft joue le compte goutte et l'intègrera dans la prochaine version de VS (9).

    J'ai essayé de mettre ma propriété contenant la ColumnHeaderCollection avec comme attribut de DesignerSerializationVisibility à Content (et aussi visible), le code est généré... ou presque: si je crée une nouvelle colonne via le designer, celle-ci sera enregistrée!
    En revanche, si je rajoute une colonne via le code d'une de mes propriétés (ex: Je met une propriété utilisateur nommé NbColumns à +1, donc le code du set de ma propriété va rajouter un ColumnHeader), alors rien ne se passe...

    La persistance (création du code du fichier MaForm.designer.vb) ne se fait donc seulement si les colonnes ont été crées via l'editor... N'y a t'il pas possibilité d'émuler celà?
    Existe-t'il une autre solution (Instanciation via méthode particulière...)?

  4. #4
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Si j'ai bien compris: tu passe par le code et le propertygrid ne represente pas ces changement?

    Il doit surement y avoir un moyen de forcer le rafraichissement d'une propriete pour le propertygrid...

    Mets un peu de code significatif pour que je vois

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Si je peux me permettre, peut-être que ce tutoriel te sera utile:

    http://morpheus.developpez.com/usercontrols/

    A+

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Morpheus
    Si je peux me permettre, peut-être que ce tutoriel te sera utile:

    http://morpheus.developpez.com/usercontrols/

    A+
    Tu peux te permettre Je l'avais déjà regardé et ainsi compris l'importance de l'attribut DesignerSerializationVisibility pour les collections!

    Citation Envoyé par Piotrek
    Si j'ai bien compris: tu passe par le code et le propertygrid ne represente pas ces changement?
    Dans ce cas précis, j'utilise 2 propriétés:
    -une appelée nbLabels, contenant le nombre de colonnes de mon contrôle, héritant d'une ListView (si, il y a bien une utilité ).
    -une propriété Columns, qui est un shadow de la propriété Columns de la ListView de base.

    Si je crée une colonne via la propriété Columns dans le designer, celle-ci persiste et peut être modifiée (donc nickel!)... voici le code de cette propriété, on ne peux plus basique:

    <Category("Configuration"), Browsable(True), Description("Nombre d'attributs à enregistrer pour chaque item"), _ DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public Shadows Property Columns() As ColumnHeaderCollection
    Get
    If f_userColumnsCollection Is Nothing Then f_userColumnsCollection = New ColumnHeaderCollection(Me)
    Return f_userColumnsCollection
    End Get
    Set(ByVal value As ColumnHeaderCollection)
    If Not value.Equals(f_userColumnsCollection) Then
    f_userColumnsCollection = New ColumnHeaderCollection(Me)
    f_userColumnsCollection = value
    Invalidate()
    End If
    End Set
    End Property
    Par contre, si je modifie ma propriété nbLabels (que j'avais appelé NbColumns dans mon dernier post) pour passer de 0 à 1 via le designer toujours, alors une colonne est bien créée et persiste, mais si je modifie celle-ci, alors les modifications ne persistent pas au moment de l'execution.
    Pourtant, ces modifications sont réalisées via la propriété Columns (et toujours via le designer), qui autrement persiste bien ces modifications...

    Voici le code de cette propriété:

    <Category("configuration"), Browsable(True), Description("nombre de champs à afficher pour chaque item"), DefaultValue(0)> _
    Public Property nblabels() As Integer
    Get
    Return f_nblabels
    End Get
    Set(ByVal value As Integer)
    Dim i, initnb As Integer
    If f_nblabels > value And value >= 0 Then 'si l'on doit supprimer des colonnes
    Dim idx As Integer = Me.columns.count - 1 'on récupère l'index de la dernière colonne
    initnb = f_nblabels - value 'on compte le nombre de colonnes à supprimer

    While (initnb > 0 And Me.columns.count > 0) 'si le nombre de colonnes est supérieur à 0
    Me.columns.removeat(idx) 'supprimer la colonne
    initnb -= 1 'nombre de colonnes restantes
    idx -= 1 'on prend l'index de la colonne précédente
    End While
    f_nblabels = value 'on modifie la valeur de la propriété même
    Me.invalidate()
    ElseIf f_nblabels < value And value >= 0 Then 'si l'on doit ajouter des colonnes
    initnb = value - f_nblabels 'on compte le nombre de colonnes à ajouter
    For i = 1 To initnb 'pour chaque colonne à ajouter
    columns.add(New columnheader()) 'ajout de la colonne
    Next
    f_nblabels = value 'on modifie la valeur de la propriété même
    Me.invalidate()
    End If
    End Set
    End Property
    Mon problème viendrait donc de l'instantiation de mes nouvelles colonnes dans ce dernier code: columns.add(New columnheader())...

    Une idée

  7. #7
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    La column a aussi ses propres attributs pour pouvoir etre editee dans le PropertyGrid

    Mon conseil: regarde ce que tu aurais pu oublier en utilisant Reflector sur l'interaction entre la listview et sa column

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    J'ai déjà abordé le problème dans un autre message.

    http://www.developpez.net/forums/showthread.php?t=89101

    En fait, tous les types de base sont automatiquement transformé en code dans le concepteur .... mais il faut créer ton propre sérializer pour les propriétés plus complexe.

    Ce code va t'aider à générer un code qui servira d'effet mémoire des valeurs de tes propriétés.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    ARRRRRGGGG Visual Studio n'en fait qu'à sa tête. Allez hop, on continue sur la lignée... Avant le problème était que les propriétés que je voulais faire persister étaient des types complexes... d'où le besoin de créer son propre sérialiseur, ou éditeur.
    Perso, je préfère encore me taper de l'assembleur que de rentrer dans ce gouffre à b... bug

    Bonne nouvelle! Il chie totalement sur le type de base le plus pourri: boolean

    MMMmmmm.... cette fois j'ai donc une propriété de type boolean. Si je ne met pas de valeur par défaut, ok, çà persiste. J'ajoute l'attribut DefaultValue(False) et hop! Plus de persistance! Une idée, mis à part recompiler Visual Studio ??????????????????????

    [MODE TROLL ON]

    Franchement, j'ai jamais vu un langage de programmation aussi "pas stricte" et "pas explicite" . Plus je vois avancer le framework .NET, et plus je me dis qu'il peut aller se faire...

    .NET, un framework?.. Oui, le jour où:
    1. Tous les index commenceront à 0 (mmm les indexOutOfBoundException, voir le non traitement du dernier élément)
    2. Une simple fenêtre ne prendra plus 10 Mo, mais quelques centaines de ko.
    3. Les 10000000000 classes seront regroupées en classes génériques, et auront chacune leur utilité... Mort de rire, .NET contient des classes marquées comme "ne fonctionnant pas" par Grosoft lui-même...
    4. Le designer ne plantera pas en balardant une exception inintéressante, et arrêtera de refonctionner grâce à un simple redémarrage de VS.
    5. Lorsque l'on aura finit de passer 50% de son temps à trouver comment passer outre les difficultés et lacunes du framework, en ayant 30% de son code remplit en workarounds de tout genre...
    6. Utilité d'utiliser un framework avec "machine virtuelle" (CLR) ? Portabilité
    7. Bien entendu je ne parle pas du reste: migration des projets VB6, etc...


    Personnelement, quand je code du VB.NET, j'ai plus l'impression de débugger le framework que de l'utiliser... Au final, je regrette de ne pas avoir codé en Java mon appli (quand même bien plus mature...). Il y a même des fois où je sais que ce serait plus simple, performant et fiable de faire de l'assembleur pour certains algos

    Non franchement, je suis jeune (23 ans) et je deviens de plus en plus oldschool: vive le c++! Dommage, VS n'a pas de designer c++ . Et alors, elle est où l'interopérabilité des langages? Bah là, y'a plus... 40 ans après le C++, ce langage mérite t'il d'être qualifié de "langage moderne"? Non, mais plus d'un framework beta, 4 ans après sa sortie...

    Shame on you Bill...

    [MODE TROLL OFF]

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/07/2010, 21h32
  2. User control, propriété et load control
    Par topolino dans le forum ASP.NET
    Réponses: 12
    Dernier message: 06/11/2008, 17h57
  3. [.net 2.0] User Control + javascript
    Par fix105 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/05/2007, 21h51
  4. Réponses: 1
    Dernier message: 09/11/2006, 13h34
  5. [VB.NET] Provoquer le rechargement d'un user control..
    Par didoboy dans le forum ASP.NET
    Réponses: 7
    Dernier message: 30/04/2004, 14h17

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