先に行って撃ちます。
があるとしましょうUserControl
。次のように見えるとします。

ここで、存在する 4 つの異なるコントロール ( 、 、 、および 自体) に対して次のハンドラーを作成しClick
たとします。Button
ListView
RadioButton
UserControl
public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
}
private void radioButton1_Click(object sender, EventArgs e) {
MessageBox.Show("RadioButton");
}
private void listView1_Click(object sender, EventArgs e) {
MessageBox.Show("ListView");
}
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("Button");
}
private void UserControl1_Click(object sender, EventArgs e) {
MessageBox.Show("UserControl");
}
}
私が言っていることを明確にするために、.designer.cs
ファイルの次のサブセットを確認してください。
...
this.radioButton1.Click += new System.EventHandler(this.radioButton1_Click);
...
this.button1.Click += new System.EventHandler(this.button1_Click);
...
this.listView1.Click += new System.EventHandler(this.listView1_Click);
...
this.Click += new System.EventHandler(this.UserControl1_Click);
...
以下のアファメーションを検討してください。
この青い領域をクリックすると:

ハンドラーが呼び出され、UserControl1_Click
"UserControl" メッセージ ボックスが表示されます。
この他の青い領域をクリックすると:

「listView1_Click」ハンドラーが呼び出され、「ListView」メッセージ ボックスが表示されますが、「 UserControl」メッセージ ボックスは表示されません。
これは、残りの両方のコントロールであるボタンにも当てはまります。

そしてラジオボタン:

UserControl
最終的なコンテナーの観点から を見て、イベントが表示され、そのイベント ハンドラーを追加している場合、ここに示されているイベント ハンドラーClick
の動作とまったく同じ動作を期待する必要があります。UserControl1_Click
必要に応じて、子コントロールの特定のセット用のカスタム イベント ハンドラーを作成し、外部の世界にあるハンドラーのサブスクリプションとサブスクリプション解除をそのイベントとの間で単純にリダイレクトすることができます。
public event EventHandler SmallButtonsClick {
add {
this.radioButton1.Click += value;
this.button1.Click += value;
}
remove {
this.radioButton1.Click -= value;
this.button1.Click -= value;
}
}
public event EventHandler LargeStuffClick {
add {
this.listView1.Click += value;
}
remove {
this.listView1.Click -= value;
}
}
または、すべての子コントロールと UserControl 自体に動的な方法でハンドラーをサブスクライブすることもできます。
public event EventHandler AnythingClick {
add {
this.Click += value;
foreach (var child in this.Controls)
child.Click += value;
}
remove {
this.Click -= value;
foreach (var child in this.Controls)
child.Click -= value;
}
}
そして、周囲の世界からそれを使用するだけです:
UserControl1 someControl = new UserControl1();
someControl.AnythingClick += (sender, e) => MessageBox.ShowMessage("tadaaa!");