C#窗体传值代码方法
一、前言
我们在做Winform窗体程序开发的时候,会经常遇到窗体之间相互传值。假设有下面的一个场景:一个主窗体和一个子窗体,点击主窗体上面的按钮给子窗体传值,并在子窗体上面显示出来,一般会有如下几种方式实现。
二、公共属性
我们可以在子窗体里面定义一个公共的属性,然后在父窗体里面给公共属性赋值,这样可以实现窗体之间传值,子窗体代码如下:
usingSystem;
usingSystem.Windows.Forms;
namespaceDelegateDemo
{
publicpartialclassfrmChild:Form
{
publicfrmChild()
{
InitializeComponent();
}
//定义一个公共属性,接收传递的值
publicstringstrMessage{get;set;}
///
///窗体加载
///
///
///
privatevoidfrmChild_Load(objectsender,EventArgse)
{
//将接收到的值显示在窗体上
this.lblMessage.Text=strMessage;
}
}
}
父窗体代码:
usingSystem;
usingSystem.Windows.Forms;
namespaceDelegateDemo
{
publicpartialclassfrmParent:Form
{
publicfrmParent()
{
InitializeComponent();
}
///
///单击事件
///
///
///
privatevoidbtn_Value_Click(objectsender,EventArgse)
{
frmChildchild=newfrmChild();
//给窗体的公共属性赋值
child.strMessage=this.txtMessage.Text.Trim();
//显示子窗体
child.Show();
}
}
}
这种方式有一个缺点:属性需要设置为public,不安全。
二、公共方法
我们还可以在子窗体里面定义一个方法,通过调用方法传值,子窗体代码如下:
usingSystem;
usingSystem.Windows.Forms;
namespaceDelegateDemo
{
publicpartialclassfrmChild:Form
{
publicfrmChild()
{
InitializeComponent();
}
//定义一个公共属性,接收传递的值
//publicstringstrMessage{get;set;}
//定义属性为private
privatestringstrMessage{get;set;}
///
///给私有属性赋值
///
///
publicvoidSetText(stringstrText)
{
strMessage=strText;
}
///
///窗体加载
///
///
///
privatevoidfrmChild_Load(objectsender,EventArgse)
{
//将接收到的值显示在窗体上
this.lblMessage.Text=strMessage;
}
}
}
父窗体代码:
usingSystem;
usingSystem.Windows.Forms;
namespaceDelegateDemo
{
publicpartialclassfrmParent:Form
{
publicfrmParent()
{
InitializeComponent();
}
///
///单击事件
///
///
///
privatevoidbtn_Value_Click(objectsender,EventArgse)
{
#region调用公共属性赋值
//frmChildchild=newfrmChild();
////给窗体的公共属性赋值
//child.strMessage=this.txtMessage.Text.Trim();
////显示子窗体
//child.Show();
#endregion
#region调用方法赋值
frmChildchild=newfrmChild();
//给窗体的公共属性赋值
child.SetText(this.txtMessage.Text.Trim());
//显示子窗体
child.Show();
#endregion
}
}
}
这种方式同样也有缺点:属性虽然是private的了,但是方法还是public的。
三、委托
上述两种方式都是不安全,下面我们使用委托来实现窗体之间传值。
1、定义一个委托
我们在主窗体里面定义一个有参无返回值的委托:
//定义一个有参无返回值的委托 privatedelegatevoidSendMessage(stringstrMessage);
2、实例化一个此委托类型的事件
在父窗体里面定义一个委托类型的事件:
//定义一个委托类型的事件 publiceventSendMessagesendMessageEvent;
委托与事件的关系,事件相对于委托更安全,更低耦合。委托是一个类型,事件是委托类型的一个实例。
3、定义要执行的方法
这里其实就是在子窗体里面定义一个给控件赋值的方法:
//////给控件赋值的方法 /// ///publicvoidSetValue(stringstrValue) { this.lblMessage.Text=strValue; }
4、将方法绑定到事件
frmChildchild=newfrmChild(); //将方法绑定到事件上 sendMessageEvent+=newSendMessage(child.SetValue); //也可以使用下面的简写形式 //sendMessageEvent+=child.SetValue; child.Show();
5、触发委托
在按钮的点击事件里面触发委托:
if(sendMessageEvent!=null)
{
sendMessageEvent.Invoke(this.txtMessage.Text.Trim());
}
上面的代码中使用的是自定义的委托,我们也可以使用.Net框架里面自带的Action泛型委托:
usingSystem;
usingSystem.Windows.Forms;
namespaceDelegateDemo
{
publicpartialclassfrmParent:Form
{
//定义一个有参无返回值的委托
publicdelegatevoidSendMessage(stringstrMessage);
//定义一个委托类型的事件
publiceventSendMessagesendMessageEvent;
publiceventActionactionEvent;
publicfrmParent()
{
InitializeComponent();
}
///
///单击事件
///
///
///
privatevoidbtn_Value_Click(objectsender,EventArgse)
{
#region调用公共属性赋值
//frmChildchild=newfrmChild();
////给窗体的公共属性赋值
//child.strMessage=this.txtMessage.Text.Trim();
////显示子窗体
//child.Show();
#endregion
#region调用方法赋值
//frmChildchild=newfrmChild();
////给窗体的公共属性赋值
//child.SetText(this.txtMessage.Text.Trim());
////显示子窗体
//child.Show();
#endregion
#region通过委托传值
//frmChildchild=newfrmChild();
////将方法绑定到事件上
////sendMessageEvent+=newSendMessage(child.SetValue);
////也可以使用下面的简写形式
//sendMessageEvent+=child.SetValue;
//child.Show();
#endregion
#region使用Action
frmChildchild=newfrmChild();
//将方法绑定到事件上
actionEvent+=child.SetValue;
child.Show();
#endregion
//使用自定义委托
//if(sendMessageEvent!=null)
//{
//sendMessageEvent.Invoke(this.txtMessage.Text.Trim());
//}
//使用Action委托
if(actionEvent!=null)
{
actionEvent.Invoke(this.txtMessage.Text.Trim());
}
}
}
}
以上就是本次介绍的全部相关知识点,感谢大家的学习和对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。