C#中event是用于发布订阅事件,一般和委托delegate配合使用。
如果要使用event,就要先搞清楚四个东西
- 发布者(publisher),发布某个事件的类或结构。
- 订阅者(subscriber),注册在事件发生时得到通知的类或结构。
- 事件处理程序(event handler),订阅者收到通知时要执行的方法。
- 触发(raise)事件,就是发布通知(依次执行委托列表的方法)。
比如我们写了一个弹窗组件popwindow,上面有输入框、确定按键和取消按键三个控件。这个弹窗组件可以被不同Form调用,进行一些文字输入。当按下弹窗的确定按键,则获取输入框的文字,按下取消按键则不理会。
如果不使用EVENT,一般使用以下方法:
方法一,可以用反射(Reflaction),但是这样太笨重了。
方法二,在 popwindow 类中直接写 调用它的窗体 的实例.但这样的设计很不灵活,不同的Form调用起来非常不方便。
如果用Event,可以在popwindow中发布事件,需要调用的Form订阅这个事件,并为事件指定处理程序,最后由popwindow触发该事件。
public partial class InputPopWindow : Form
{
public InputPopWindow()
{
InitializeComponent();
}
public delegate void CallHandler(string msg);//用委托类型来定义传入参数是String
public event CallHandler OkClickedEvent; //发布事件
private void button2_Click(object sender, EventArgs e)
{
OkClickedEvent(textBox1.Text); //触发事件
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
在需要调用InputPopWindow的Form中订阅事件
private void button1_Click(object sender, EventArgs e)
{
InputPopWindow inputPopWindow = new InputPopWindow();
inputPopWindow.OkClickedEvent += ShowInput; //订阅事件,并指定处理方法
inputPopWindow.Show();
}
void ShowInput(String title)
{
MessageBox.Show(title);
}