Récupérer nom du composant cliqué

Résolu
LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 - 3 déc. 2008 à 21:58
AIDExpress Messages postés 8 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 10 novembre 2016 - 12 juin 2012 à 18:50
Hello (ou plustot bonsoir)

J'ai plein de composants sur un formulaire. Certains font la même action que d'autres et sont directement relié au même évènement .
Exemple: je crée un textbox1 puis je vais sur son evenement MouseClick(...) puis je sélectionne un textbox2 et toujours dans la rubrique des évènements je le lie à l'évènement du textbox1 comme ça il fera la meme chose.
J'aimerai connaitre le nom du composant surlequel j'ai cliqué. Comment dois-je m'y prendre? Merci à tous...

La connaissance est la plus grande des richesses.

13 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
4 déc. 2008 à 08:43
Le test DOIT être fait avec 'as', même si on sait que ce sera une TextBox.
Un delegate pouvant pointer sur plusieurs event handler, on est pas à l'abri d'en rajouter un plus tard sur un autre Control, ce qui ferait planter le tout.

<hr />
-Blog-
-Site Perso-
3
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
3 déc. 2008 à 22:18
Salut,

Essaye ca

private void button1_MouseClick(object sender, MouseEventArgs e)
 {
            string name = (sender as Control).Name;
 }
1
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
3 déc. 2008 à 22:44
Salut,

Tu veux changer les proprietes de la textbox qui a declenche l'evenement ?

TextBox txt = (sender as textBox);

if(txt != null)//test au cas au tu aurais connecte d'autres controles que des textboxes
{
txt.Text = "toto"; // change  le texte de la  textbox sur laquelle tu as clique
}
1
LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 5
3 déc. 2008 à 22:39
Tu es vraiment fénoménal. Merci à toi WishhhMaster!!! Ca marche nikel.

Heu ...tant qu'on n'y est...tu saurais pas comment je peux changer la propriété d'un des deux textbox à partir du nom récupéré?
Un truc du genre textbox1.Text = "toto"; sauf que le texbox1 ça serait le nom récupéré.

La connaissance est la plus grande des richesses.
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
3 déc. 2008 à 22:52
Merci beaucoup! Bonne soirée et fin d'année.

La connaissance est la plus grande des richesses.
0
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
3 déc. 2008 à 22:53
De rien :)
0
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
4 déc. 2008 à 05:37
Et comme j'aime précher pour ma paroisse, je trouve que l'écriture

TextBox txt = (TextBox)sender;

est plus intuitive. C'est comme si en c++ tu castais un void* (object) en un pointeur spécifique (textbox), ni plus, ni moins.
0
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
4 déc. 2008 à 06:46
Salut,

Oui peut-être.  Cependant, si l'objet que tu castes n'est pas une textbox, tu auras une belle exception à l'exécution.
Tandis qu'en utilisant "as", si l'objet ne peux pas être casté comme voulu, ça te renvoi null.
C'est pour ça que j'avais marqué
//test au cas au tu aurais connecte d'autres controles que des textboxes

car je ne savais pas si tu connectais seulement des textboxes au même gestionnaire d'évènement.
0
AIDExpress Messages postés 8 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 10 novembre 2016
12 juin 2012 à 17:23
Bonjour,

J'avais un besoin similaire mais il n'est pas tout à fait résolu.

Dans un controle utilisateur je créé des TextBlock sur lesquelles je créé l'évènement MouseLeftButonUp et je les met dans un StackPanel (avec un autre TextBlock sur lesquelle il n'y à pas l'évènement mais qui me servent pour l'espacement).

Mais quand je clique et déclanche l'évènement il me lève l'execption NullReferenceException "La référence d'objet n'est pas définie dans une instance d'un objet" sur ' string myTexboxName = (sender as Control).Name; '.

Je me doute que je doit oublier un truc mais je ne vois plus quoi alors merci de m'aiguiller.

Voici le code de mon control:

public partial class UCAnswers : UserControl
{
public UCAnswers(List<ETAnswer> etAnList)
{
InitializeComponent();
GenUC(etAnList);
this.Tag = 0;
}

public void GenUC(List<ETAnswer> etAnList)
{
for (int i = 0; i < etAnList.Count; i++)
{
sp.Children.Add(NewTB());
sp.Children.Add(NewTB(etAnList[i].ID.ToString(), etAnList[i].Libelle));
}

sp.Children.Add(NewTB());
}

public TextBlock NewTB(string name, string content)
{
TextBlock t = new TextBlock();
t.Name = "tbl_" + name;
t.Text = content;
t.TextAlignment = TextAlignment.Center;

t.MouseLeftButtonUp += new MouseButtonEventHandler(t_MouseLeftButtonUp);

return t;
}

void t_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
string myTexboxName = (sender as Control).Name;

foreach (TextBlock tbl in sp.Children)
{
if (tbl.Name == myTexboxName)
{
tbl.Foreground = new SolidColorBrush(Colors.Green);
LayoutRoot.Tag = myTexboxName.Replace("tbl_", "");
}
else tbl.Foreground = new SolidColorBrush(Colors.Red);
}
}

public TextBlock NewTB()
{
TextBlock t = new TextBlock();
t.Width = 15;
return t;
}
}
0
AIDExpress Messages postés 8 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 10 novembre 2016
12 juin 2012 à 17:44
Non ne dite rien.
Comme d'ab, le temps de se poser deux minutes et...
Comme ca ca marche mieux ^^

void t_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
TextBlock tbl = (sender as TextBlock);

foreach (TextBlock t in sp.Children)
{
if (tbl.Name == tbl.Name)
{
tbl.Foreground = new SolidColorBrush(Colors.Green);
LayoutRoot.Tag = tbl.Name.Replace("tbl_", "");
}
else tbl.Foreground = new SolidColorBrush(Colors.Red);
}
}
0
AIDExpress Messages postés 8 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 10 novembre 2016
12 juin 2012 à 17:51
Oups petite faute... ^^ if (tbl.Name == tbl.Name)

void t_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
TextBlock tbl = (sender as TextBlock);

foreach (TextBlock t in sp.Children)
{
if (t.Name == tbl.Name)
{
tbl.Foreground = new SolidColorBrush(Colors.Green);
LayoutRoot.Tag = tbl.Name.Replace("tbl_", "");
}
else t.Foreground = new SolidColorBrush(Colors.Red);
}
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
12 juin 2012 à 17:56
Bonjour,

je cite NHerny:
[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )


J'ajouterai de faire attention à l'indentation c'est plus lisible pour avoir envie de t'aider.

Il est possible que quelque part tu appelles cette méthode avec le paramètre sender qui serait null soit autre chose qu'un contrôle.

Je te conseille de tester ces deux cas dès la première ligne de ta méthode:

        private void button1_Click(object sender, EventArgs e) // Action du bouton Ajouter // 
        {
            if (sender == null || !(sender is Control)) return;//quitte la méthode si sender ne correspond pas
            ...


Whismeril
0
AIDExpress Messages postés 8 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 10 novembre 2016
12 juin 2012 à 18:50
Bonjour Whismeril,

Merci pour ces indication.
Je n'avais pas fais attention à l'icone pour la coloration syntaxique.
Très utile et bein plus propre c'est évident.

Merci pour ta remarque. Bien que dans le cas de mon appli ce ne peut être le cas je vais mettre ta suggestion de côté. Je vais sûrement en avoir besoin ailleur.

Cordialement,
0
Rejoignez-nous