c#事件的实际应⽤场景
最简单的定义事件的语法
public event Action<bool> Refreash;
先介绍这个Action
这个Action是委托的快速实现⽅式,我⽤ framework3.5是⽀持的,但不知道2.0的⽀持不。Action的委托不⽀持返回值,但可以⽀持有参数,其中bool就是⼀个参数。
另⼀种⽀持返回值和参数的是Func<int,bool>,这个意思是接受int参数,返回bool类型。它也可以只有返回值⽐如Func<bool> 就返回bool类型。
这个委托就是让⽅法也变成普通参数那样能被赋值,能被⼀个变量代替。
⽐如有个⽅法:
double Add(double a,double b){
return a+b;
}
//我们定义⼀个委托
Func<double,double,double> funcAdd;
//给这个变量赋值
funcAdd=Add;
调⽤
funcAdd(1.0+2.0);
就这样就是委托。
事件就是在委托的基础上加上个event关键字就⾏了。
事件使⽤的语法是+=和-=
⽐如这⾥
ucData1.Refreash += UcData1_Refreash;
UcData1_Refreash这个就是⽅法。
我就来说说我写的⾃定义事件的⼀个场景。
我写了两个⾃定义控件,⼀个是汇总查询条件的控件:UCFilter,⼀个是展⽰查询后的数据的控件:UCData,
我把他们放在Form⾥⾯,当我在UCData⾥点击上传按钮得时候,我得刷新这个控件。就需要去调⽤UCFilter得查询单据按钮。所以我不可能把更新写在UCData得上传按钮得事件⾥⾯去。
这个时候我就想到了事件,我在UCData⾥添加事件:
public event Action<bool> Refreash;
调⽤事件是在上传按钮⾥的:
private voidb tn_upload_Click(object sender, EventArgs e){
....
421事件是什么意思上传
....
更新
if (Refreash != null)
{
Refreash(true);
}
}
这⾥就是事件厉害的地⽅了,它让我能把要执⾏的代码交给第三⽅Form窗体。Form窗体⾥有UCFilter的变量,我就可以在Form窗体⾥调⽤查询数据的⽅法了。代码就像这样:
在load事件⾥注册事件:
ucData1.Refreash += UcData1_Refreash;
这就使得Refreash != null
然后我就在Form⾥⾯写了事件的实现。
private void UcData1_Refreash(bool obj)
{
if (obj)
{
this.ucData1.dgv.DataSource=this.ucFilter1.LoadProcData();
}
}
this.ucFilter1.LoadProcData()就是查询控件获取数据的⽅法。
另外要说的是在使⽤⾃定义控件的时候,把控件⾥的控件的权限改为public要⽅便很多,就是这个属性