Click sur controle dans usercontrol [Résolu]

BasicInstinct 1471 Messages postés mardi 5 février 2002Date d'inscription 20 octobre 2014 Dernière intervention - 8 févr. 2013 à 17:05 - Dernière réponse : BasicInstinct 1471 Messages postés mardi 5 février 2002Date d'inscription 20 octobre 2014 Dernière intervention
- 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

BasicInstinct 1471 Messages postés mardi 5 février 2002Date d'inscription 20 octobre 2014 Dernière intervention - 13 févr. 2013 à 16:39
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BasicInstinct
Whismeril 11534 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 mai 2018 Dernière intervention - 8 févr. 2013 à 17:21
0
Utile
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
BasicInstinct 1471 Messages postés mardi 5 février 2002Date d'inscription 20 octobre 2014 Dernière intervention - 8 févr. 2013 à 17:49
0
Utile
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
Whismeril 11534 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 mai 2018 Dernière intervention - 8 févr. 2013 à 18:02
0
Utile
Et abonner l'ensemble des contrôles de ton UC à la méthode qui va bien?


Whismeril
Commenter la réponse de Whismeril
BasicInstinct 1471 Messages postés mardi 5 février 2002Date d'inscription 20 octobre 2014 Dernière intervention - 9 févr. 2013 à 10:59
0
Utile
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.