c# WinForm 窗体之间传值的几种方式(小结)

 更新时间:2018年09月04日 14:43:46   作者:大白快跑8  
这篇文章主要介绍了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";
}

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

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

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

叨叨两句

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

总结

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

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

相关文章

  • C# OleDbDataReader快速数据读取方式(3种)

    C# OleDbDataReader快速数据读取方式(3种)

    这篇文章主要介绍了C# OleDbDataReader快速数据读取方式(3种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C#中一个方法返回多个值的实现方法小结

    C#中一个方法返回多个值的实现方法小结

    通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回,因此本文给大家介绍了C#中一个方法返回多个值的实现方法及示例代码,需要的朋友可以参考下
    2024-05-05
  • C# winform中ComboBox数据绑定的两种方法及效率详解

    C# winform中ComboBox数据绑定的两种方法及效率详解

    这篇文章主要给大家介绍了关于C# winform中ComboBox数据绑定的两种方法及效率,Winform ComboBox数据绑定是指将数据源中的数据与ComboBox控件进行关联,需要的朋友可以参考下
    2023-08-08
  • Unity3D使用Shader实现腐蚀消失

    Unity3D使用Shader实现腐蚀消失

    这篇文章主要为大家详细介绍了Unity3D使用Shader实现腐蚀消失,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 基于C#实现在图片上绘制文字

    基于C#实现在图片上绘制文字

    这篇文章主要为大家详细介绍了如何利用C#实现在图片上绘制文字的效果,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C# 将透明图片的非透明区域转换成Region的实例代码

    C# 将透明图片的非透明区域转换成Region的实例代码

    以下代码实现将一张带透明度的png图片的非透明部分转换成Region输出的方法,有需要的朋友可以参考一下
    2013-10-10
  • Unity3D实现播放gif图功能

    Unity3D实现播放gif图功能

    这篇文章主要为大家详细介绍了Unity3D实现播放gif图功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#中的日期时间比较和格式化的方法

    C#中的日期时间比较和格式化的方法

    本文将介绍C#中常用的日期时间比较方法(CompareTo、Equals和比较运算符)以及日期时间格式化方法(ToString、自定义格式字符串和标准格式),具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • C#使用时序数据库InfluxDB的教程详解

    C#使用时序数据库InfluxDB的教程详解

    InfluxDB是一个开源的时序数据库,可以自动处理时间序列数据,这篇文章主要为大家详细介绍了C#如何使用InfluxDB,感兴趣的小伙伴可以跟随小编一起了解下
    2023-11-11
  • C# Form自定义光标的简单实现

    C# Form自定义光标的简单实现

    这篇文章主要介绍了C# Form自定义光标的简单实现,有需要的朋友可以参考一下
    2014-01-01

最新评论