c# WinForm 窗体之间传值的几种方式(小结)
程序员文章站
2023-12-11 19:51:58
前言
小编最近维护一个winfrom窗体,是项目中cs端的主窗体,很多子窗体需要从主窗体获取值,同时子窗体还需要给主窗体回传值,下面来给大家介绍一下。
正文...
前言
小编最近维护一个winfrom窗体,是项目中cs端的主窗体,很多子窗体需要从主窗体获取值,同时子窗体还需要给主窗体回传值,下面来给大家介绍一下。
正文
本文中以主窗体为frmmain,子窗体为frmgroup ,两窗体之间的传值来做示例。
方式一: 使用公共静态变量传值
主窗体frmmain中代码
public partial class frmmain : form { //声明工位id 为公共静态变量 public static string terminalid = ""; //给静态变量赋值 terminalid = "q13bh01-bh12"; }
子窗体frmgroup中代码
private void frmgroup_load(object sender, eventargs e) { this.txtterminalid.text= frmmain.terminalid.trim(); //可以再赋值给静态成员,方便其他窗体调用 frmmain.terminalid = "q13bh01-bh11"; }
特点 : 双向传值,实现简单
缺点: 静态变量在类加载的时候分配内存,存储于方法区,一般不会被销毁,在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。
方式二: 使用公共变量传值
主窗体frmmain中代码
public partial class frmmain : form { //声明工位id 为公共变量 public string terminalid = ""; //给变量赋值 terminalid = "q13bh01-bh12"; //单击‘行为'按钮的时候会给窗体传值 private void btngroup_click(object sender, eventargs e) { frmgroup frmgro = new frmgroup(); //变量传值 ,注意顺序写在showdialog()方法之前 frmgro .stationid = this.terminalid; frmgro .showdialog(); } }
子窗体frmgroup中代码
public partial class frmgroup : form { //定义公共属性 public string stationid = ""; }
特点 : 单向传值,只能主窗体给子窗体传值,实现简单
方式三: 使用委托传值
先来看子窗体frmgroup中代码
namespace siemens.simatic.guiclient.mesclient { //1、声明一个委托 public delegate void settextvalue(string textvalue,bool flag); public partial class frmgroup : form { //2、声明一个委托类型的事件 public event settextvalue setformtextvalue; public string groupname = ""; public bool flagbtngroup = false; public frmgroup() { initializecomponent(); } //轮询‘行为'按钮(相当于按钮单击事件) private void tmrbtn_tick(object sender, eventargs e) { if (sender is buttonx) { buttonx butx = (buttonx)sender;//判断触发事件的是不是button groupname = butx.text.trim(); flagbtngroup = true; //3、准备要回传的数据。 setformtextvalue(this.groupname.replace(" ", ""), this.flagbtngroup ); this.close(); return; } }
主窗体frmmain中代码
private void btngroup_click(object sender, eventargs e) { frmgroup frmgro = new frmgroup(); //4、初始化事件 frmgro .setformtextvalue += new settextvalue(frmgro _setformtextvalue); //变量传值 ,注意顺序写在showdialog()方法之前 frmgro .stationid = this.terminalid; frmgro .showdialog(); } //5、事件具体实现 public void frmgro _setformtextvalue(string textvalue,bool flag) { this.newgroupname = textvalue; this.flagbtngroup = flag; if (!string.isnullorempty(newgroupname)) { …… } }
特点 :适合子窗体数据实时回传父窗体。
方式四:使用构造函数传递一个数值
class formb { int orgid; public formb(int orgid) { this.orgid=orgid; } } class forma { public void showb() { formb fb=new formb(5); // 5是要传递过去的值 fb.show(); } }
方式五:把a窗体整个传递给b窗体
有些时候需要在b窗体里对a窗体的某个控件值做修改,并且需要立即改变a窗体的控件显示,本方法适合这种情况。
修改forma,把要在b里处理的控件的可访问性(modifiers)设为public,然后按下面的方式处理
class forma { public void showb() { formb fb=new formb(this); // 在构造函数里把a窗体本身传过去 fb.show(); } } class formb { forma fm; //b窗体增加一个forma类型的成员 public formb(forma fm) //添加一个带参数的构造方法,参数类型是forma { this.fm=fm; } protected void method1() { fm.txtname.text="haha!"; //在这儿可以直接操作a窗体里的控件了! } }
叨叨两句
项目中父窗体向子窗体传值传的是固定值,用的是第一种方式,子窗体向父窗体传值传的是变化的值,用的是第三种方式,第三种方式为我解决了一个大麻烦。
总结
感谢您的阅读,窗体传值有好多种方法,构造参数参数传值、公共属性传值等,各种场景下找到适合需求的最好,希望为小编提出宝贵意见!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。