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
59
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
5
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
17471
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
29 juin 2022
599
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