我会继续拍摄。
假设我们有一个UserControl
. 说它看起来像这样:
Click
现在,假设您为存在的 4 个不同的控件(the Button
、the ListView
、theRadioButton
和 theUserControl
本身)编写了以下处理程序:
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!");