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

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 7 oct. 2006 à 16:06
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 8 oct. 2006 à 19:08
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 oct. 2006 à 19:00
Pas besoin de recompiler les applications.

/*
coq
MVP Visual C#
CoqBlog
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2006 à 16:38
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
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
7 oct. 2006 à 17:00
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
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
7 oct. 2006 à 17:13
en régénérant ta form, le code généré doit se mettre à jour tout seul non?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2006 à 17:16
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
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
7 oct. 2006 à 17:30
Impeccable ! Merci beaucoup.

Mathmax
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
7 oct. 2006 à 21:07
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
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2006 à 21:15
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
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
7 oct. 2006 à 21:30
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
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2006 à 21:54
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
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
7 oct. 2006 à 22:05
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
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2006 à 22:45
En fait là c'est surtout l'embarquement des valeurs dans le code du contrôle qui me choque.

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
8 oct. 2006 à 01:21
Tu les mettrais où plutôt ?

Mathmax
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 oct. 2006 à 10:44
Fichier de config par exemple.

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
8 oct. 2006 à 18:36
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
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
8 oct. 2006 à 19:08
Interessant en effet. Merci pour ton aide.

Mathmax
0
Rejoignez-nous