Xel
Xel

Reputation: 571

Event handler for a UserControl doesn't fire

My UserControl contains various controls. I made an event handler for its click event. I want the event handler to fire / be called when the user clicks anywhere on my user control.

This is the method I use to add my UserControl to my WinForms application.

private void addContact(some parameters here)
{
     //This is my usercontrol
     contactsListItem.contactsListItem contact = new contactsListItem.contactsListItem();

    //
    //some codes here
    //

    //Adding an event handler for the click event
    contact.Click += new EventHandler(contact_Click);

    //Adding the UserControl to my application
    flowLayoutPanel_contactsList.Controls.Add(contact);
}

The contact_Click(...) event handler should change the background of my UserControl. I have tried stepping into the code to see if the event handler fires and I found out that it doesn't fire no matter where I click on my UserControl.

I have searched through the internet. I encountered terms like delegate, subscribers and publishers.

What should I do to make the event handler for my UserControl's click event to fire?

Upvotes: 3

Views: 4236

Answers (2)

Strillo
Strillo

Reputation: 2972

What is the structure of your user control? Click events are not bubbled in WindForms, hence if you are clicking on a control WITHIN your user control, the latter won't fire any Click event.

enter image description here

EDIT:

The simplest solution is to manually bubble the event from each child by attaching a handler in your user control:

child1.Click += new EventHandler(child_Click);
child2.Click += new EventHandler(child_Click);
child3.Click += new EventHandler(child_Click);

and inside child_Click fire off your Click event:

this.OnClick(e);

Upvotes: 6

MoonKnight
MoonKnight

Reputation: 23833

You seem to be on the right track however it is not clear what your contact here is. Typically you use delegates (essentially pointers to functions) for methods that have arguments to be passed:

if (bDeleteRdClick)
    DeleteRD.Click -= delegate { DeleteRDClick(this.Object); };
DeleteRD.Click += delegate { DeleteRDClick(this.Object); };

where you are sure to remove pre-existing delegates, otherwise they will 'stack-up', firing multiple methods when not required.

For the method above, using an EventHandler seems to me to be the right approach, but as I state above, a check on whether contact is of the correct type would not go unmissed:

if (this.contact.GetType() == typeof(RibbonButton))
{
    RibbonButton Rb = (RibbonButton)contact;
    Rb.Click += new EventHandler(contact_Click);
}

I hope this is of some help.

Upvotes: 0

Related Questions