窗体间的传值

窗体间的传值的几种方法:

第一种方法:

1,新建两个窗体,一个父窗体Parentfrm,一个是子窗体Childfrm,分别在两个窗体上都加入一个TextBox标签和一个Button标签,分别命名为txtMsg和btnSend。(最简单,但直接对子窗体的属性进行操作,这样不安全)。

2,代码如下所示:

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 窗体间传值
{
    public partial class Parentfrm : Form
    {
        public Childfrm Childfrm { get; set; }//给子窗体写一个属性
        public Parentfrm()
        {
            InitializeComponent();
        }

        private void Parentfrm_Load(object sender, EventArgs e)
        {
            Childfrm frm = new 窗体间传值.Childfrm();
            Childfrm = frm;//给子窗体的属性赋值
            frm.Show();
        }

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            Childfrm.txtMsg.Text = this.txtMsg.Text;//将子窗体的txtMsg的指示对象可见级别(modifiers)设置为Public
        }
    }
}

 

 

第二种方法:

在子窗体中写一个方法,来给子窗体传递值。简单的面向对象的思路

子窗体中的代码如下:

namespace 窗体间传值
{
    public partial class Childfrm : Form
    {
        public void ReceiveMsg(string txt)//写一个方法给textBox赋值
        {
            txtMsg.Text = txt;
        }
        public Childfrm()
        {
            InitializeComponent();
        }

 

父窗体的代码如下:

namespace 窗体间传值
{
    public partial class Parentfrm : Form
    {
        public Childfrm Childfrm { get; set; }//给子窗体写一个属性
        public Parentfrm()
        {
            InitializeComponent();
        }

        private void Parentfrm_Load(object sender, EventArgs e)
        {
            Childfrm frm = new 窗体间传值.Childfrm();
            Childfrm = frm;//给子窗体的属性赋值
            frm.Show();
        }

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            //Childfrm.txtMsg.Text = this.txtMsg.Text;//将子窗体的txtMsg的指示对象可见级别(modifiers)设置为Public
            Childfrm.ReceiveMsg(this.txtMsg.Text);
        }
    }
}

 

第三种方法:

前两种方法有很多看弊端,两个对象间是直接耦合的,如果删除某一个窗体,则就会出错,那么我们要实现两个窗体间的解耦。使用委托

 

子窗体代码如下(子窗体代码和方法二一样):

namespace 窗体间传值
{
    public partial class Childfrm : Form
    {
        public void ReceiveMsg(string txt)//写一个方法给textBox赋值
        {
            txtMsg.Text = txt;
        }
        public Childfrm()
        {
            InitializeComponent();
        }

        private void Childfrm_Load(object sender, EventArgs e)
        {

        }
    }
}

 

 

父窗体代码如下:

namespace 窗体间传值
{
    public partial class Parentfrm : Form
    {

        public Action<string >AfterMsgSend { get; set; }//定义一个无返回值的委托 Action无返回值 Funck有返回值
       
        public Parentfrm()
        {
            InitializeComponent();
        }

        private void Parentfrm_Load(object sender, EventArgs e)
        {
            Childfrm frm = new 窗体间传值.Childfrm();
            //子窗体加载之前,关注主窗体的变化
            AfterMsgSend += frm.ReceiveMsg;
            frm.Show();
        }

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            #region 简单菜鸟级别的
            //Childfrm.txtMsg.Text = this.txtMsg.Text;//将子窗体的txtMsg的指示对象可见级别(modifiers)设置为Public
            // Childfrm.ReceiveMsg(this.txtMsg.Text);
            #endregion
            #region 用委托来做
            if (AfterMsgSend==null)
            {
                return;
            }
            AfterMsgSend(this.txtMsg.Text);//将父窗体textbox中的内容传给委托
            #endregion
        }
    }
}

 

posted @ 2018-09-20 11:28  逍遥汉21  阅读(117)  评论(0编辑  收藏  举报