Constructeur paramétré dans un contrôle personnalisé
bob94700
Messages postés69Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention 7 avril 2007
-
12 avril 2005 à 19:57
cs_bib34690
Messages postés22Date d'inscriptionmardi 5 août 2003StatutMembreDernière intervention10 mai 2011
-
8 oct. 2009 à 12:35
Bonjour,
Je voudrais créer un contrôle personnalisé avec un paramétre dans le constructeur.
Problème : dans mon form, par défaut l'initialisation de mon controle se fait par l'appel d'un constructeur sans paramètre.
Est-ce que qqn sait comment je peux indiquer au niveau du code la valeur à utiliser pour ce paramètre ?
Merci
A voir également:
Constructeur paramétré dans un contrôle personnalisé
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 12 avril 2005 à 20:31
Je pige pas bien là, qu'est ce qui t'empeche d'ajouter a ton controle
un constructeur avec des parametres, ou d'ajouter dans ton code le
parametre que tu dois passer a ce constructeur ?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 12 avril 2005 à 20:51
Salut,
Oui c'est normal, un Usercontrol demande un constructeur vide pour que le designer puisse l'afficher correctement (en mode design justement). Le designer ne pouvant évidemment pas deviner ce qu'il doit passer en paramètre de ton Control!
Mais ceci n'est pas un problème en soit, il suffit de donner des valeurs par défaut à ton Control pour qu'il prenne l'apparence souhaitée quand tu le poses sur ta form (et à la limite qu'il change dynamiquement si tu modifies des properties de ce Control, toujours en mode design).
bob94700
Messages postés69Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention 7 avril 20074 13 avril 2005 à 20:11
Merci pour les réponses.
Mon problème concerne effectivement le designer (sinon, c'est en effet assez simple). En regardant ToolTip par exemple, je vois que le designer est capable d'initialiser le control comme suit :
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
Je pensais donc qu'il y avait moyen de paramétrer cela (d'autant que ToolTip possède un constructeur sans paramètre et que ce n'est pas lui que le designer appelle).
En fait mon "controle" n'est pas un UserControl. Je l'ai fait dériver de "Component" directement (comme Helprovider), car pour cet objet, je n'ai pas besoin de toutes les propriétés de UserControl (je veux gérer une fonctionnalité et non un controle "classique").
Et ce que je voudrais récupérer dès la construiction c'est le form intégrant cet objet. Donc je voulais avoir un constructeur du style : MonControle(Form parent).
et souhaitais que le désigner puisse initialiser de la sorte :
this.MonControle1 = new MonControle(this);
Alors j'ai une roue de secours. J'ajoute une prorpriété Form et je l'initialise dans le désigner : ça marche bien, mais je dois dire que ça me satisfait moyen.
De plus avec cette solution, le designer affiche dans cette propriété en "sous-champs" toutes les propriétés (publique je crois) du Form ... ce dont je voudrais me passer. J'ai commencer de regarder dans les attributs, mais pour l'instant j'ai pas trouvé.
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 13 avril 2005 à 21:56
Sauf erreur de ma part ce n'est justement possible qu'avec System.ComponentModel.IContainer Donc MonControle(IContainer container).
Pour un Form je ne sais pas si c'est possible.
Cocoricoooooooo !!!!
coq
MVP Visual C#
Vous n’avez pas trouvé la réponse que vous recherchez ?
bob94700
Messages postés69Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention 7 avril 20074 16 avril 2005 à 12:03
Bonjour,
Alors j'ai pas (encore) trouvé pour le problème du constructeur. En revanche j'ai une solution qui me parait plus intéressante que celle de déclarer une propriété de type Form et que l'utilisateur se doit de renseigner au moment du Design.
J'ai ajouté un ProvideProtertyAttribute avec un IExtenderProvider.
Voilà le code en résumé :
[ProvideProperty("Parent", typeof(Form))]
public class MonCtrl : Component, IExtenderProvider
{
private Form mParent = null; // Contient le parent du contrôle
// Constructeur sans paramètre
public MonCtrl ()
{
// ... => Code
}
[Category("Design")]
[Description("Contient le formulaire parent du contrôle.")]
[Browsable(false)]
public virtual Form GetParent(Form parent)
{
return parent;
}
public virtual void SetParent(Form parent, object value)
{
if (mParent == null)
mParent = parent;
// en fait ici, value ne me sert pas ...
}
public virtual bool CanExtend(object target)
{
return (target is Form);
}
}
(en espérant que je n'ai rien oublié d'important dans mon copie-coller).
- Le "ProvideProperty" me permet de déclarer une propriété nommée "Parent" pour d'autres contrôles, conjointement avec la dérivation de IExtenderProvider
- Set notamment permet d'alimenter ma variable privée mParent (c'est ce que je cherchais à faire de façon implicit).
- Get renvoie le parent et permet notamment de déclarer les attributs sur "Parent" (en particulier ici, je veux qu'elle ne soit pas visible dans la fenètre des propriétés du Designer)
- CanExtend me permet d'indiquer que la propriété "Parent" ne doit être ajouté que sur les objet de type Form.
Et dans le code généré automatiquement, j'ai cette ligne qui vient s'ajouter :
this.MonCtrl.SetParent(this, "Form1");
Pas tout à fait ce que je voulais initialiment (this n'est pas transmis au constructeur). Mais déjà je récupère "this" (le form) suffisamment tôt et automatiquement.
Rq : on peut jouer sur le 1er paramètre de SetParent (enfin SetNomDeLaPropriété), pour récupérer this (quelque soit son type).
Voilà.
bob94700
Messages postés69Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention 7 avril 20074 16 avril 2005 à 15:46
Petitte précision :
Je ne suis pas bien certain, mais il semble que la génération automatique du code ne sa fasse pas si le 2nd paramètre de la fonction Set...() est un type qui ne peut pas prendre la valeur null (ou si c'est un value type)
Par exemple avec bool ou int : ça ne marche pas.
à voir ...
ezsouhail
Messages postés2Date d'inscriptionmercredi 14 janvier 2009StatutMembreDernière intervention30 janvier 2010 12 mai 2009 à 03:09
bonjour tout le mondes;
ma question est un peu compliqué ,bah pour un debutant si je crois,.........en bref je demande votre aide pour cree une liste de control (toolbox) et une liste de proprieté dans une fenetre avec C#
ainsi on peut glisser n'importe quel control dans la forme et modifier ses proprietés .