c#事件的实际应用场景


最简单的定义事件的语法 public event Action Refreash; 先介绍这个Action 这个Action是委托的快速实现方式,我用.net framework3.5是支持的,但不知道2.0的支持不。Action的委托不支持返回值,但可以支持有参数,其中bool就是一个参数。 另一种支持返回值和参数的是Func,这个意思是接受int参数,返回bool类型。它也可以只有返回值比如Func 就返回bool类型。   这个委托就是让方法也变成普通参数那样能被赋值,能被一个变量代替。 比如有个方法: double Add(double a,double b){ return a+b; } //我们定义一个委托 Func 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 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要方便很多,就是这个属性

C