<强>一、前言强>
我们在做Winform窗体程序开发的时候,会经常遇到窗体之间相互传值。假设有下面的一个场景:一个主窗体和一个子窗体,点击主窗体上面的按钮给子窗体传值,并在子窗体上面显示出来,一般会有如下几种方式实现。
<强>二、公共属性强>
我们可以在子窗体里面定义一个公共的属性,然后在父窗体里面给公共属性赋值,这样可以实现窗体之间传值,子窗体代码如下:
使用系统; 使用System.Windows.Forms; 名称空间DelegateDemo { 公共部分类frmChild:形式 { 公共frmChild () { InitializeComponent (); }//定义一个公共属性,接收传递的值 公共字符串strMessage{得到;设置;}///& lt; summary>///窗体加载///& lt;/summary>///& lt;参数name=胺⒓恕弊4? lt;/param>///& lt;参数name=" e "祝辞& lt;/param> 私人空间frmChild_Load(对象发送方,EventArgs e) {//将接收到的值显示在窗体上 this.lblMessage。文本=strMessage; } } }
父窗体代码:
使用系统; 使用System.Windows.Forms; 名称空间DelegateDemo { 公共部分类frmParent:形式 { 公共frmParent () { InitializeComponent (); }///& lt; summary>///单击事件///& lt;/summary>///& lt;参数name=胺⒓恕弊4? lt;/param>///& lt;参数name=" e "祝辞& lt;/param> 私人空间btn_Value_Click(对象发送方,EventArgs e) { frmChild孩子=new frmChild ();//给窗体的公共属性赋值 的孩子。strMessage=this.txtMessage.Text.Trim ();//显示子窗体 child.Show (); } } }
这种方式有一个缺点:属性需要设置为公众不安全。
<强>二、公共方法强>
我们还可以在子窗体里面定义一个方法,通过调用方法传值,子窗体代码如下:
使用系统; 使用System.Windows.Forms; 名称空间DelegateDemo { 公共部分类frmChild:形式 { 公共frmChild () { InitializeComponent (); }//定义一个公共属性,接收传递的值//公共字符串strMessage{得到;设置;}//定义属性为私有的 私人字符串strMessage{得到;设置;}///& lt; summary>///给私有属性赋值///& lt;/summary>///& lt;参数name=" strText祝辞& lt;/param> 公共空间SetText(字符串strText) { strMessage=strText; }///& lt; summary>///窗体加载///& lt;/summary>///& lt;参数name=胺⒓恕弊4? lt;/param>///& lt;参数name=" e "祝辞& lt;/param> 私人空间frmChild_Load(对象发送方,EventArgs e) {//将接收到的值显示在窗体上 this.lblMessage。文本=strMessage; } } }
父窗体代码:
使用系统; 使用System.Windows.Forms; 名称空间DelegateDemo { 公共部分类frmParent:形式 { 公共frmParent () { InitializeComponent (); }///& lt; summary>///单击事件///& lt;/summary>///& lt;参数name=胺⒓恕弊4? lt;/param>///& lt;参数name=" e "祝辞& lt;/param> 私人空间btn_Value_Click(对象发送方,EventArgs e) { #地区调用公共属性赋值//frmChild孩子=new frmChild ();////给窗体的公共属性赋值//子。strMessage=this.txtMessage.Text.Trim ();////显示子窗体//child.Show (); # endregion #地区调用方法赋值 frmChild孩子=new frmChild ();//给窗体的公共属性赋值 child.SetText (this.txtMessage.Text.Trim ());//显示子窗体 child.Show (); # endregion } } }
这种方式同样也有缺点:属性虽然是私人的了,但是方法还是公共的。
<强>三,委托强>
上述两种方式都是不安全、下面我们使用委托来实现窗体之间传值。
1,定义一个委托
我们在主窗体里面定义一个有参无返回值的委托:
//定义一个有参无返回值的委托 私人委托无效SendMessage(字符串strMessage);
2,实例化一个此委托类型的事件
在父窗体里面定义一个委托类型的事件:
//定义一个委托类型的事件 公共事件SendMessage sendMessageEvent;c#窗体传值代码方法