OVH Cloud OVH Cloud

a propos de PropertyInfo et GetValue()

6 réponses
Avatar
cyrille
Bonjour,

J'essaye de r=E9cup=E9rer les valeurs utilisateur d'un ensemble de contro=
les.
Suivant le type des controles je vais devoir lire la propri=E9t=E9 Text p=
our les TextBox ou Value pour les NumericUpDown.
Alors j'essaye de la fa=E7on suivante, mais =E7a ne fonctionne pas ...

foreach( Control c in this.Controls )
{
string v ;
System.Type t =3D c.GetType();
// r=E9cup de 'Text'
System.Reflection.PropertyInfo pi =3D t.GetProperty( "Text" );
if( pi =3D=3D null )
{
// Si pas de Text, alors essaye 'Value'
pi =3D t.GetProperty( "Value" );
}
if( pi !=3D null )
{
// cette ligne donne l'erreur :
// Une exception non g=E9r=E9e du type 'System.Reflection.TargetExcepti=
on' s'est produite dans mscorlib.dll
// Informations suppl=E9mentaires : Une m=E9thode non static requiert u=
ne cible.
//
Debug.WriteLine( pi.GetValue(null,null) );
}
}

Auriez vous une id=E9e de ce qui ne va pas dans ce code ?

merci
cyrille

6 réponses

Avatar
Zazar
Bonjour,

J'essaye de récupérer les valeurs utilisateur d'un ensemble de controles.
Suivant le type des controles je vais devoir lire la propriété Text pour
les TextBox ou Value pour les >NumericUpDown.
Alors j'essaye de la façon suivante, mais ça ne fonctionne pas ...

foreach( Control c in this.Controls )
{
string v ;
System.Type t = c.GetType();
// récup de 'Text'
System.Reflection.PropertyInfo pi = t.GetProperty( "Text" );
if( pi == null )
{
// Si pas de Text, alors essaye 'Value'
pi = t.GetProperty( "Value" );
}
if( pi != null )
{
// cette ligne donne l'erreur :
// Une exception non gérée du type 'System.Reflection.TargetException'
s'est produite dans mscorlib.dll
// Informations supplémentaires : Une méthode non static requiert une
cible.
//
Debug.WriteLine( pi.GetValue(null,null) );
}
}

Auriez vous une idée de ce qui ne va pas dans ce code ?


La méthode GetValue est, comme le précise l'erreur, non statique. Ca
signifie qu'il lui faut un objet sur lequel s'appliquer. Si vous lui passer
null, c'est un peu comme si vous faisiez TextBox.Text au lieu de faire
myTextBox.Text (en supposant que myTextBox soit une variable de type
TextBox). Pour corriger ça, passez votre objet c en paramètre de la méthode.
Sinon une autre façon de faire serait de tester le type de c:
TextBox myTextbox = c as TextBox;
if (myTextBox != null) {
Debug.WriteLine(myTextBox.Text);
}
NumericUpDown my numericUpDown = c as NumericUpDown;
if (myNumericUpDown != null) {
...
}

--
Zazar
Avatar
cyrille
Zazar wrote:

La méthode GetValue est, comme le précise l'erreur, non statique. C a
signifie qu'il lui faut un objet sur lequel s'appliquer. Si vous lui pa sser
null, c'est un peu comme si vous faisiez TextBox.Text au lieu de faire
myTextBox.Text (en supposant que myTextBox soit une variable de type
TextBox). Pour corriger ça, passez votre objet c en paramètre de la méthode.



Merci , ça fonctionne :

System.Type t = c2.GetType();
System.Reflection.PropertyInfo pi ;
pi = t.GetProperty( "Text" );
if( pi == null )
{
pi = t.GetProperty( "Value" );
}
if( pi != null )
{
Debug.WriteLine( pi.GetValue( c2,null) );
}

par contre, je me demande pourquoi
il faut d'abord créer la PropertyInfo à partir du contrôle
pour ensuite faire appel à la méthode PropertyInfo.GetValue()
en repassant une nouvelle fois la réf au controle ?

cyrille
Avatar
Zazar
> par contre, je me demande pourquoi
il faut d'abord créer la PropertyInfo à partir du contrôle
pour ensuite faire appel à la méthode PropertyInfo.GetValue()
en repassant une nouvelle fois la réf au controle ?



Regardez bien votre code : la PropertyInfo n'est pas créée à partir du
contrôle, mais à partir de son type.

--
Zazar
Avatar
cyrille
Zazar wrote:
par contre, je me demande pourquoi
il faut d'abord créer la PropertyInfo à partir du contrôle
pour ensuite faire appel à la méthode PropertyInfo.GetValue()
en repassant une nouvelle fois la réf au controle ?




Regardez bien votre code : la PropertyInfo n'est pas créée à part ir du
contrôle, mais à partir de son type.



Merci beaucoup pour votre clairvoyance ;o)
bonne journée,
cyrille
Avatar
Mitsuru FURUTA [Ms]
Bonjour à tous,

J'ajoute un tout petit grain de sel :-).

La solution "PorpertyInfo" est certes plus universelle mais moins objet et
surtout plus lente que de tester le type.

Dans la boucle For, tu peux tester:

if (c is TextBox) {
((TextBox) c).Text = ...
}
if (c is NumericUpDown) {
((NumericUpDown) c).Value = ...
}

Bonne continuation,

Mitsuru FURUTA [Microsoft FRANCE]

"cyrille" wrote in message
news:
Zazar wrote:
par contre, je me demande pourquoi
il faut d'abord créer la PropertyInfo à partir du contrôle
pour ensuite faire appel à la méthode PropertyInfo.GetValue()
en repassant une nouvelle fois la réf au controle ?




Regardez bien votre code : la PropertyInfo n'est pas créée à partir du
contrôle, mais à partir de son type.



Merci beaucoup pour votre clairvoyance ;o)
bonne journée,
cyrille
Avatar
cyrille
In article ,
says...
La solution "PorpertyInfo" est certes plus universelle mais moins objet e t
surtout plus lente que de tester le type.

Dans la boucle For, tu peux tester:

if (c is TextBox) {
((TextBox) c).Text = ...
}
if (c is NumericUpDown) {
((NumericUpDown) c).Value = ...
}



Merci Mitsuru pour ce bon grain :-)

Mais avec cette solution il faut expliciter tous les types de contrôles,
alors qu'avec PropertyInfo("Text") et ("Value") on touche un maximum de
contrôles ... Même ceux dont on ne connait pas le type.

cyrille