c# 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# WinForm 窗体之间传值的几种方式(小结) 的全部内容, 来源链接: utcz.com/z/356288.html

回到顶部