[C#] Probleme : Variable + Nom d'objet

Résolu
Mentalalex Messages postés 12 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 - 2 oct. 2008 à 10:07
Mentalalex Messages postés 12 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 - 9 oct. 2008 à 15:49
Bonjour a tous,

Jai un petit soucis en ce moment, en effet j'aimerais bien modifier le "Text" de plusieurs bouton dynamiquement grace a un for et un dataset, mais ca ne fonctionne pas : Apres plusieurs recherche, j'ai souvent entendu parler de "reflexion" qui me permetterais de recuperer le nom de l'objet et de le modifier, mais sans reussite :(

Voic le code :



int z;
for (z; z<7; z++)
{Favori_+z.Text Fav+z ds.Tables["favori"+z].Rows[0].ToString();
}



Merci d'avance !

9 réponses

billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
2 oct. 2008 à 13:54
Bonjour,

Si tu travailles sur un projet WinForm (application Windows), tu peux accéder à tous tes contrôles (et les boutons par la même occasion) comme ceci:

int z;
for (z; z<7; z++)
{
string btnName = string.Concat("Favori_", z);
this.Controls[btnName].Text = ds.Tables["favori"+z].Rows[0].ToString();
}

Vérifies quand même tout d'abord que this.Controls[btnName] est différent de null ^^ (sinon, il n'existe pas).

Bon courage,


Billou_13
3
Mentalalex Messages postés 12 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 11 juin 2009
2 oct. 2008 à 10:28
Précision quand au remplisage du dataset dans la meme boucle

                SQL = "SELECT nom_produit, id_fav FROM produits WHERE id_fav='" + z + "'";
                OleDbCommand cmd = new OleDbCommand(SQL, con);
                OleDbDataAdapter adp = new OleDbDataAdapter(cmd);
                DataSet ds = new DataSet();
                adp.Fill(ds, "favori" + z);

La connexion etant initialisé ailleurs et fonctionnant

Merci
0
Mentalalex Messages postés 12 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 11 juin 2009
2 oct. 2008 à 15:09
Merci beaucoup, pour la fonction Concat, que je ne connaisais pas !
Par ailleurs, au niveau de

      if (btnName != null)
                {
                    this.Controls[btnName].Text = ds.Tables["favori" + z.ToString()].Rows[0].ToString();
                }

J'ai ce message : " La reference d'objet n'est pas definit a une instance d'un objet "

Une idée ? :(

Merci d'avance
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
2 oct. 2008 à 15:43
Re,

Le test "btnName != null" est inutile car il retourne toujours vrai.
btnName = string.Concat("Favori_", z); //qui retourne forcément Favori_ + quelque chose.

Le test dont je te parlais est: if(this.Controls[btnName] != null)
Ce test permet de t'assurer que le bouton existe.

Pour ton erreur, elle peut donc venir de:
- le bouton n'existe pas (il faudra donc regarder pourquoi)
- La table ou la ligne de la table dans : ds.Tables["favori" + z.ToString()].Rows[0] n'existe pas non plus.

A toi d'analyser tout ça ^^


Billou_13
0

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

Posez votre question
Mentalalex Messages postés 12 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 11 juin 2009
2 oct. 2008 à 16:09
J'ai analysé tout ca !

Pour verifier que  ce n'etait pas du a la ligne de la table qui n'existait pas, j'ai enlevé ca, et je l'ai remplacé par
z.ToString(); pour afficher sur le bouton, juste son Numéro
et j'ai rajouté la condition que vous avez dis !
Au final j'ai donc :

    if (this.Controls[btnName] != null)
                    {
                        this.Controls[btnName].Text = z.ToString();
                    }
Avant le if, un MessageBox.Show(btnName); renvoi bien Favori_1,Favori_2,...,Favori_6 !
Si je met le msgbox dans la condition, rien ne se produit !

J'en conclu que pour VS2k5, mon bouton n'existe pas, donc il ne peux pas le renommer...

Je suis dans une impasse etant donné que mes boutons portent bien ces noms...
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
2 oct. 2008 à 16:28
Alors là, je ne vois pas ^^

As-tu essayer de passer en mode pas à pas.
Vérifie la valeur (avec l'espion en mode pas à pas) de this.Controls[btnName].
Cela te retourne-t-il bien le bouton en question ???

Si ce n'est pas le cas, executes-tu le code sur la form qui contient les boutons ??? car le "this" renvoi la form courante.

Bon courage,


Billou_13
0
Mentalalex Messages postés 12 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 11 juin 2009
2 oct. 2008 à 18:05
Oui j'execute le code sur la meme form, sinon j'aurais remplacé le this ;)
Je vais posé un espion pour voir...

Je te tiens au courant
MERCI
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 99
4 oct. 2008 à 12:21
Salut,

Un peu de lecture concernant le requête SQL du second message : http://blogs.codes-sources.com/coq/archive/2008/07/05/l-injection-sql-n-est-pas-un-probl-me-que-pour-les-d-veloppeurs-web.aspx

/*
coq
MVP Visual C#
CoqBlog
*/
0
Mentalalex Messages postés 12 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 11 juin 2009
9 oct. 2008 à 15:49
Merci Coq lol,

J'ai remarqué par la suite que mon ds.Tables["favori" + z.ToString()].Rows[0].ToString();
n'etait pas correcte, mais ca ne resoud pas mon probleme

Ce probleme persiste toujours, mais dans un autre cas de figure.

J'entre dans une Textbox, je recupere son nom, et je le met dans une variable.
Puis sur un btn clique, je veux modifier le texte de ce controls, via la variable...
Voici le code
//Dans je focus ma textbox
        private void NumNote_Enter(object sender, EventArgs e)
        {    
   //Je stocke son nom
           string test = "NumNote";
        }
//Quand je clique sur le bouton
     private void Button4_Click(object sender, EventArgs e)

        {
//Je donne au control une variable

           this.Controls[test].Text = "Montexte";

        }

Mais  ca ne marche pas ...
0