Click sur controle dans usercontrol

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

5 réponses

BasicInstinct
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Statut
Membre
Dernière intervention
20 octobre 2014
12
13 févr. 2013 à 16:39
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
3
Whismeril
Messages postés
17646
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
9 août 2022
612
8 févr. 2013 à 17:21
T'as essayé de mettre la base du contrôle à Keypreview = true? Je ne sais pas si ça marche pour le click.


Whismeril
0
BasicInstinct
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Statut
Membre
Dernière intervention
20 octobre 2014
12
8 févr. 2013 à 17:49
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
0
Whismeril
Messages postés
17646
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
9 août 2022
612
8 févr. 2013 à 18:02
Et abonner l'ensemble des contrôles de ton UC à la méthode qui va bien?


Whismeril
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BasicInstinct
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Statut
Membre
Dernière intervention
20 octobre 2014
12
9 févr. 2013 à 10:59
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
0