2008-10-07 10 views
3

J'ai un contrôle personnalisé que j'ai créé pour mon projet. Dans ce contrôle, il existe plusieurs contrôles enfants comme un Label, un PictureBox et un LinkLabel. Autre que le LinkLabel, je veux l'événement de la souris sur le contrôle parent et avoir le contrôle répondre à la souris. La couleur d'arrière-plan change lorsque vous passez la souris sur le contrôle, mais la couleur d'arrière-plan ne change pas lors d'un contrôle enfant; C'est parce qu'il n'y a aucun événement MouseEnter et MouseLeave sur le contrôle enfant. J'ai résolu ce problème en ajoutant les méthodes déléguées des contrôles parents aux contrôles enfants. Le problème demeure que l'événement click est également ignoré sur les contrôles enfants lorsque j'ai souscrit à l'événement click sur mon contrôle parent. Je peux m'abonner à chaque contrôle enfant individuel, mais comment puis-je forcer l'événement click du contrôle parent? Le terme que j'ai trouvé en effectuant une recherche est Event Bubbling, mais cela ne semble s'appliquer qu'aux technologies et frameworks ASP.NET. Aucune suggestion?C# WinForms UserControl Mouse Aide de l'événement

Répondre

2

Votre description me porte à croire que vous voulez que votre enfant et vos contrôles parent répondent à un clic sur le contrôle enfant. Si je comprends bien votre question, je vous suggère de vous abonner aux événements click de vos contrôles enfants et, dans ces gestionnaires d'événements, d'appeler une méthode commune qui manipule l'état du UserControl parent de la manière que vous désirez (par exemple , en changeant la couleur de fond).

1

Il semble que quelqu'un d'autre l'a résolu pour moi. Un ami a expliqué que les contrôles C# prennent en charge une méthode appelée InvokeOnClick (Control, EventArgs);

J'ai ajouté mes méthodes de délégué d'événement à chaque contrôle enfant, et pour l'événement click, j'ai créé une méthode unique pour chaque contrôle enfant à utiliser. Cela appelle à son tour InvokeOnClick (this, new EventArgs());


private void Control_Click(object sender, EventArgs e) 
{ 
    // this is the parent control. 
    InvokeOnClick(this, new EventArgs()); 
} 

private void IFLVControl_MouseEnter(object sender, EventArgs e) 
{ 
    this.BackColor = Color.DarkGray; 
} 

private void IFLVControl_MouseLeave(object sender, EventArgs e) 
{ 
    this.BackColor = Color.White; 
} 
1

J'ai eu un problème similaire avec gestion de l'événement Click dans tous les contrôles enfants. Le code est VB.NET mais il devrait être facilement ajustable.

Public Shared Sub RelayEvents(ByVal usrcon As Windows.Forms.Control, ByVal del As System.EventHandler, Optional ByVal includeChildren As Boolean = True) 
    For Each con As Windows.Forms.Control In usrcon.Controls 
     AddHandler con.Click, del 
     If includeChildren Then 
      RelayEvents(con, del) 
     End If 
    Next 
End Sub 

Chaque fois que la cascade souhaitée est nécessaire, la ligne suivante peut être ajoutée au constructeur de la classe.

CustomMethods.RelayEvents(Me, New EventHandler(AddressOf Me_Click))