窗体间的传值,最好使用委托方式传值,开始之前,我们先来说一下委托与事件的关系。
委托:是一个 类 。
事件:是 委托类型 的一个 特殊实例 ,只能在 类 的 内部触发执行 。
首先创建2个窗体,这里我们以form1为发送窗体,form2为接收窗体
form1窗体
form2窗体
方式一( 最简单的方式 )
form1窗体代码
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace事件的方式实现窗体间传值{publicpartialclassForm1 : Form {publicForm1(){ InitializeComponent(); }publicForm2 msgFrm { get;set; }privatevoidForm1_Load(object sender, EventArgs e){ Form2 f2 =newForm2(); msgFrm = f2; f2.Show(); }privatevoidbtnSendMsg_Click(object sender, EventArgs e){//对象内部的,字段或者元素属性最好不要直接让外部直接访问//最好是通过,设置的方法来控制一下msgFrm.SetTxt(this.txtMsg.Text); } }}
form2窗体代码
1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Threading.Tasks;9usingSystem.Windows.Forms;1011namespace事件的方式实现窗体间传值12{13publicpartialclassForm2 : Form14{15publicForm2()16{17InitializeComponent();18}19publicvoidSetTxt(stringtxt)20{21this.txtMsg.Text = txt;22}23}24}
方式二( 委托方式 )
注:委托不熟悉的宝宝们,请自行查阅Func与Action,以及delegate三者区别,这里我们用系统 内置 的 委托Action
form1窗体代码
1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Threading.Tasks;9usingSystem.Windows.Forms;101112namespace事件的方式实现窗体间传值13{14publicpartialclassForm1 : Form15{16publicForm1()17{18InitializeComponent();19}20//定义委托21publicAction afterMsgSend { get;set; }22privatevoidForm1_Load(object sender, EventArgs e)23{24Form2 f2 =newForm2();25afterMsgSend += f2.SetTxt;//给系统内置的委托注册事件26f2.Show();27}2829privatevoidbtnSendMsg_Click(object sender, EventArgs e)30{31if(afterMsgSend == null)32{33return;34}35afterMsgSend(this.txtMsg.Text);36}37}38}
form2窗体代码
1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Threading.Tasks;9usingSystem.Windows.Forms;1011namespace事件的方式实现窗体间传值12{13publicpartialclassForm2 : Form14{15publicForm2()16{17InitializeComponent();18}19publicvoidSetTxt(stringtxt)20{21this.txtMsg.Text = txt;22}23}24}
方式三( 事件方式,更安全哟 )
TextBoxMsgChangeEventArg 类继承 EventArgs 代码
1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Text;5usingSystem.Threading.Tasks;67namespace事件的方式实现窗体间传值8{9publicclassTextBoxMsgChangeEventArg:EventArgs10{11publicstringText { get;set; }12}13}
form1窗体代码
1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Threading.Tasks;9usingSystem.Windows.Forms;101112namespace事件的方式实现窗体间传值13{14publicpartialclassForm1 : Form15{16publicForm1()17{18InitializeComponent();19}20publicevent EventHandler AfterMsgChange;21privatevoidForm1_Load(object sender, EventArgs e)22{23Form2 f2 =newForm2();24AfterMsgChange += f2.AfterTxtChange;25f2.Show();26}27privatevoidbtnSendMsg_Click(object sender, EventArgs e)28{29AfterMsgChange(this,newTextBoxMsgChangeEventArg() { Text =this.txtMsg.Text });30}31}32}
form2窗体
1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Threading.Tasks;9usingSystem.Windows.Forms;1011namespace事件的方式实现窗体间传值12{13publicpartialclassForm2 : Form14{15publicForm2()16{17InitializeComponent();18}19publicvoidAfterTxtChange(object sender,EventArgs e)20{21//拿到父窗体传来的文本,强转数据类型22TextBoxMsgChangeEventArg arg = e as TextBoxMsgChangeEventArg;23this.SetTxt(arg.Text);24}25}26}
看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具
每晚8点直播讲解C++编程技术。非常感谢大家的关注