web-dev-qa-db-ja.com

子コントロールのクリックイベントを親コントロールに渡す

私は、Windowsフォームから派生した別のクラスを含むペインを持つWindowsフォームを持っています。これは、ペイン内のコントロールとして含まれています。それ自体に2つのボタンが含まれています。

子コントロールのイベントを親ウィンドウにすべて渡したいのですが。たとえば、ペインの子ウィンドウにはCancelボタンがあり、それを閉じることになっています。親コントロール、つまりメインウィンドウも閉じたいのですが、子コントロールのボタンクリックイベントをインターセプトするにはどうすればよいですか?

子コントロールを変更できますが、適切な方法でこれを実現する方法が他にない場合にのみ、回避したいと思います。

12
user1173240

子から直接親フォームを操作できますが、子コントロールによっていくつかのイベントを発生させ、親フォームでイベントをサブスクライブすることをお勧めします。

子供からイベントを上げる:

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)
{
    //While you can call `this.ParentForm.Close()` it's better to raise an event
    OnCloseButtonClicked(e);
}

親でイベントをサブスクライブして使用:

//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();
}

イベントの詳細については、以下をご覧ください。

21
Reza Aghaei