Récupérer nom du composant cliqué [Résolu]

Signaler
Messages postés
174
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
9 septembre 2010
-
Messages postés
8
Date d'inscription
dimanche 6 juin 2010
Statut
Membre
Dernière intervention
10 novembre 2016
-
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

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
8
Salut,

Essaye ca

private void button1_MouseClick(object sender, MouseEventArgs e)
 {
            string name = (sender as Control).Name;
 }
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
8
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
}
Messages postés
174
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
9 septembre 2010
5
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.
Messages postés
174
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
9 septembre 2010
5
Merci beaucoup! Bonne soirée et fin d'année.

La connaissance est la plus grande des richesses.
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
8
De rien :)
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
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.
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
8
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.
Messages postés
8
Date d'inscription
dimanche 6 juin 2010
Statut
Membre
Dernière intervention
10 novembre 2016

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;
}
}
Messages postés
8
Date d'inscription
dimanche 6 juin 2010
Statut
Membre
Dernière intervention
10 novembre 2016

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);
}
}
Messages postés
8
Date d'inscription
dimanche 6 juin 2010
Statut
Membre
Dernière intervention
10 novembre 2016

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);
}
Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
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
Messages postés
8
Date d'inscription
dimanche 6 juin 2010
Statut
Membre
Dernière intervention
10 novembre 2016

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,