父子窗体之间传值

需求说明

当点击父窗体的按钮时,父窗体的文本框中的内容显示在子窗体的label 中

以下是控件名称:
父窗体文本框: txtMsg
按钮:button1

子窗体label:lblMsg

方式一

在子窗体 frmChildren 中定义如下方法,提供子窗体label控件 Text 属性的设置

public void  setMsg(string msg)
{
   this.lblMsg.Text = msg;
}

接着在父窗体中 定义一个 子窗体frmChildren 的字段,编写点击事件

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 WindowsFormsApp1
{
    public partial class FrmParent : Form
    {
        public FrmParent()
        {
            InitializeComponent();
        }
        //定义子窗体 字段
        private FrmChildren frmChildren;
        private void FrmParent_Load(object sender, EventArgs e)
        {
            frmChildren = new FrmChildren();
            frmChildren.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //点击事件,通过子窗体提供的label Text 属性设置方法进行设置
            frmChildren.setMsg(this.txtMsg.Text);
        }
    }
}

方式二 发布订阅模式(观察者模式)委托版本

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 WindowsFormsApp1
{
    public partial class FrmParent : Form
    {
        public FrmParent()
        {
            InitializeComponent();
        }

        private FrmChildren frmChildren;

        //定义委托
        private Action<string> afterMsgSend;
        private void FrmParent_Load(object sender, EventArgs e)
        {
            frmChildren = new FrmChildren();
            //子窗体订阅父窗体,处理父窗体的变化
            afterMsgSend += frmChildren.setMsg;
            frmChildren.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {


            //方式二 发布订阅模式(观察者模式)
            if (afterMsgSend == null)
            {
                return;
            }
            else
            {
                //传递父窗体的文本框的值
                afterMsgSend(this.txtMsg.Text);
            }


        }
    }
}

发布订阅模式(观察者模式) 非委托版本

定义一个接口,然后让子窗体实现其方法

    public interface IMsgHandle
    {
        void setMsg(string msg);
    }

子窗体代码如下

  public partial class FrmChildren : Form,IMsgHandle
    {
        public FrmChildren()
        {
            InitializeComponent();
        }

        public void  setMsg(string msg)
        {
            this.lblMsg.Text = msg;
        }
    }

父窗体代码如下

   public partial class FrmMain : Form
    {

        //存放关注父窗体变化的子窗体
        public List<IMsgHandle> MsgHandlesList=new List<IMsgHandle>();
        public FrmMain()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (MsgHandlesList.Count==0)
            {
                return;
            }
            foreach (var item in MsgHandlesList)
            {
                //遍历子窗体然后调用其具体的处理活动
                item.setMsg(this.txtMsg.Text);
            }
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            FrmChildren frmChildren = new FrmChildren();
            this.MsgHandlesList.Add(frmChildren);
            frmChildren.Show();
        }
posted @ 2022-10-12 17:30  沈先生爱猫咪  阅读(56)  评论(0编辑  收藏  举报