在正常引用中,被引用子项目是不能调用父项目中的方法和传参调用方法的。通过委托和事件可以实现回调,让两个项目可以回调。
实例:
故事:儿子从父亲这里拿了多少钱买了玩具。
1.首先在同一个解决方案下,创建两个工程,一个是father工程,一个是son工程,father需要引用son工程。
2.在father工程中创建两个winform窗口,一个是father,一个是toy,son工程中创建一个winform窗口。
|
|
Father.cs
Toy.cs
Son.cs
下面可以写委托和事件:
首先我们得在Son.cs中定义委托和事件。
定义委托和事件:public delegate void getMoneyDelegate(int money);
public event getMoneyDelegate getMoneyEvent;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace son
{
public partial class son : Form
{
//定义委托和事件
public delegate void getMoneyDelegate(int money);
public event getMoneyDelegate getMoneyEvent;
public son()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if(null!= getMoneyEvent)
{
getMoneyEvent(int.Parse(textBox1.Text));//委托事件,调用父工程中的窗体和方法,并传入参数。
}
else
{
MessageBox.Show("getMoneyEvent为空", "提示");
}
}
}
}
其次我们要在father中写委托事件的具体方法:
具体方法:
sonFrom.getMoneyEvent += (int money) =>
{
MessageBox.Show("儿子拿了"+money+"元,买了玩具!","提示");
show();
};
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateAndEvent
{
public partial class father : Form
{
public father()
{
InitializeComponent();
}
public void show()
{
toy t = new toy();
t.Show();
}
private void button1_Click(object sender, EventArgs e)
{
son.son sonFrom = new son.son();
sonFrom.getMoneyEvent += (int money) =>
{
show();//调用父工程中方法。
MessageBox.Show("儿子拿了"+money+"元,买了玩具!","提示");//向父工程中传入参数
};
sonFrom.Show();
}
}
}
这样一个委托事件就搭建好了
最后实现效果:
首先打开父窗口,点击button,会打开子窗口的界面,
然后在子窗口中输入数字,点击button,会显示MessageBox和调用父工程中的窗体和方法。
注意:
在实际使用中,我们每次想要在子工程中使用委托事件的方法时,在实例化子工程中,都必须先触发委托事件这样才能进行回调。
拓展例子:
其中sonFrom1可以实现回调实现,而sonFrom2不能,因为它没有触发委托事件。
所以在调用somFrom2时,或出现getMoneyEvent为空的情况。
son.son sonFrom1 = new son.son();
sonFrom1.getMoneyEvent += (int money) =>
{
show();
MessageBox.Show("儿子拿了"+money+"元,买了玩具!","提示");
};
sonFrom1.Show();
son.son sonFrom2 = new son.son();
sonFrom2.Show();
感谢大家阅读,如果对你有帮助,帮忙点个赞呗!