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