Click sur controle dans usercontrol [Résolu]

Messages postés
1471
Date d'inscription
mardi 5 février 2002
Dernière intervention
20 octobre 2014
- 8 févr. 2013 à 17:05 - Dernière réponse :
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Dernière intervention
20 octobre 2014
- 13 févr. 2013 à 16:39
Bonjour la communauté.

Je vous expose mon problème (bah oui, j'ai un problème, sinon je posterai pas un message )

Je créé dynamiquement sur une form, un ensemble de UserControl.

MonUC UC=  new MonUC();
UC.Parent = panelWF;
UC.BackColor = Color.LightGray;
UC.Dock = DockStyle.Top;
UC.BringToFront();
UC.Click +=   UC_Click ;


a l'interieur de mon usercontrol, j'ai des label, panel etc.

J'ai besoin qu'une action soit effectuée sur le click de mon UC sans distinction du sous-control cliqué.

J'ai donc rajouté dans le code de mon UC
public new event EventHandler Click
        {
            add
            {
                base.Click +  = value;
                foreach (Control control in Controls)
                {
                    control.Click += value;
                }
            }
            remove
            {
                base.Click -= value;
                foreach (Control control in Controls)
                {
                    control.Click -= value;
                }
            }
        }


C'est cool, ça marche du tonnerre... MAIS (bah oui )

dans la methode UC_Click, j'ai un traitement selon le sender (casté par interface, bref c'est pas le sujet)

or si je click sur un sous-control de mon UC : le sender, c'est le control et non l'UC. Donc ne répond a aucune interface


Donc voila ma question : (enfin...)
Comment doit on coder ce comportement pour que le sender du click soit le UserControl et non un des controls sous-jacents.

Réponse refusée d'office : tu n'as qu'a faire ((Control)sender).Parent
j'ai déjà de la création dynamique de control dans mon UC, et je voudrai éviter de chercher des .Parent.Parent.Parent.Parent.Parent....


merci d'avoir lu jusqu'au bout ^^

BasicInstinct
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Dernière intervention
20 octobre 2014
- 13 févr. 2013 à 16:39
3
Merci
Bah non après multiples tests ça ne marche pas correctement.

Ça c'est beaucoup plus logique

public void Ctrl_Click(Object sender, EventArgs e)
{
            OnClick(e);
}

private void UC_Load(object sender, EventArgs e)
{
foreach (Control Ctrl in this.Controls)
   Ctrl.Click += new EventHandler(Ctrl_Click);
}



BasicInstinct

Merci BasicInstinct 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de BasicInstinct
Messages postés
12257
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 8 févr. 2013 à 17:21
0
Merci
T'as essayé de mettre la base du contrôle à Keypreview = true? Je ne sais pas si ça marche pour le click.


Whismeril
Commenter la réponse de Whismeril
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Dernière intervention
20 octobre 2014
- 8 févr. 2013 à 17:49
0
Merci
Si ça pouvait être fait au niveau d'un UC ça serait top, mais ça se fait au niveau de la Form.
Au vu de la complexité de mon interface, c'est pas envisageable.

A priori ça ne marche que pour les événements clavier.


BasicInstinct
Commenter la réponse de BasicInstinct
Messages postés
12257
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 8 févr. 2013 à 18:02
0
Merci
Et abonner l'ensemble des contrôles de ton UC à la méthode qui va bien?


Whismeril
Commenter la réponse de Whismeril
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Dernière intervention
20 octobre 2014
- 9 févr. 2013 à 10:59
0
Merci
Y'a des fois, on se complique la vie pour rien

Dans le code du UC a la place de ce qui etait deja codé :

public delegate void ClickEventHandler(object sender, EventArgs e);
public new event ClickEventHandler Click = delegate { };




public void Ctrl_Click(Object sender, EventArgs e)
{
            Click(this, e);
}

private void UC_Load(object sender, EventArgs e)
{
foreach (Control Ctrl in this.Controls)
   Ctrl.Click += new EventHandler(Ctrl_Click);
}


Et voila, je récupère bien le bon objet dans ma méthode.

BasicInstinct
Commenter la réponse de BasicInstinct

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.