Usercontrol : propriétées instanciées 2 fois

[Résolu]
Signaler
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Bonjour,

J'ai crée un UserControl avec des propriétés accessibles en lecture et en écriture et initialisées dans mon constructeur. Lorque j'insère ce UserControl dans une form à partir de la toolbox, les propriétées précedentes sont à nouveau initialisées dans Form.Designer.cs. Ceci est embêtant si je modifie mon UserControl puisqu'alors les initialisations faites dans Form.Designer.cs écrasent celles que j'ai modifié dans la définition de mon UserControl . Je suis alors obligé de supprimer une à une les propriétées dans Form.Designer.cs. Je voulais donc savoir si il est possible de préciser avec un attribut ou autre de ne pas faire systémtiquement ces initialisations dans Form.Designer.cs quand j'insère mon contrôle dans ma form ?

Merci d'avance pour votre aide.

Mathmax

16 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Pas besoin de recompiler les applications.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Salut,

Normalement si tu fais ton initialisation après l'appel de la méthode InitializeComponent c'est tes valeurs qui devraient être prises en compte.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Je crois que tu ne m'as pas bien compris. En fait c'est les propriétés dans la méthode InitializeComponent() de ma form qui écrasent celle définies dans à l'intérieur de UserControl. Par exemple, supposons que j'ai fait un UserControl qui est en fait un composant hérité de Button auquel j'ai donné à la propriété BackColor la veleur Color.Green. Quand je le glisse dans mon formulaire, le code suivant est crée dans le fichier Form.Designer.cs.

        private void InitializeComponent()
        {
            this.btnStart1 = new FtpLibrary.BtnStart(); // ici il y a création de mon objet BtnStart dérivé de bouton. Ca propriété Backcolor est à Green;
            this.SuspendLayout();
            //
            // btnStart1
            //
            this.btnStart1.BackColor = System.Drawing.Color.Green;
            this.btnStart1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.btnStart1.Location = new System.Drawing.Point(79, 60);
            this.btnStart1.Name = "btnStart1";
            this.btnStart1.Size = new System.Drawing.Size(112, 33);
            this.btnStart1.TabIndex = 4;
            this.btnStart1.Text = "btnStart1";
            this.btnStart1.UseVisualStyleBackColor = true;
...

Le code en bleu est généré lors de l'insertion de mon composant dans ma form. Si maintenant je modifie mon UserControl en affectant à la propriété BackColor la veleur Color.Red. Le code bleu généré reste le même. Lors de la création de mon objet BtnStart, la propriété BackColor est donc égale à Color.Red, mais elle est aussitôt après écrasée par :

this.btnStart1.BackColor = System.Drawing.Color.Green;

Je voulais donc savoir si il est possible de préciser que cette dernière ligne ne soit pas générée lors de l'insertion de mon UserControl dans ma form.

Mathmax
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
en régénérant ta form, le code généré doit se mettre à jour tout seul non?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Effectivement, j'avais mal compris.

Si dans le constructeur de ton bouton tu affectes la valeur Color.Red, le designer du form devrait utiliser Color.Red aussi (il lit la valeur).
Sauf si tu as changer la couleur dans le designer, et dans ce cas ce sera celle ci.

Si tu veux empecher le designer de générer la ligne de code incriminée il te suffit d'overrider la propriété BackColor et de te servir de l'attribut DesignerSerializationVisibility :

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override Color BackColor
{
    get
    {
        return base.BackColor;
    }
    set
    {
        base.BackColor = value;
    }
}

PS : pour chipotter un peu, tu codes un contrôle personnalisé là (CustomControl), pas un contrôle utilisateur (UserControl).
;-)

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Impeccable ! Merci beaucoup.

Mathmax
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Désolé mais j'ai encore un problème avec la porpriété :
            this.btnStart1.UseVisualStyleBackColor = true;
Quand celle-ci est à true, la couleur de fond ne s'affiche pas. Le problème est identique à tout à l'heure. Cette ligne est elle aussi ajoutée dans le designer et je ne peux pas "overrider" la propriété... As-tu une idée pour que celle-ci ne soit pas ajouté automatiquement ?
Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Euh non.


Faudrais voir ce que tu veux faire, hériter de button n'est pas être pas la meilleure façon de faire.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Je viens juste de trouver un truc qui marche ! Mais je ne comprends pas pourquoi...
En faisant :

        private bool _UseVisualStyleBackColor = false;

        public new bool UseVisualStyleBackColor
        {
            get { return _UseVisualStyleBackColor; }
            set { _UseVisualStyleBackColor = value; }
        }
 la propriété this.btnStart1.UseVisualStyleBackColor = true;  est toujours générée mais elle n'est plus gênante... Elle n'empêche plus la propriété Backcolor de s'exprimer. Sais-tu pourquoi ?

Sinon, j'utilise un contrôle personnalisé parce que je voudrais utiliser des boutons stylés dans plusieurs applications sans être obligé de renseigner les propriétées à chaque fois et en ayant la possibilité de les modifier tous en un seul coup.

Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
En faisant un masquage comme ça, tant que ton contrôle est utilisé par son type direct (BtnStart), la valeur échouera dans le champs _UseVisualStyleBackColor et non pas dans le contrôle de base.
Par contre si le contrôle est utilisé en tant que Button ou même ButtonBase, là ce sera le code de la propriété de la classe de base qui sera executé et donc tu "reperdras" ta couleur.
C'est la principale différence entre l'override et le masquage avec new.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Tu me parlais d'une autre façon de faire pour faire des contrôles personnalisés. Ca conviendrait pour ce que je faire ?

Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
En fait là c'est surtout l'embarquement des valeurs dans le code du contrôle qui me choque.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Tu les mettrais où plutôt ?

Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Fichier de config par exemple.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Je ne connais pas  trop les fichiers config. Apparament, pour ce que j'ai pu lire sur internet, il s'agierait de fichier .xml ou d'un autre format pour sauvagarder les données utilisateurs. Je ne comprends pas trop pourquoi il est préférable d'utiliser ce type de fichiers plutôt que de stocker les propriétés directement dans le code du contrôle. Quels en sont les avantages ?

Mathmax
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Interessant en effet. Merci pour ton aide.

Mathmax