Click sur un UsercControl [Résolu]

Signaler
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
-
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
-
Salut à tous,
J'ai un un UserControl dont l'événement Click est définit et qui contient d'autres contrôles.
J'aimerais que l'événement Click se déclenche même si je clique sur un de ses contrôles enfants.
Merci

7 réponses

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
Dans ton user control :

public event EventArgs UserControlClicked
{
add
{
this.Click += value;
firstControl.Click += value;
secondControl.Click += value;
}
remove
{
this.Click -= value;
firstControl.Click -= value;
secondControl.Click -= value;
}
}

Les objets utilsiant ton user control n'ont plus qu'a sabonner a ton evenement UserControlClicked.
tu peux aussi faire ca en bouclant :
add
{
this.Click += value;
foreach (Control c in this.Controls)
{
c.Click += value;
}
}

ensuite cest transparent pour ceux qui s'abonnent
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
7
Salut,

je ne sais pas si ca marcherait, mais tu pourrais aussi t'abonner a l'evenement ControlAdded de ton User control.
Et la, tu t'abonnes a l'evenement click du control

private void UserControl_ControlAdded(object sender, ControlEventArgs e)
        {
            e.Control.Click+= new EventHandler(Control_Click);
        }

L'avantage est que ca marche meme si tu ajoutes des controls dynamiquement.
C'est juste une idee, pas testee.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Je propose quelque chose dans ce style:


using System;

using System.Windows.Forms;

namespace Bidou
{
  
public
class
ContainerLevelMouseEventsMessageFilter :
IMessageFilter
   {
     
private
const
int WM_LBUTTONDOWN = 0x0201;
     
private
Control _container =
null;
     
public
event
MouseEventHandler MouseClick =
null;

     
public ContainerLevelMouseEventsMessageFilter(
Control container)
      {
        
if (container ==
null)
throw
new
ArgumentNullException(
"container is null");
        
this._container = container;
        
this._container.Disposed +=
new
EventHandler(
this.container_Disposed);
      }

     
protected
virtual
void OnMouseClick(
MouseButtons mouseB,
int nbClick,
int x,
int y,
int delta)
     {
        
MouseEventArgs e =
new
MouseEventArgs(mouseB, nbClick, x, y, delta);
        
if (
this.MouseClick !=
null)
this.MouseClick(
this._container, e);
      }

     
public
bool PreFilterMessage(
ref
Message m)
      {
        
if (m.Msg == WM_LBUTTONDOWN)
        {
           
Control ctrl =
Control.FromHandle(m.HWnd);
            if (ctrl !null && (ctrl
this._container ||
this._container.Contains(ctrl)))
           {
              
this.OnMouseClick(
MouseButtons.Left, 1, 10, 10, 10);
// Récuprer les vraies valeurs...
               return
true;
            }
        }
       
return
false;
      }

   
private
void container_Disposed(
object sender,
EventArgs e)
    {
        t
ry
        {
           
this._container =
null;
          
Application.RemoveMessageFilter(
this);
        }
       
catch { }
     }
  }
}


<hr />
-My Blog-
Messages postés
198
Date d'inscription
mardi 6 août 2002
Statut
Membre
Dernière intervention
29 octobre 2008

Pour chaque UserControl il existe un objet Parent.

Il te suffit de faire this.Parent.Click(Avec tes paramètres)

vaughan
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
3
Salut,
Justement j'aimerai éviter de définir la méthode Click de chaque contrôle enfant.
A+
 
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
3
Salut


[../auteur/LEPROV/311556.aspx leprov],
C'est la première que je vois cette syntaxe avec les mot clé add/remove.
Peut tu m'expliquer un peu plus ton code car je ne l'ai pas bien compris.
Merci
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
3
Salut,
J'ai compilé les réponses et ça fonctionne.
Merci à tous