C#中子工程通过委托和事件来回调父工程

在正常引用中,被引用子项目是不能调用父项目中的方法和传参调用方法的。通过委托和事件可以实现回调,让两个项目可以回调。

 

实例:

故事:儿子从父亲这里拿了多少钱买了玩具。

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();

感谢大家阅读,如果对你有帮助,帮忙点个赞呗!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forrest Gump plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值