EXEMPLE DE PROPRIÉTÉ D'OBJET AVEC UN PETIT PLUS DANS LA FENETRE PROPRIETE (STYLE
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 2010
-
3 sept. 2004 à 19:19
cs_Kelpan
Messages postés70Date d'inscriptionmercredi 24 avril 2002StatutMembreDernière intervention17 septembre 2006
-
30 juin 2008 à 14:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Kelpan
Messages postés70Date d'inscriptionmercredi 24 avril 2002StatutMembreDernière intervention17 septembre 2006 30 juin 2008 à 14:26
J'ai résolu mon souci.
En fait, j'ai trouvé une astuce avec la méthode Clone (Implementation de ICloneable) qui est appelé au moment du design.
Plus de précision sur le source converti en VB (car je suis VBiste) par JESUSONLINE :
http://www.vbfrance.com/code.aspx?ID=25937
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 30 juin 2008 à 08:50
@Kelpan : non je ne vois malheureusement pas ou se situe ton souci :/
cs_Kelpan
Messages postés70Date d'inscriptionmercredi 24 avril 2002StatutMembreDernière intervention17 septembre 2006 29 juin 2008 à 23:10
Pour répondre à Mahrak
Il existe des méthodes pour définir la serialisation des propriétés objets que j'utilise souvent
Tu as les méthodes (Property étant le nom de ta propriété) :
bool ShouldSerialize(Property) : Renvoi True si il faut serialiser
void Reset(Property) : reinitialiser la proppriété
Tu peux consulter MSDN : PropertyDescriptor, tu y trouvera les infos
cs_Kelpan
Messages postés70Date d'inscriptionmercredi 24 avril 2002StatutMembreDernière intervention17 septembre 2006 29 juin 2008 à 23:03
Bonjour,
Je suis tombé sur ce source, et j'aurais bien voulu le trouvé avant car cela fait une semaine que je galère à faire ce genre de propriété.
Finalement, j'en suis arrivé au même point...
Par contre, moi j'ai un souci.
J'ai un control personnalisé qui hérite de Button.
Sur mon écran lorsque que je modifie la propriété de mon Button personnalisé je n'ai pas de problème, la serialisation s'effectue correctement.
Par contre, et c'est ici que j'ai le problème, c'est que lorsque j'herite de mon écran, la propriété que j'ai modifié et affiché en gras (ce qui n'est pas le comportement standard par rapport au comportement habituel du propertyGrid) et je ne peux pas serialiser la propriété si la valeur revient à celle par défaut.
Quelqu'un à le meme problème ou jai oublié quelque chose ?
TigerFab
Messages postés115Date d'inscriptionsamedi 15 février 2003StatutMembreDernière intervention18 mai 2008 7 déc. 2007 à 12:29
Voilà j'ai finalement trouvé un moyen pour rafraichir directement ses composants dès qu'on change une propriété dans le designer.
Il faut ajouter à la classe un évènement que vous appelerez dans chaque propriété.
Exemple :
- Définissez dans la classe Mon_ensemble_de_propriete() :
public Event Set_Mon_ensemble_de_propriete()
- Pour chaque propriété (nom, prénom, ..) de la classe, faites
RaiseEvent Set_Mon_ensemble_de_propriete()
dans chaque Set
- Et voilà, plus qu'à définir votre procédure événementielle dans votre objet :
public sub SetArthenius() Handles Arthenius.Set_Mon_ensemble_de_propriete()
Chaque changement de propriété appelera votre fonction personalisée SetArthenius.
TigerFab
Messages postés115Date d'inscriptionsamedi 15 février 2003StatutMembreDernière intervention18 mai 2008 3 déc. 2007 à 21:11
Petite remarque tout de même, on sait modifier les propriétés dans en mode design, elles sont effectivement retenues avec DesignerSerializationVisibility. Mais elle ne s'applique pas dans l'interface. D'ailleurs mettez un msgbox "Test" dans
set
{
Arthenius=value;
msgbox "ok"
}
en changeant dans le designer cela ne passe jamais par le set.
Etrange et pourtant ....
Si qcq a une idée ..
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 30 nov. 2007 à 08:42
@Tigerfab :
merci ;)
j'ai pas mal chercher aussi à l'époque :)
@MAhrak :
tu peux toujours definir une valeur par défaut dans ta classe, après je ne sais pas s'il apparaitra en gras ou pas ^^
TigerFab
Messages postés115Date d'inscriptionsamedi 15 février 2003StatutMembreDernière intervention18 mai 2008 29 nov. 2007 à 18:48
Bonjour,
Bravo pour ce code. Exactement ce que je recherchais. Je demande bien comment tu as pu trouver l'astuce, cela fait des jours que je parcourais le web ...
Pour ceux qui ont des plantages de Visual Studio quand il affiche leur composant en mode design, c'est en effet parce que la classe ..._Converter ne servait à rien. Implémenter le type ExpandableObjectConverter et là plus de plantage :-)
--> [TypeConverter(typeof(ExpandableObjectConverter))]
Mahrak
Messages postés2Date d'inscriptiondimanche 20 août 2006StatutMembreDernière intervention20 septembre 2007 19 sept. 2007 à 19:38
Excellent ! Exactement ce que je cherchais a faire depuis un petit moment.
Même si je vois que personne n'a de réponse au problème de Thorfen (tout du moins tel que je comprend la question), j'ai une autre question :
Comment définir une valeur par défaut sur des objets tel que les Font, Color etc. pour plus qu'ils n'apparaissent en gras tant qu'il n'ont pas été modifier ? C'est facile a faire sur les types standards (string, bool, int et autres valeurs numériques) en ajoutant un [DefaultValue(valeur)]. Ca l'est beaucoup moins pour les objets.
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 18 août 2006 à 11:10
en attaquant la classe contenu dans la propriété simplement....
thorfen
Messages postés5Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention14 mai 2007 18 août 2006 à 10:22
Très intéréssant comme source en plus j'ai bien compris le
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
du coup qui est quand meme super important
au passage c'est du détail mais vous savez comment faire pour modifier la valeur de ce qui apparait en face de la propriété extendable ?
car on modifie les valeurs sous cette propriété mais pas la valeur de l'objet
par exemple pour la propriété font tu voix la font family le style et la taille
merci encore pour le code !
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 14 mars 2005 à 18:46
UInt32 n'est pas conforme CLS, ce qui pourrait poser problème dans certains langages .Net
Tu devrais te rabattre sur du Int64 je pense.
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 14 mars 2005 à 16:34
non désolé...
Trentreznor
Messages postés7Date d'inscriptionmardi 10 août 2004StatutMembreDernière intervention14 mars 2005 14 mars 2005 à 16:14
Merci pour cette source qui m'a aidé à simplifier mon code, par contre j'ai un problème sachant que les propriétés de mon objet type "Mon_ensemble_de_propriete" sont des uint (= System.UInt32) et l'interface refuse de générer du code pour ce type de propriétés. J'ai essayé de regarder du coté des TypeConverter et autres InstanceDescriptor mais je ne suis arrivé à rien.
Quelqun aurait il une solution?
Frederyck
Messages postés62Date d'inscriptionvendredi 6 décembre 2002StatutMembreDernière intervention16 janvier 20091 24 sept. 2004 à 10:48
ok, ben c cool alors, il me semble que j'avais testé come caet que ca n'avait pas marché, mais j'avais du faire une erreur quelque part, donc je retesterai
Ok merci ;)
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 24 sept. 2004 à 10:00
oui si tu suis l'exemple de propriété donné dans le source... :
private Mon_ensemble_de_propriete Arthenius =new Mon_ensemble_de_propriete();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Mon_ensemble_de_propriete Mais_qui_est_Arthenius
{
get
{
return Arthenius;
}
set
{
Arthenius=value;
}
}
il faut faire le new....sinon le plus n'apparait pas....
et le [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
est obligatoire pourqu'il tienne compte de ce que tu saisis...
voir les commentaires et les mises a jour...
et oui apres ca tu peux utiliser tes classes pour tes objets....
c'est du plus belle effet dans ta fenetre propriété :o))))
Frederyck
Messages postés62Date d'inscriptionvendredi 6 décembre 2002StatutMembreDernière intervention16 janvier 20091 24 sept. 2004 à 09:50
Cool content d'avoir pu aidé.
Mais dis moi dans la classe où tu utilises ta classe Mon_ensemble_de_propriete, c'est un control ?
Quand la propriété s'affiche dans le designer Visual Studio est ce que tu arrives à modifier les propriétés nom et Prénom ? et est ce que les modifications sont reportées aussitôt dans le designer.
Je m'explique en admettant que la classe où tu utilises Mon_ensemble_de_propriete soit un control composite et que dans ce control tu affiches 2 labels où tu affiches Nom et Prénom. Est ce que lorsque tu modifies le nom et l eprénom, le designer met à jour la valeur et rend les nouvelles données insérées ?
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 24 sept. 2004 à 09:44
voila c a jour....
c plus simple...donc mieux :o)))
merci...
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 24 sept. 2004 à 09:05
je teste ca :o)))
ben en tout cas ca serait bien plus simple... :o)))
Frederyck
Messages postés62Date d'inscriptionvendredi 6 décembre 2002StatutMembreDernière intervention16 janvier 20091 23 sept. 2004 à 20:12
Salut, ben tout d'abord effectivement pour faire apparître le petit plus, il n'est pas necessaire de créer une classe qui dérive de ExpandableObjectConverter
il suffit juste de faire
[TypeConverter(typeof(ExpandableObjectConverter
))].
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 6 sept. 2004 à 22:59
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 6 sept. 2004 à 18:05
encore un pb de refresh ;o)))
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 6 sept. 2004 à 18:04
lol...
mouis mais ca vaut le coup....
ca marche vachement mieux....
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 6 sept. 2004 à 18:02
o_O
je me demande où est passé mon comment de tout à l'heure
enfin bref il disais :
"lol
je ne savais pas le reste"
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 6 sept. 2004 à 17:58
pffffff c pas cool va falloir que je mette à jour ma source en VB .net :D
Cyril
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 6 sept. 2004 à 14:42
coq tu m'enerve...
:o)))
c ca...
ben ca a failli....
j'ai failli t'apprendre un truc....
:o))))))))))
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 6 sept. 2004 à 14:36
lol, ça :
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Mon_ensemble_de_propriete Mais_qui_est_Arthenius
{
get
{
return Arthenius;
}
set
{
Arthenius=value;
}
}
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 6 sept. 2004 à 14:22
et en francais ???
:o)))))))))
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 6 sept. 2004 à 14:12
euh
il me semble qu'il faut que tu regardes du côté de DesignerSerializer et/ou DesignerSerializerVisibility
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 6 sept. 2004 à 14:00
Bon il semble qu'il y ai un petit souci...
en fait quand en design on saisie directement les propriétés, on arrive pas à les récupérer en code...
Null object reference...
par contre si dans le code tu assigne ces propriétés...
ben ca fonctionne...
donc il doit manquer kkchose kkpart...
je cherche et je mettrais à jour ...si je trouve...
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 6 sept. 2004 à 09:08
lol
chuuuuuuut ;)
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 6 sept. 2004 à 08:56
ben perso j'aurai aussi preferer que ce soit moins lourd... :o)))
pour ce qui est de deatil sur les objet converter....
ben forcement vu que j'ai betement traduit....
:o)))))
connait pas...
sorry...
mais bon sur le principe tout ce joue dans la fonction convertTo...
c'est la que tu appel le constructeur de ta classe...
pour une fois que j'ai trouver kkchose que coq ne connaissait pas :o))))
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 5 sept. 2004 à 10:22
moi aussi je pensais que c'était moins lourd que ça
Enfin c'est bon à savoir :)
Merci
sibi12
Messages postés337Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention15 avril 2006 4 sept. 2004 à 11:06
Interessant...
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 3 sept. 2004 à 19:19
J'aurais pensé que c'etait plus facile que ca qd meme, fallait le savoir celui ci : Mon_ensemble_de_propriete_Converter, t'aurais pas un peu de détails sur ExpandableObjectConverter ? car j'ai pas compris à quoi sert tout ces membres surchargés.
30 juin 2008 à 14:26
En fait, j'ai trouvé une astuce avec la méthode Clone (Implementation de ICloneable) qui est appelé au moment du design.
Plus de précision sur le source converti en VB (car je suis VBiste) par JESUSONLINE :
http://www.vbfrance.com/code.aspx?ID=25937
30 juin 2008 à 08:50
29 juin 2008 à 23:10
Il existe des méthodes pour définir la serialisation des propriétés objets que j'utilise souvent
Tu as les méthodes (Property étant le nom de ta propriété) :
bool ShouldSerialize(Property) : Renvoi True si il faut serialiser
void Reset(Property) : reinitialiser la proppriété
Tu peux consulter MSDN : PropertyDescriptor, tu y trouvera les infos
29 juin 2008 à 23:03
Je suis tombé sur ce source, et j'aurais bien voulu le trouvé avant car cela fait une semaine que je galère à faire ce genre de propriété.
Finalement, j'en suis arrivé au même point...
Par contre, moi j'ai un souci.
J'ai un control personnalisé qui hérite de Button.
Sur mon écran lorsque que je modifie la propriété de mon Button personnalisé je n'ai pas de problème, la serialisation s'effectue correctement.
Par contre, et c'est ici que j'ai le problème, c'est que lorsque j'herite de mon écran, la propriété que j'ai modifié et affiché en gras (ce qui n'est pas le comportement standard par rapport au comportement habituel du propertyGrid) et je ne peux pas serialiser la propriété si la valeur revient à celle par défaut.
Quelqu'un à le meme problème ou jai oublié quelque chose ?
7 déc. 2007 à 12:29
Il faut ajouter à la classe un évènement que vous appelerez dans chaque propriété.
Exemple :
- Définissez dans la classe Mon_ensemble_de_propriete() :
public Event Set_Mon_ensemble_de_propriete()
- Pour chaque propriété (nom, prénom, ..) de la classe, faites
RaiseEvent Set_Mon_ensemble_de_propriete()
dans chaque Set
- Et voilà, plus qu'à définir votre procédure événementielle dans votre objet :
public sub SetArthenius() Handles Arthenius.Set_Mon_ensemble_de_propriete()
Chaque changement de propriété appelera votre fonction personalisée SetArthenius.
3 déc. 2007 à 21:11
set
{
Arthenius=value;
msgbox "ok"
}
en changeant dans le designer cela ne passe jamais par le set.
Etrange et pourtant ....
Si qcq a une idée ..
30 nov. 2007 à 08:42
merci ;)
j'ai pas mal chercher aussi à l'époque :)
@MAhrak :
tu peux toujours definir une valeur par défaut dans ta classe, après je ne sais pas s'il apparaitra en gras ou pas ^^
29 nov. 2007 à 18:48
Bravo pour ce code. Exactement ce que je recherchais. Je demande bien comment tu as pu trouver l'astuce, cela fait des jours que je parcourais le web ...
Pour ceux qui ont des plantages de Visual Studio quand il affiche leur composant en mode design, c'est en effet parce que la classe ..._Converter ne servait à rien. Implémenter le type ExpandableObjectConverter et là plus de plantage :-)
--> [TypeConverter(typeof(ExpandableObjectConverter))]
19 sept. 2007 à 19:38
Même si je vois que personne n'a de réponse au problème de Thorfen (tout du moins tel que je comprend la question), j'ai une autre question :
Comment définir une valeur par défaut sur des objets tel que les Font, Color etc. pour plus qu'ils n'apparaissent en gras tant qu'il n'ont pas été modifier ? C'est facile a faire sur les types standards (string, bool, int et autres valeurs numériques) en ajoutant un [DefaultValue(valeur)]. Ca l'est beaucoup moins pour les objets.
18 août 2006 à 11:10
genre Mon_Objet.Mais_qui_est_Arthenius.Nom = "TOTO";
Mon_Objet.Mais_qui_est_Arthenius.Prenom = "TUTU";
me semble t il
18 août 2006 à 10:22
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
du coup qui est quand meme super important
au passage c'est du détail mais vous savez comment faire pour modifier la valeur de ce qui apparait en face de la propriété extendable ?
car on modifie les valeurs sous cette propriété mais pas la valeur de l'objet
par exemple pour la propriété font tu voix la font family le style et la taille
merci encore pour le code !
14 mars 2005 à 18:46
Tu devrais te rabattre sur du Int64 je pense.
14 mars 2005 à 16:34
14 mars 2005 à 16:14
Quelqun aurait il une solution?
24 sept. 2004 à 10:48
Ok merci ;)
24 sept. 2004 à 10:00
private Mon_ensemble_de_propriete Arthenius =new Mon_ensemble_de_propriete();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Mon_ensemble_de_propriete Mais_qui_est_Arthenius
{
get
{
return Arthenius;
}
set
{
Arthenius=value;
}
}
il faut faire le new....sinon le plus n'apparait pas....
et le [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
est obligatoire pourqu'il tienne compte de ce que tu saisis...
voir les commentaires et les mises a jour...
et oui apres ca tu peux utiliser tes classes pour tes objets....
c'est du plus belle effet dans ta fenetre propriété :o))))
24 sept. 2004 à 09:50
Mais dis moi dans la classe où tu utilises ta classe Mon_ensemble_de_propriete, c'est un control ?
Quand la propriété s'affiche dans le designer Visual Studio est ce que tu arrives à modifier les propriétés nom et Prénom ? et est ce que les modifications sont reportées aussitôt dans le designer.
Je m'explique en admettant que la classe où tu utilises Mon_ensemble_de_propriete soit un control composite et que dans ce control tu affiches 2 labels où tu affiches Nom et Prénom. Est ce que lorsque tu modifies le nom et l eprénom, le designer met à jour la valeur et rend les nouvelles données insérées ?
24 sept. 2004 à 09:44
c plus simple...donc mieux :o)))
merci...
24 sept. 2004 à 09:05
ben en tout cas ca serait bien plus simple... :o)))
23 sept. 2004 à 20:12
il suffit juste de faire
[TypeConverter(typeof(ExpandableObjectConverter
))].
6 sept. 2004 à 22:59
Cyril
6 sept. 2004 à 18:05
6 sept. 2004 à 18:04
mouis mais ca vaut le coup....
ca marche vachement mieux....
6 sept. 2004 à 18:02
je me demande où est passé mon comment de tout à l'heure
enfin bref il disais :
"lol
je ne savais pas le reste"
6 sept. 2004 à 17:58
Cyril
6 sept. 2004 à 14:42
:o)))
c ca...
ben ca a failli....
j'ai failli t'apprendre un truc....
:o))))))))))
6 sept. 2004 à 14:36
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Mon_ensemble_de_propriete Mais_qui_est_Arthenius
{
get
{
return Arthenius;
}
set
{
Arthenius=value;
}
}
6 sept. 2004 à 14:22
:o)))))))))
6 sept. 2004 à 14:12
il me semble qu'il faut que tu regardes du côté de DesignerSerializer et/ou DesignerSerializerVisibility
6 sept. 2004 à 14:00
en fait quand en design on saisie directement les propriétés, on arrive pas à les récupérer en code...
Null object reference...
par contre si dans le code tu assigne ces propriétés...
ben ca fonctionne...
donc il doit manquer kkchose kkpart...
je cherche et je mettrais à jour ...si je trouve...
6 sept. 2004 à 09:08
chuuuuuuut ;)
6 sept. 2004 à 08:56
Jesusonline a poster un source faisant la meme chose en vb : http://www.vbfrance.com/code.aspx?ID=25937
pour ce qui est de deatil sur les objet converter....
ben forcement vu que j'ai betement traduit....
:o)))))
connait pas...
sorry...
mais bon sur le principe tout ce joue dans la fonction convertTo...
c'est la que tu appel le constructeur de ta classe...
pour une fois que j'ai trouver kkchose que coq ne connaissait pas :o))))
5 sept. 2004 à 10:22
Enfin c'est bon à savoir :)
Merci
4 sept. 2004 à 11:06
3 sept. 2004 à 19:19
En tout cas beau boulot. (8/10)
Merci :)
@+