public partial class FormInsertE : Form
{
public FormInsertE(Mydelegate dele)
{
InitializeComponent();
}
private void btnSave_Click(object sender, EventArgs e)
{
//在这里想用dele();,怎么用啊?
}
} 在命名空间里定义了一个委托pulic delegate void Mydelegate()
怎么在另一个窗体里使用这个代理啊?
{
public FormInsertE(Mydelegate dele)
{
InitializeComponent();
}
private void btnSave_Click(object sender, EventArgs e)
{
//在这里想用dele();,怎么用啊?
}
} 在命名空间里定义了一个委托pulic delegate void Mydelegate()
怎么在另一个窗体里使用这个代理啊?
pulic delegate void Mydelegate()
public delegate void RefreshEventHandle();//启用委托为下面返回界面时候刷新
public event RefreshEventHandle OnRefreshEvent;//刷新处理
#region 功能:离开刷新
private void HeTongTianJia_FormClosed(object sender, FormClosedEventArgs e)
{
if (null != OnRefreshEvent)
{
this.OnRefreshEvent();
} }
#endregion
父界面 private void toolStripMenuItem22_Click(object sender, EventArgs e)
{
KeHuJiBenXinxi_keHuMenTianJia khmtj = new KeHuJiBenXinxi_keHuMenTianJia();//实例化客户门添加界面
khmtj.OnRefreshEvent += new KeHuJiBenXinxi_keHuMenTianJia.RefreshEventHandle(this.RefreshData);//委托刷新
khmtj.ShowDialog(this);//界面跳转 } private void RefreshData()
{
就是你要的语句就行了啊!
dataGridView1_CellClick(null, null);//主界面刷新
this.comboBox1.Text = "无";//定义comboBox1的默认值为无 }
只要在这个窗体初始化时,给dele赋值就可以了,值就是和这个Mydelegate委托相匹配的方法,就可以
然后在这个窗体里面,通过this.dele(、、、);如果有参数要给参数
再有,你要在窗体中声明一个委托的对象例如dele,或者声明一个事件也可以
{
private Mydelegate _dele=null;
public FormInsertE(Mydelegate dele)
{
InitializeComponent();
_dele=dele;
}
private void btnSave_Click(object sender, EventArgs e)
{
//在这里想用dele();,怎么用啊?
if(_dele!=null)
_dele();
}
}
{
public FormInsertE(Mydelegate dele)
{
InitializeComponent();
this.dele=dele;
}
Mydelegate dele;
private void btnSave_Click(object sender, EventArgs e)
{
//在这里想用dele();,怎么用啊?
dele();
}
} 在命名空间里定义了一个委托pulic delegate void Mydelegate()
怎么在另一个窗体里使用这个代理啊?
委托是一个方法指针,通常我们定定义一个变量,int a;string str;等等,这些变量都将指向一个相应类型的值或者引用。那委托作为一个方法的指针,它能够指向一个方法,指向方法的类型(包括参数和返回值)在你定义的时候决定。
这样我们在使用委托的时候可以对比着变量的使用来想,变量除了在类或者方法中声明使用还有个很重要的用法就是用在方法的参数里面,为了提高一个方法重用性,让它更加通用,我们往往都选择把方法里面需要变的东西提取为参数。比如一个执行加法的方法,如果写成
public double Add(){return 1+1};
这样显然不行,因为它只能算1+1。如果写成
public double Add(double num1,double num2){return num1+num2};
这样就通用了,但是调用的时候需要提供参数。
委托作为方法的参数的用法从思想上来讲和我们用的int string等变量是差不多的。
现在有这样的一个需求:
public double Calc(double a,double b)
{
//1.对a和b进行一些业务运算 //2.调用方法对a和b进行运算 //3.对计算结果进行处理并返回结果
}
在第二步中如果根据不同的情况有不一样计算规则,这样就导致有不一样的计算方法,也就是说,第2步是会变的,但是第1和第3步是不变的。遇到这样的问题怎么办呢?(这样的问题的典型事例就是事务处理)
如果不知道委托,我们可能只能采用有多少种规则就得写多少个方法来解决,不难发现,这样使得第1和第3步的重用性很低,怎么办呢?
我们可以这样来做:
声明一个委托public delegate double CalcDouble(double num1, double num2);改变原来方法的参数和方法体public double Calc(double a,double b, CalcDouble calc)
{
//1.对a和b进行一些业务运算 //2.调用方法对a和b进行运算
calc(a,b); //3.对计算结果进行处理并返回结果
}其中第二步就是调用这个委托,道理其实很简单,calc和a、b是一样的,在调用的时候会传给方法一个实参,和a、b不同的是它传的是一个方法,当传进去之后,calc就有意义了,这样在执行calc(a,b)的时候会把a和b传给calc指向的方法,即调用Calc方法的时候和a、b一起传递的那个方法。由此看来,这里的委托就像一个占位符,传什么样的方法就执行什么样的操作,和a、b是不很像呢?
有了这样的一个使用过程就不难明白委托的声明和使用了,委托(上面的CalcDouble)可以用来声明一个委托类型的变量(上面的calc),该变量可以指向一个方法,这样可以灵活的在代码中根据需求调用不一样的方法。该委托可以指向什么样类型的方法由定义该委托时的返回值和参数决定。
最后说到委托是使用范围,这个和枚举是很类似的,如果你在命名空间下定义,该命名空间下的所有的类和接口都可以使用该委托来声明委托变量,如果在类内部,首先类内部肯定都可以使用,如果是public的,在其他的类中可以通过类名.委托名的方式来使用,其它访问修饰符也类似。很显然委托不可以在方法内部定义,因为这样没有了意义。
说的好像有点多,但都是个人的理解,希望对楼主有帮助,如果有错误和不妥指出还忘谅解,一起共同提高吧!
特别是ctwei86的讲解