Fork me on GitHub

c#事件的实际应用场景

最简单的定义事件的语法
public event Action<bool> Refreash;
先介绍这个Action
这个Action是委托的快速实现方式,我用.net 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){
....
上传
....
更新
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要方便很多,就是这个属性


posted @ 2020-09-11 14:48  HelloLLLLL  阅读(36)  评论(0编辑  收藏