C#事件
事件和委托一直是C#中不太明白的东西,今天在项目上遇到一个问题。界面A中有个TreeView,点击按钮控件,弹出一个模糊查找界面B,在界面B中只有三个控件,分别是编号、ID和下一个的按钮。最终实现的要求是点击下一个,TrewView可以实现从头节点往下查找,直到找到需要的节点为止。当初不知道怎么实现了,后来翻书找到了可以用事件来实现。
事件介绍
事件是基于委托来实现的。委托是一种将方法当做参数来进行传递的方式。而事件是一种复杂的委托。
实现事件需要由发布事件->订阅事件->触发事件三个步骤组成。举个简单的例子:
妈妈发布一个做饭的例子,具体可看下面的链接,我觉得写得非常好,非常透彻。
实现
现在着手实现我的功能,主要是将B界面的text信息传递到A界面的控件上。
界面A
public partial class Form1 : Form
{
// public delegate void sendMessage(object sender,EventArgsTest e);
//public event sendMessage message;
public Form1()
{
InitializeComponent();
}
//定义一个事件处理类
public void SendMd(object sender,TextEventAgs e)
{
textBox1.Text = e.textName;
}
public void SendMd2(object sender, TextEventAgs e)
{
textBox2.Text = e.textName + "ok";
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f1 = new Form2();
//订阅事件
f1.newTextEvags += SendMd;
f1.newTextEvags += SendMd2;
f1.Show();
//SendMd();
}
界面B
public partial class Form2 : Form
{
//类2中用event定义一个事件处理委托
public event EventHandler<TextEventAgs> newTextEvags;
public Form2()
{
InitializeComponent();
}
//事件发布方法
public void SendMessage(string text)
{
EventHandler<TextEventAgs> s1 = newTextEvags;
//如果有人订阅了事件,进行事件处理
if (s1 != null)
{
//事件触发
s1(this, new TextEventAgs(text));
}
}
private void Form2_Load(object sender, EventArgs e)
{
// f1.sendMessageFromForm += SendMessage;
}
private void button1_Click(object sender, EventArgs e)
{
//事件触发
SendMessage(textBox1.Text);
}
}
事件中间类
public class TextEventAgs : EventArgs
{
public string textName { get; set; }
public TextEventAgs(string name)
{
textName = name;
}
}
遵循事件处理的流程-发布事件-订阅事件-触发事件
现象
点击Form2中的按钮,就可以把textBox中的text传递到form1中,这样的处理比直接传参方便的多。事件的处理真是简单、高效!