user1173240 user1173240 - 1 month ago 20
C# Question

Pass click event of child control to the parent control

I have a Windows form, having a pane, which contains another class, derived from Windows Forms. This is contained as a control within the pane. It contains two buttons within itself.

I'd like the events of the child control to be passed all the way to the parent window. For example, the child window in the pane has a

Cancel
button, which is supposed to close it. I'd like the parent control, i.e., the main window to close as well, but how can I intercept the button click event of the child control?

I can modify the child control, but only if there is no other way to achieve this in a proper way, I'd rather like to avoid it.

Answer

Whilst you can interact with parent form directly from child, It's better to raise some events by child control and subscribe for the events in parent form.

Raise event from Child:

public event EventHandler CloseButtonClicked;
protected virtual void OnCloseButtonClicked(EventArgs e)
{
    var handler = CloseButtonClicked;
    if (handler != null)
        handler(this, e);
}
private void CloseButton_Click(object sender, EventArgs e)
{
    //Whilst you can call `this.ParentForm.Close()` it's better to raise an event
    OnCloseButtonClicked(e);
}

Subscribe and use event in Parent:

//Subscribe for event using designer or in form load
this.userControl11.CloseButtonClicked += userControl11_CloseButtonClicked;

//Close the form when you received the notification
private void userControl11_CloseButtonClicked(object sender, EventArgs e)
{
    this.Close();
}