C# winform 主窗体与子窗体互相传递消息的例子 (三)

闲话少叙,(二)里面已经演示了子窗体传递到主窗体的不成功。
对于原因的猜测或者解释,希望有大牛看到给我指点一下。
我直接上可以正常传递消息的方式。
简而言之,不再使用event,而是使用delegate,委托。

与前两篇的不同点:
1.不需要MyEventArg.cs来传参了,因为委托的参数形式比event灵活很多。
2.代码量更少。
3.主要变化就是当程序还运行在form1内容时,就把form2里的那个委托注册为form1里的某个函数,这样就可以控制form1里的控件了。


用到的文件只有两个。
form1.cs form2.cs

Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Slave2MainDele += textChange;  //总之就是先把form2里的这个事件注册为form1里的内容
            form2.Show();
        }



        public void textChange(string msg)
        {
            textBox1.Text = msg; 
        }
    }
}

Form2.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{

    public delegate void Slave2MainDelegate(string topmost); //定义委托    

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public Slave2MainDelegate Slave2MainDele;//定义委托实例    


        private void button1_Click(object sender, EventArgs e)
        {
            Slave2MainDele.Invoke(DateTime.Now.ToString());
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
    }
}

亲测可行。

ps:这三篇文章,都是.NET 4.7 环境,windows 10 专业版, 64bit。
但这应该不是什么特别需要强调的地方。
专题完毕。

在此不讨论其余一些通过公用变量之类的比较“low”的通信方式。

你可能感兴趣的:(C#,winform桌面程序)