欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 20:40:16
...

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