I havea a UserControl1 (in witch I have an Label1) in Form1. I want to catch the MouseDown event from Label and send it like it was from UserControl.
I do:
Public Class UserControl1
Shadows Custom Event MouseDown As MouseEventHandler
AddHandler(ByVal value As MouseEventHandler)
AddHandler Label1.MouseDown, value
End AddHandler
RemoveHandler(ByVal value As MouseEventHandler)
RemoveHandler Label1.MouseDown, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As MouseEventArgs)
'RaiseMouseEvent(Me, e) ??? '
End RaiseEvent
End Event
End Class
However, when I set in the Form1 the UserControl
Private Sub UserControl11_MouseDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles UserControl11.MouseDown
' here I have "Label", BUT want "UserControl" '
MessageBox.Show(sender.GetType.Name)
End Sub
One detail.. I want that the event should be only on the label, not on the whole userControl.
Why don’t you just handle the event “old school” and delegate it, instead of creating a custom event? Like so:
Now when you handle the
UserControl.MouseDownevent in your form, the sender of the event will be the user control instance.If you only want to capture clicks on the label (instead of on the whole user control) then you can override
OnMouseDownto test from where the click originates:This should be safe in the face of race conditions since there’s only one UI thread.
By the way:
RaiseMouseEventcannot be used here since the first argument would have be theMouseDownevent property. However, this property cannot be accessed from derived classes, only inside theControlclass itself. I don’t know whyRaiseMouseEventisn’t private itself, instead of being protected, when it can’t be used from derived classes anyway.