Expert Système : Récupérer Variable par une String

Résolu
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 - 7 juin 2006 à 15:20
dgouttegattat Messages postés 129 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 30 décembre 2007 - 13 juin 2006 à 13:01
Bon voila...Je suis un peu ambitieux mais bon je tente kememe..
Matos : C#
J'aimerais savoir si il y a une fonction système qui permet de récupérer une variable grâce à son nom en String???
Dacord je vous fait un pti exemple...meme pt 2...

Appelons cette fonction mystérieuse FctMagique

avec comme prototype : Object FctMagique(String)

int a=5;
......

et dans le code par exemple :
((int)FctMagique("a"))=12;

Et un autre exemple ca fait pas de mal...
Label Label1;
Label Label2;
Label Label3;

for (int i=1;i<4;i++) ((Label)FctMagique("Label"+i.ToString())).Text="Ceci est le Label " + i.ToString();

Voila je crois que le dernier est un peu plus parlant...
Je vais pas dire qu'une solution serait vital mais.....vraiment presque...car j'ai environ 40 Labels.....alors imaginez...

Ah oui derniere remarque...Bien sur la solution serait de passer carrement par un Tableau d'Object mais vu les circonstances je ne peux pas alors c'est pour ca qu'il me faudrait cette fonction magique
Il n'y a vraiment que cette solution pour me sauver la vie alors...si un expert passe par la...

Un grand merci, voir meme une ola pour celui qui trouvera la solution !!!

7 réponses

Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 2
7 juin 2006 à 18:03
Bon pour ceux qui passe par la, la solution en ASP.NET est d'utiliser la fonction FindControl :

    protected System.Web.UI.WebControls.Label Label1;
    protected System.Web.UI.WebControls.Label Label2;
    protected System.Web.UI.WebControls.Label Label3;
    protected System.Web.UI.WebControls.Label Label4;

...

for (int i=1;i<=4;i++) ((Label)this.FindControl("Label" + i.ToString())).Text="coucou cest le label " + i.ToString();

...
Par contre pour avoir la liste je galere encore un peu...

///////////////////////////////////////
Par contre ca ma donner une idée pour cette fonction magique!Surtt pour la version C++!
Etant donner que la ce sont des classes imbriqués ce sont forcement des listes de types à l'intérieur.
Donc il faut forcement les stocker et faire la correspondance entre les noms et le control
DONC! Ben comme en C++ il n'y a que des types primitifs, ben pour que ca marche il suffit de créer la meme chose quand C# avec les controls
Cest a dire un tableau qui fait la correspondance entre les nom(string) et les variables (Pointeur)
Du style :
List<String,void*> LstCrtl =new List<String,void*>;
int a=5;
String huhu="je suis la !";
...
LstCrtl.add("a",&a);
LstCrtl.add("huhu",&huhu);
...etc
enfin ce n'est qu'une idée apres pour le code, il faut poffiner un peu...

Merci kememe! J'avance a grand pas maintenant
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
7 juin 2006 à 16:10
Juste par curiosité, pourquoi le tableau ne marche pas ?

Autrement, une liste ou un dictionnaire peuvent aussi faire l'affaire.

Amicalement, SharpMao
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
7 juin 2006 à 16:15
Salut,


Une petite boucle sur tous les contrôles de ta feuille permet d'en
extraire les labels (à condition, dans l'exemple ci-dessous, que leurs
noms soient label1, label2, label3, ... )





            String indice = "";

            foreach (Control ctrl in this.Controls)

            {

               
if (ctrl.Name.Substring(0, 5) == "label")

                {

                   
indice = ctrl.Name.Substring(5);

                   
ctrl.Text = "Je m'appelle Label" + indice;

                }

            }
















Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 2
7 juin 2006 à 16:28
Arf!!
Presque!
ouais c'est ca que je veux!
C'est vrai que je n'y avait pas penser étend donnée que je suis dans une classe qui hérite et qui hérite encore.........
Mais le problème est que je suis en ASP.NET

du coup...yorai moyen de l'adapter??
Car dans le type control, il n'y a pas de methode name, et en fesant la liste je n'est rien trouver...

 public class Test1 : System.Web.UI.Page
 {
    protected System.Web.UI.WebControls.Label Label1;
    protected System.Web.UI.WebControls.Label Label2;
    protected System.Web.UI.WebControls.Label Label3;
    protected System.Web.UI.WebControls.Label Label4;
    protected System.Web.UI.WebControls.DataGrid DataGrid1;
 
  private void Page_Load(object sender, System.EventArgs e)
   {
      String indice = "";
      foreach (Control ctrl in this.Controls)
      {
        if (ctrl.Name.Substring(0, 5) == "label")
        {
          indice = ctrl.Name.Substring(5);
          ctrl.Text = "Je m'appelle Label" + indice;
        }
      }
    }
}

merci d'avance

PS: Par contre si quelqu'un à quand meme trouver la fonction magique qu'il n'hésite pas!
Car pour les "int" ca ne marche pas...
0

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

Posez votre question
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
7 juin 2006 à 16:38
Alors, tente ta question sur le forum d'
ASPFr.com

Là, je bloque aussi.





Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 2
7 juin 2006 à 16:55
Ok
Merci pour l'idée ca assure!
0
dgouttegattat Messages postés 129 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 30 décembre 2007 3
13 juin 2006 à 13:01
Bonjour à tous,

J'arrive en retard, juste pour indiquer qu'il existe un moyen relativement simple de récupérer la valeur d'une variable à partir de son nom en utilisant la réflection :


<hr />

// myType est le type dans lequel la variable recherchée est définie
// (obtenu par typeof() ou .GetType())

FieldInfo field = myType.GetField("variableName", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
   // Si le champ est statique
   object val = field.GetValue(null);

   

// Si c'est une variable d'instance, alors il faut passer en paramètre
   // une instance du type myType

   object val = field.GetValue(instanceOfMyType);
}
else
{
   // champ non trouvé
}
<hr />Cela ne permet bien sûr de récupérer que les variables définies dans un type (un champ dans une classe ou une structure). Les variables locales (définies dans une méthode)  ne peuvent pas être récupérées de cette manière. En fait, je ne pense pas qu'il soit possible de récupérer la valeur d'une variable locale à partir de son nom, dans la mesure où le nom des variables locales n'est pas stocké dans le code MSIL (elles sont référencées par leur index).
0
Rejoignez-nous