zoukankan      html  css  js  c++  java
  • 窗体传值的方式

    方式一: 使用公共静态变量传值

    主窗体frmMain中代码

    1
    2
    3
    4
    5
    6
    7
    public partial class frmMain : Form
    {
     //声明工位ID 为公共静态变量
     public static string terminalID = "";
     //给静态变量赋值
     terminalID = "q13bh01-bh12";
     }

    子窗体frmGroup中代码

    1
    2
    3
    4
    5
    6
    private void frmGroup_Load(object sender, EventArgs e)
    {
      this.txtTerminalID.Text= frmMain.terminalID.Trim();
      //可以再赋值给静态成员,方便其他窗体调用
      frmMain.terminalID = "q13bh01-bh11";
    }

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

    方式二: 使用公共变量传值

    主窗体frmMain中代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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中代码

    1
    2
    3
    4
    5
    public partial class frmGroup : Form
    {
     //定义公共属性
     public string stationID = "";
    }

    特点 : 单向传值,只能主窗体给子窗体传值,实现简单

    方式三: 使用委托传值

    先来看子窗体frmGroup中代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    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中代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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))
         {
            ……
         }
        }

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

    方式四:使用构造函数传递一个数值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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,然后按下面的方式处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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窗体里的控件了!
    }
    }
  • 相关阅读:
    分布式集群系统下的高可用session解决方案
    Google大数据三篇著名论文中文版
    12款免费与开源的NoSQL数据库介绍
    揭密Node.js 盛行的因由(转载)
    lion.ec开源框架简介(原创)
    2.2 Hadoop Studio 使用 [Hadoop学习笔记]
    spring3.2+ehcache 注解使用
    Venus 是一个简单的、高性能、高并发能力的java 开源Remoting框架
    ZooKeeper原理分析
    Netty系列之Netty高性能之道(转载InfoQ)
  • 原文地址:https://www.cnblogs.com/yyldh/p/14481116.html
Copyright © 2011-2022 走看看