欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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窗体里的控件了!
}
}

叨叨两句

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

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: