Acceder à une propriete

LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 - 14 avril 2009 à 12:15
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre 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.

6 réponses

titeoe Messages postés 433 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 4 décembre 2009 1
15 avril 2009 à 08:50
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.
0
LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 5
15 avril 2009 à 10:40
Ah ben ça alors...tu m'apprends un truc! Merci beaucoup.

La connaissance est la plus grande des richesses.
0
LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 5
15 avril 2009 à 11:04
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.
0
titeoe Messages postés 433 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 4 décembre 2009 1
15 avril 2009 à 11:20
En tappant le nom du composant, tu utilises bien la propriété "Name"
je ne vois pas ou est le probleme.
0

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

Posez votre question
LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 5
15 avril 2009 à 14:59
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.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
18 avril 2009 à 20:51
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
*/
0
Rejoignez-nous