cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008
-
7 oct. 2006 à 16:06
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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 ?
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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 :
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.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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).
;-)
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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 ?