gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 28 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章c# WinForm 窗体之间传值的几种方式(小结)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言 。

小编最近维护一个Winfrom窗体,是项目中CS端的主窗体,很多子窗体需要从主窗体获取值,同时子窗体还需要给主窗体回传值,下面来给大家介绍一下.

正文 。

本文中以主窗体为frmMain,子窗体为frmGroup ,两窗体之间的传值来做示例.

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

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

叨叨两句 。

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

总结 。

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

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

原文链接:https://blog.csdn.net/zt15732625878/article/details/79685336 。

最后此篇关于c# WinForm 窗体之间传值的几种方式(小结)的文章就讲到这里了,如果你想了解更多关于c# WinForm 窗体之间传值的几种方式(小结)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com