刚在blog上看到有位兄弟写的,感觉不错转了过来。
当时学习.net的时候只知道事件驱动,却搞不懂什么是委托更不会定义事件,当然就不能写出什么高质量的程序,以下是个人对委托的理解,用最简单的实例讲解,给初学者一点提示吧,高手就不用看了,呵呵:)
委托可以这么来理解,委托就像是定义一个指针(C++),提供入口。
1 实例1:执行一个委托定义的方法
第一步:定义一个委托
public delegate void Computer(); //委托用delegate定义,此方法是void类型,并且没有任何参数
第二步:定义一个和委托类型相同的方法,计算两数之和
private void MathOpt()
{
int a =1;
int b = 2;
int sum=a +b;
Response.Write(sum.tostring());
}
第三步:在一个按钮的click事件中
private void button1_Click(object sender, EventArgs e)
{
Computer com;//实例
com = MathOpt;//类似指针,将方法的地址赋值委托类型的变量
com();
}
好了,这样就执行了一个委托的方法,当系统执行到com()的时候,就相当于执行方法MathOpt(),如果有参数,那么在定义委托的时候和方法有相同的参数即可。
有了委托就可以定义事件了
实例2:定义一个事件
功能:在父子窗体间通信,如在子窗体输入条件,在父窗体中查询,类似Office的查找
定义窗体:假设父窗体为Frm1,子窗体为Frm2
第一步在Frm2中定义事件:
public delegate void FullSearch(string key); //定义全文检索的委托事件
public event FullSearch FullSearchOrder; //用委托定义一个检索的事件(会在父窗体中执行功能)
第二步在Frm2的“查询”按钮事件中执行:
private void btnSearch_Click(object sender, System.EventArgs e)
{
if(FullSearchOrder !=null)
FullSearchOrder(this.txtKey .Text ); //此时不用考虑如何查询,只传递一个查询关健字即可
}
第三步转到Frm1中处理事件
3-1 在父窗体中的弹出子窗体时产生定义的那个事件方法:如
Frm2 frm2=new Frm2(key); //key为要查询的关健字,与定义事件方法参数保持一至
frm2.FullSearchOrder +=new .Frm2.FullSearch(frm2_FullSearchOrder); //执行这句会自动产生一个事件frm1_FullSearchOreder
frm2.ShowDialog ();
3-2 在系统产生的事件中完成查询功能就OK了
private void frm2_FullSearchOrder(string key)
{
//这里完成查询的方法
}
到这里就好了,不同窗体间就可以通信了,在弹出的子窗体中就可以执行父窗体中的方法了,原理都是利用委托。