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 :

C# Propriétés en mode design


Sujet :

Windows Forms

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut C# Propriétés en mode design
    Bonjour,
    --------

    J'ai dérivé la classe Label pour en faire un genre de "Led".
    Je rencontre des problèmes avec le designer, qui modifie deux de mes valeurs imposées dans le constructeur : AutoSize et Text

    AutoSize doit rester à false dans mon cas. J'y suis arrivé en forçant la valeur de retour de la propriété comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         public override bool AutoSize 
            { get { return false; } }
    Ca fonctionne parfaitement, mais la propriété bloquée à "false" demeure visible dans le mode design, ce qui n'a évidemment aucun sens.
    J'ai alors tenté d'utiliser l'attribut suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
            public override bool AutoSize 
            { get { return false; } }
    Mais ça n'a strictement aucun effet. J'ai essayé toutes sortes d'attributs, mais je ne dois pas avoir trouvé le bon.

    Concernant ma propriété Text, c'est plus délicat. Si je force comme ci-dessus, j'obtiens bien un texte vide, mais l'utilisateur ne peut plus changer.

    Ce que je voudrais, c'est que par défaut dans le designer la zone "texte" soit vide, mais qu'au besoin on puisse y mettre quelque chose (utile seulement dans 2 ou 3 cas dans mon application).

    Dit autrement, j'arrive soit à autoriser l'utilisateur à modifier mais alors le designer me place sa propre valeur par défaut.
    Soit j'arrive à imposer ma propre valeur par défaut, mais l'utilisateur ne peut plus rien modifier.

    Si quelqu'un peut me mettre sur la voie, je l'en remercie

    A+
    Claude

  2. #2
    Futur Membre du Club
    Profil pro
    Ingénieur développement logiciel
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciel

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    salut !

    as-tu essayé l'attribut Browsable(false) pour cacher ta propriété AutoSize ?

    moi aussi, je suis en train de galérer avec ces propriétés, c'est pas très intuitif des fois ces trucs

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    browsable permet de dire si la propriété est visible dans la fenetre des propriété
    DesignerSerializationVisibility sert à dire si la valeur de la propriété est enregistrée dans le fichier designer et donc réappliquée à l'ouverture de la fenetre (en mettant "content" ca permet d'enregistrer l'objet entier, donc toutes ses propriétés, pour un bouton en propriété par exemple)

    sinon essaye de mettre dans le constructeur
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    Merci pour l'aide.

    J'ai fini par y arriver, mais d'une façon qui ne me satisfait pas :

    Pour la propriété Autosize, ça fonctionne effectivement avec

    [System.ComponentModel.Browsable(false)]

    donc, à ce niveau, c'est réglé, merci.

    Pour le texte, j'avais essayé dès le départ d'initialiser dans le constructeur.
    Seulement, ça ne fonctionne pas, parce que le designer affecte le nom automatiquement après la création du contrôle.

    J'ai remarqué que le texte affecté était toujours le même que le nom du contrôle (contrôle dérivé de Label).

    J'ai donc contourné le problème en faisant comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public override string Text
            {
                get {return base.Text; }
                set {base.Text= value == this.Name? "" : value; }       // si le texte par défaut = le nom (ce que fait designer), effacer le texte
            }
    Mais je trouve ça non élégant, et en plus ça ne fonctionne que parce que le texte par défaut est égal au nom, ce n'est donc pas reproductible pour d'autres méthodes.

    J'ai aussi essayé de combiner l'initialisation dans le constructeur avec l'utilisation de [DefaultValue] et le mode "content". Pareil.

    Jusqu'à présent, seule mon "astuce" permet d'éviter le problème

    Du coup, si quelqu'un avait une méthode "propre", ce serait super.

    Bref : comment empêcher que le designer d'ajouter l'initialisation de la propriété automatiquement?

    Parce que, évidemment, en mode de création dynamique, aucun problème.

    A+
    Claude

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    faire une classe de designer pour ton controle, en remplacant un peu le code qui fait le nom du control
    c'est propre mais pas forcément simple quand on connait pas les classe type controldesigner
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    OK, merci.
    Alors je plancherai là-dessus lorsque j'aurais un peu plus d'expérience avec ce langage

    A+
    Bigonoff

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/02/2013, 14h48
  2. Réponses: 2
    Dernier message: 15/10/2007, 17h53
  3. Réponses: 2
    Dernier message: 17/01/2007, 08h58
  4. Réponses: 7
    Dernier message: 14/01/2006, 18h15
  5. Mode Design
    Par lecharcutierdelinux dans le forum JBuilder
    Réponses: 4
    Dernier message: 04/02/2004, 16h57

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