WinForm—窗体之间传参数的几种方式

前言
小编最近维护一个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";
}

6
特点 : 双向传值,实现简单
缺点: 静态变量在类加载的时候分配内存,存储于方法区,一般不会被销毁,在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。

方式二: 使用公共变量传值
主窗体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))
            {
                 ……
            }
         }

特点 :适合子窗体数据实时回传父窗体。

叨叨两句
项目中父窗体向子窗体传值传的是固定值,用的是第一种方式,子窗体向父窗体传值传的是变化的值,用的是第三种方式,第三种方式为我解决了一个大麻烦。

总结
感谢您的阅读,窗体传值有好多种方法,构造参数参数传值、公共属性传值等,各种场景下找到适合需求的最好,希望为小编提出宝贵意见!

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seven Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值