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

C# Discussion :

Attribut Description pour une collection


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2010
    Messages : 72
    Points : 70
    Points
    70
    Par défaut Attribut Description pour une collection
    Bonjour,

    La question va sans doute paraitre simple, et ce n'est qu'un détail... c'est d'autant plus rageant de perdre du temps dessus!

    J'ai créé une userform, qui a une collection d'objet en propriété.
    La classe utilisée pour la collection est définie aussi, chacune des propriétés a des attributs Category et Description, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [Category("Configuration"), Description("Libellé pour recherche et en-tête")]
    public string titreColonne { get; set; }

    Dans Visual Studio (2015), j'utilise mon composant, j'accède via le menu aux propriétés, ouvre ma collection, ajoute un objet. Les propriétés sont bien listées.
    Mais par contre aucune catégorie affichée. Aucune description non plus...
    Google n'a pas été mon ami sur ce coup.

    Ou est mon erreur? Est-ce d'autres attributs qu'il faut utiliser? Ou les utiliser différemment? Ou...

    Merci de votre aide.


    *** Edit : lorsque je renseigne la collection sur ma form via le menu de Visual Studio, elle n'est pas enregistrée. Du coup, mon erreur doit être ailleurs... voici un bout de code plus complet :

    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
     
    public partial class Dyn_DataGrid : UserControl
    {
            [Category("Configuration"), Description("Options des colonnes")]
            public List<infoColonne> iColonne { get; set; }
     
    }
     
     public class infoColonne
    {
           [Category("Configuration"), Description("nom SQL de la colonne")]
            public string idColonne { get; set; }
            [Category("Configuration"), Description("Libellé pour recherche et en-tête")]
            public string titreColonne { get; set; }
            [Category("Configuration"), Description("Traduction éventuelle (requête SQL)")]
            public string Trad { get; set; }
    }

    **** edit : Après relecture du tuto de Thomas Lebrun, j'ai tenté en vain quelques modifications.
    • Ajout de l'attribut DesignerSerializationVisibility(DesignerSerializationVisibility.Visible) (valeur par défaut il me semble, mais dans le doute...)
    • Ajout partour de l'attribut Browsable(true)

    Mais rien ne change. Modifier les valeurs ne marche pas. Et pas d'affichage des catégories/descriptions sur les collections.

  2. #2
    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

    1/L'Attribut Browsable(bool) est par défaut à "true"...
    Cet Attribut est utile uniquement lorsqu'on veut ne pas afficher(masquer) une propriété dans le designer VS....
    L'Icone Détails de l'inspecteur de propriété est ton ami....!!!

    lorsque je renseigne la collection sur ma form via le menu de Visual Studio, elle n'est pas enregistrée. Du coup, mon erreur doit être ailleurs... voici un bout de code plus complet


    2/ Attribut DesignerSerializationVisibility
    - Hidden :La propriété peut être assignée sur le Designer. mais aucun code pour la propriété n'est génère dans le designer .

    Cet attribut est utile si on veut que la propriété soit -uniquement utilisable dans le code- par l'user du control ....
    -Content : La propriété peut être assignée sur le Designer ,le code pour la propriété ainsi que le code d'assignation de sa valeur sont génères dans le designer .
    Cet attribut est utile si on veut conserver la valeur à l'exécution car le code génère est "sérialise" (conserve à l'exécution)....

    -Visible : à ne pas utiliser ....
    Cet attribut est utile dans un CodeDom Seriliazer car il sérialise le code C# : code des getter & setters de la propriété ...

    ton code revu avec l'initialisation de la propreté( omise ):

    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
     
     
     public partial class Dyn_DataGrid : UserControl
        {
            public Dyn_DataGrid()
            {
                InitializeComponent();
            }
            private List<infoColonne> _iColonne = new List<infoColonne>();
            [Browsable(true)]
            [Category("Configuration"), Description("Options des colonnes")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
            public List<infoColonne> iColonne 
            {
                get { return _iColonne ; }
                set { _iColonne  = value; }
            }
     
     
     
     
     
        }
    coup d'oeil à l'extrait du code du Designer (fichier Form2.Designer.cs) :
    1/HIDDEN
    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
     
     
     
    private void InitializeComponent()
            {
                this.dyn_DataGrid1 = new WinSousBinding.Dyn_DataGrid();
                this.SuspendLayout();
                // 
                // dyn_DataGrid1
                // 
                this.dyn_DataGrid1.Location = new System.Drawing.Point(53, 48);
                this.dyn_DataGrid1.Name = "dyn_DataGrid1";
                this.dyn_DataGrid1.Size = new System.Drawing.Size(150, 150);
                this.dyn_DataGrid1.TabIndex = 2;
                // 
                // Form2
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(544, 320);
                this.Controls.Add(this.dyn_DataGrid1);
                this.Name = "Form2";
                this.Text = "Form2";
                this.Load += new System.EventHandler(this.Form2_Load);
                this.ResumeLayout(false);
     
            }
     
            #endregion
     
            private Dyn_DataGrid dyn_DataGrid1;
    2/Content(ce code est genere des qu'on assigne des valleurs à la liste)

    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
     
     
     private void InitializeComponent()
            {
                WinSousBinding.infoColonne infoColonne1 = new WinSousBinding.infoColonne();
                WinSousBinding.infoColonne infoColonne2 = new WinSousBinding.infoColonne();
                WinSousBinding.infoColonne infoColonne3 = new WinSousBinding.infoColonne();
                this.dyn_DataGrid1 = new WinSousBinding.Dyn_DataGrid();
                this.SuspendLayout();
                // 
                // dyn_DataGrid1
                // 
                this.dyn_DataGrid1.BackColor = System.Drawing.SystemColors.ControlDark;
                infoColonne1.idColonne = null;
                infoColonne1.titreColonne = null;
                infoColonne1.Trad = null;
                infoColonne2.idColonne = null;
                infoColonne2.titreColonne = null;
                infoColonne2.Trad = null;
                infoColonne3.idColonne = null;
                infoColonne3.titreColonne = null;
                infoColonne3.Trad = null;
                this.dyn_DataGrid1.iColonne.Add(infoColonne1);
                this.dyn_DataGrid1.iColonne.Add(infoColonne2);
                this.dyn_DataGrid1.iColonne.Add(infoColonne3);
                this.dyn_DataGrid1.Location = new System.Drawing.Point(125, 44);
                this.dyn_DataGrid1.Name = "dyn_DataGrid1";
                this.dyn_DataGrid1.Size = new System.Drawing.Size(150, 150);
                this.dyn_DataGrid1.TabIndex = 0;
                // 
                // Form2
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(544, 320);
                this.Controls.Add(this.dyn_DataGrid1);
                this.Name = "Form2";
                this.Text = "Form2";
                this.Load += new System.EventHandler(this.Form2_Load);
                this.ResumeLayout(false);
     
            }
     
            #endregion
     
            private Dyn_DataGrid dyn_DataGrid1;
    bon code ...

  3. #3
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Shampra Voir le message
    Dans Visual Studio (2015), j'utilise mon composant, j'accède via le menu aux propriétés, ouvre ma collection, ajoute un objet. Les propriétés sont bien listées.
    Mais par contre aucune catégorie affichée. Aucune description non plus...
    Google n'a pas été mon ami sur ce coup.

    Ou est mon erreur? Est-ce d'autres attributs qu'il faut utiliser? Ou les utiliser différemment? Ou...
    Je me trompe peut-être, mais je pense que tu as mal interprété le comportement de ces métadonnées. La catégorie permet l'ordonnancement dans la liste des propriétés du UserControl. Par défaut tu auras "Accessibilité", "Apparence", etc... Ensuite, la description correspond au petit texte en bas de la fenêtre des propriétés. Exemple pour la propriété Font : "La police utilisée pour afficher le texte dans le contrôle."

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2010
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Bonjour et merci pour vos réponse .

    ZenZiTone,
    Non, j'ai bien compris ça (c'est presque la seule chose de claire ^^).
    Je l'utilise pour les propriétés sans problème : mes propriétés sont groupés dans une catégorie et un descriptif s'affiche en bas pour l'aide.
    Sauf que pour la collection, rien de tout ça et c'est dommage.

    MABROUKI,
    Réponse bien complète, merci!
    Pour les browsables, j'avais vu effectivement pour la valeur par défaut, mais à force de piétiner j'ai fini par les définir "dans le doute" (ce qui n'est pas idéal pour comprendre ^^).

    Pour les DesignerSerializationVisibility.Content, j'en suis arrivé à ce résultat à force d'essais (et d'erreurs!), mais une explication claire reste très appréciable .
    Pour le Visible, je l'ai toujours sur les propriétés de la classe utilisée sur la liste.

    Donc je dois :
    - supprimer les Browsables car inutile
    - supprimer les DesignerSerializationVisibility.Visible car à risque d'après ce que j'en comprends
    C'est fait, ça marche toujours .


    Reste que... je n'ai toujours ni catégorie ni description lors de l'édition de la collection .
    Voici le résultat :
    Nom : 2016-09-23 12_57_15-10.10.10.10 - Connexion Bureau à distance.png
Affichages : 160
Taille : 2,7 Ko

  5. #5
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    J'ai regardé sur d'anciens projet et j'ai la chose suivante : non pas une collection (List<T>, par exemple), mais un objet héritant de ObservableCollection. Dans ce contexte, la description et la catégorie sont bien affectés.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2010
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Pas mieux

    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
     
    public partial class Dyn_DataGrid : UserControl
    {
     [Category("Configuration"), Description("Options des colonnes"),DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
     public ObservableCollection<infoColonne> iColonne { get; set; }
     
     public Dyn_DataGrid()
            {
                // on ne fait rien dans le constructeur, pour pouvoir le faire après définition des property lors de la création
                InitializeComponent();
                iColonne = new ObservableCollection<infoColonne>(); // Si je ne l'initialize pas, impossible de remplir la collection ensuite
            }
    ...
    }
     
     public class infoColonne
        {
            [Category("Configuration"), Description("nom SQL de la colonne")]
            public string idColonne { get; set; }
            [Category("Configuration"), Description("Libellé pour recherche et en-tête")]
            public string titreColonne { get; set; }
            [Category("Configuration"), Description("Traduction éventuelle (requête SQL)")]
            public string Trad { get; set; }
            [Category("Configuration"), Description("Visible ou pas")]
            private bool _isVisible = true;
            public bool isVisible
            {
                get { return _isVisible; }
                set { _isVisible = value; }
            }
            [Category("Configuration"), Description("Est-ce modifiable")]
            private bool _isModifiable = true;
            public bool isModifiable
            {
                get { return _isModifiable; }
                set { _isModifiable = value; }
            }
            [Category("Configuration"), Description("Afficher un filtre?"), Browsable(true), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
            private bool _isFiltrable = true;
            public bool isFiltrable
            {
                get { return _isFiltrable; }
                set { _isFiltrable = value; }
            }
        }
     
     
    }

  7. #7
    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
    Moi j'utilise VS 2010 et je vois en cliquant sur l'Icone Détails( le plus à droite) du PropertyGrid du Designer ,affiche une catégorie Configuration ...
    Les catégories sont affichées dans l'ordre alphabétique quand l'Icone Détails est cliqué...
    Ceci avec un List<T>....
    A moins que ce soit un coup de soleil africain ,mais l'été est terminé...!!!

  8. #8
    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

    Autre recommandation importante lors de la conception de control:
    Le nouveau control & le Form sont dans le même projet:
    1/Supprimer toujours le control droppé avant de modifier son code
    2/Modifier le code
    3/Régénérer la Solution
    4/Dropper le control

    Le nouveau control est un projet à part (lib) :
    1/Supprimer toujours le control droppé avant de modifier son code
    2/Supprimer sa référence dans le Projet Test du Form
    3/Modifier le code
    4/Régénérer le projet Lib
    5/Ajouter sa référence dans le Projet Test du Form
    6/Régénérer la Solution (projet Lib +Form)
    7/Dropper le control

    Ca s'épaissit dans le cas du projet Lib...
    Sinon on s'expose au syndrome "hallucination custom control" !!!
    bon code....

    3/bis supprimer

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2010
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Merci Mabrouki. Après quelques jours sur d'autres tâches, retour à ce code.

    Je cherche toujours ce que je fais mal :/.
    Concernant la procédure... outch, lourd! Cela dit j'ai été forcé de le faire (effet "hallucination custom control", la première fois j'ai mis un moment à comprendre que ça venait de Visual ^^).
    F6 systématique bien sûr, relance de Visual réguliers. Dropper le control... fait une fois, mais comme il faut le replacer, reconfiguer, erc à chaque fois, j'évite. Le drop n'a pas changé la donne concernant ce problème de toute façon.


    Je suis en VS Community 2015, version 14.
    Je n'ai pas d'icône "Détail" (promis, j'ai regardé partout plusieurs fois!), l'interface aurait changé entre VS2010 et 2015?
    Dans mon cas :
    - sur ma form, je sélectionne le custom control
    - dans le PropertyGrid du designer, je vois bien les propriétés du control avec description et catégories
    Nom : 2016-09-30 09_29_47-10.10.10.10 - Connexion Bureau à distance.png
Affichages : 140
Taille : 17,0 Ko
    - je clique sur celle de type collection (iColonne dans mon cas), ça ouvre l'éditeur de collection...
    ... et là, c'est le drame (ok, ptêt pas vu le gravité du problème ^^). Pas de catégorie, pas de descriptions.
    Nom : 2016-09-30 09_33_16-AMC - Microsoft Visual Studio.png
Affichages : 289
Taille : 34,3 Ko

    Le tout en List<T> mais j'ai tenté iCollection sans plus de succès. Puis bon, c'est censé marcher avec List!
    Si quelqu'un a une idée, merci .

Discussions similaires

  1. [MCD] Attributs supplémentaires pour une catégorie
    Par zalalus dans le forum Schéma
    Réponses: 4
    Dernier message: 20/07/2011, 16h04
  2. Réponses: 13
    Dernier message: 22/06/2009, 18h53
  3. [E-03] Clé pour une collection
    Par Onimi dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/01/2009, 14h23
  4. [Debutant]Mapping pour une collection
    Par maxattack dans le forum Hibernate
    Réponses: 14
    Dernier message: 14/06/2007, 10h59
  5. [XSL] Enlever l'attribut xmlns pour une transf. XSL
    Par Acalon dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 24/04/2006, 14h21

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