MS把所有的工作都做好了 隐藏了大量有意思的东西
常用的事件在VS中已经有了 关于事件我们不需写一行代码
但是在很多时候我们也需要自定义事件 比如说Form间的通信
下面谈谈我对C#事件机制的认识
C#的事件(Event)是建立在委托(delegate 有人译作代表)的基础上的
委托是指向某个函数的指针,相当于C++中的函数指针
事件其实就是委托的一个实例
例如委托和事件可以这样声明
delegate void MyDelegate(); //这里委托的参数表要与指向的函数一致
event MyDelegate myEvent();
事件与响应的函数用+=链接
如
void Function() //响应事件的函数 这里参数表要与委托的一致
{
//事件响应
}
myEvent+=new MyDelegate(Function); //事件连接
下面是我写的部分代码用来实现Form间的通信
AddMemberForm添加信息后通知更新DataGridView的数据
AddMemberForm:
namespace
MemberManage
... {
public delegate void CallBack(); //为了方便各Form类访问 最好放在类外 命名空间中
public partial class AddMemberForm : Form
...{
//... ...
public event CallBack MyEnvent;
private void buttonSubmit_Click(object sender, EventArgs e)
...{
string memberId = this.textBox1.Text;
//... ...
newMember.Add();
if (this.MyEnvent != null) //为了防止异常 最好加上这么个判断
...{
this.MyEnvent();
}
}
//... ...
}
}
... {
public delegate void CallBack(); //为了方便各Form类访问 最好放在类外 命名空间中
public partial class AddMemberForm : Form
...{
//... ...
public event CallBack MyEnvent;
private void buttonSubmit_Click(object sender, EventArgs e)
...{
string memberId = this.textBox1.Text;
//... ...
newMember.Add();
if (this.MyEnvent != null) //为了防止异常 最好加上这么个判断
...{
this.MyEnvent();
}
}
//... ...
}
}
MainForm:
namespace
MemberManage
... {
public partial class MainForm : Form
...{
//... ...
private void 添加会员ToolStripMenuItem_Click(object sender, EventArgs e)
...{
AddMemberForm amf = new AddMemberForm();
amf.MyEnvent += new CallBack(DataGridViewBind);
amf.Show();
}
private void DataGridViewBind()
...{
this.dataGridView1.DataSource = Member.Details;
}
//... ...
}
... {
public partial class MainForm : Form
...{
//... ...
private void 添加会员ToolStripMenuItem_Click(object sender, EventArgs e)
...{
AddMemberForm amf = new AddMemberForm();
amf.MyEnvent += new CallBack(DataGridViewBind);
amf.Show();
}
private void DataGridViewBind()
...{
this.dataGridView1.DataSource = Member.Details;
}
//... ...
}