窗体间的传值的几种方法:
第一种方法:
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 } } }