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

[Résolu]
Signaler
Messages postés
12
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
11 juin 2009
-
Messages postés
12
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
11 juin 2009
-
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 !
A voir également:

9 réponses

Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
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
Messages postés
12
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
11 juin 2009

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
Messages postés
12
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
11 juin 2009

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
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
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
Messages postés
12
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
11 juin 2009

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...
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
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
Messages postés
12
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
11 juin 2009

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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
*/
Messages postés
12
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
11 juin 2009

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 ...