Acceder à une propriete

Messages postés
175
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
9 septembre 2010
- - Dernière réponse : cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
- 18 avril 2009 à 20:51
Bonjour à tous,

J'ai une classe A qui dérive d'une autre classe B qui dérive elle-même de la classe Component. Une fois le tout généré et la dll insérée dans la boîte à outils de Visual Studio et toutes les références faites je glisse mon composant A sur un formulaire. Mon problême c'est que par le code je n'arrive pas à accéder à la propriété (Name) qui apparait pourtant dans les propriétés en mode Design. Quelqu'un aurait-il une idée car ça devient urgent. Merci.

La connaissance est la plus grande des richesses.
Afficher la suite 

6 réponses

Messages postés
433
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
4 décembre 2009
1
0
Merci
Bonjour,

Je viens de faire le test suivant :

public class A : B {}
public class B : Component{}

Ensuite je glisse le composant de type A sur un formulaire windows.
En mode design je le nomme "foo" (en utilisant la propriété Name)

Ensuite dans le code behind je peux écrire "foo.XXXX" avec XXXX choisit dnas la liste proposée par l'intellisense de VS.

La propriété "Name" vaut donc "foo".

Plus précisément, en faisant ca, on ajoute une propriété nommée "foo" de type "A" à une classe qui hérite de "Form".

Voila, j'esepre que ca répond à ta question.
Commenter la réponse de titeoe
Messages postés
175
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
9 septembre 2010
2
0
Merci
Ah ben ça alors...tu m'apprends un truc! Merci beaucoup.

La connaissance est la plus grande des richesses.
Commenter la réponse de LordOfTheShadow
Messages postés
175
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
9 septembre 2010
2
0
Merci
Désolé mais je crois que tu t'es trompé...Certes on peut accéder au composant en tappant directement son nom mais on n'accede pas à sa propriété Name par le code. J'ai même fait le test avec un Timer et j'ai regardé dans le designer généré par VS. On peut accéder au Name des userControl mais pas des Component... Ou en tout cas personne ne sait... mais merci quand même de l'idée.

La connaissance est la plus grande des richesses.
Commenter la réponse de LordOfTheShadow
Messages postés
433
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
4 décembre 2009
1
0
Merci
En tappant le nom du composant, tu utilises bien la propriété "Name"
je ne vois pas ou est le probleme.
Commenter la réponse de titeoe
Messages postés
175
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
9 septembre 2010
2
0
Merci
Le problême c'est que je ne peux pas la récupérer dans une variable string par exemple. Il y une histoire de ISite, Icomponent mais j'arrive pas à cerner encore cette notion vu que je suis encore étudiant...Est-ce-que je t'ai bien expliqué?
La connaissance est la plus grande des richesses.
Commenter la réponse de LordOfTheShadow
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
66
0
Merci
Bonjour,

Effectivement, c'est bien l'implémentation de ISite utilisée pour le composant en cours qui fourni ce nom quand on le voit dans le designer de Visual Studio.
Malgré la présence de parenthèses autour de "Name" dans la grille de propriétés, nous ne sommes pas vraiment dans le cas de la propriété Name de la classe Control là, mais bel et bien dans un cas particulier où la propriété n'est pas directement liée au type (par son descripteur de type, peu importe que cette propriété soit ajoutée au descripteur à l'exécution

Tu ne devrais pas avoir accès à Component.Site.Name à l'exécution car Component.Site devrait être null : pour faire simple il faut plutôt voir tout ceci comme des éléments utilisés au moment du design, pas de l'exécution.

Si tu as besoin d'utiliser ce nom, tu vas devoir adopter un comportement similaire à celui présent sur la classe Control (qui hérite de Component) :
- définir une propriété Name et lui donner le comportement standard d'une propriété : persistance de la chaine
- la décorer de l'attribut Browsable(false) pour qu'elle n'apparaisse pas dans la grille de propriétés (celle de ISite restera)
- personnaliser un peu l'accesseur get : si Component.Site est définie, tu dois/peux te servir de la valeur de Name
Ainsi, quand hostée dans un designer, get retournera la valeur Component.Site.Name (celle affectée par VS depuis la grille de propriétés) : la génération de code par le designer va donc générer une ligne avec l'affectation du nom saisi.
A l'exécution du code compilé, cette valeur sera affectée à ta propriété, que tu persisteras et retournera directement à l'appel de get car Component.Site sera alors null.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq