c# WinForm 窗體之間傳值的幾種方式(小結(jié))
前言
小編最近維護(hù)一個(gè)Winfrom窗體,是項(xiàng)目中CS端的主窗體,很多子窗體需要從主窗體獲取值,同時(shí)子窗體還需要給主窗體回傳值,下面來給大家介紹一下。
正文
本文中以主窗體為frmMain,子窗體為frmGroup ,兩窗體之間的傳值來做示例。
方式一: 使用公共靜態(tài)變量傳值
主窗體frmMain中代碼
public partial class frmMain : Form
{
//聲明工位ID 為公共靜態(tài)變量
public static string terminalID = "";
//給靜態(tài)變量賦值
terminalID = "q13bh01-bh12";
}
子窗體frmGroup中代碼
private void frmGroup_Load(object sender, EventArgs e)
{
this.txtTerminalID.Text= frmMain.terminalID.Trim();
//可以再賦值給靜態(tài)成員,方便其他窗體調(diào)用
frmMain.terminalID = "q13bh01-bh11";
}
特點(diǎn) : 雙向傳值,實(shí)現(xiàn)簡(jiǎn)單
缺點(diǎn): 靜態(tài)變量在類加載的時(shí)候分配內(nèi)存,存儲(chǔ)于方法區(qū),一般不會(huì)被銷毀,在系統(tǒng)不夠內(nèi)存情況下會(huì)自動(dòng)回收靜態(tài)內(nèi)存,這樣就會(huì)引起訪問全局靜態(tài)錯(cuò)誤。
方式二: 使用公共變量傳值
主窗體frmMain中代碼
public partial class frmMain : Form
{
//聲明工位ID 為公共變量
public string terminalID = "";
//給變量賦值
terminalID = "q13bh01-bh12";
//單擊‘行為'按鈕的時(shí)候會(huì)給窗體傳值
private void btnGroup_Click(object sender, EventArgs e)
{
frmGroup frmGro = new frmGroup();
//變量傳值 ,注意順序?qū)懺赟howDialog()方法之前
frmGro .stationID = this.terminalID;
frmGro .ShowDialog();
}
}
子窗體frmGroup中代碼
public partial class frmGroup : Form
{
//定義公共屬性
public string stationID = "";
}
特點(diǎn) : 單向傳值,只能主窗體給子窗體傳值,實(shí)現(xiàn)簡(jiǎn)單
方式三: 使用委托傳值
先來看子窗體frmGroup中代碼
namespace Siemens.Simatic.GUIClient.MESClient
{
//1、聲明一個(gè)委托
public delegate void setTextValue(string textValue,bool flag);
public partial class frmGroup : Form
{
//2、聲明一個(gè)委托類型的事件
public event setTextValue setFormTextValue;
public string groupName = "";
public bool flagBtnGroup = false;
public frmGroup()
{
InitializeComponent();
}
//輪詢‘行為'按鈕(相當(dāng)于按鈕單擊事件)
private void tmrBtn_Tick(object sender, EventArgs e)
{
if (sender is ButtonX) {
ButtonX butX = (ButtonX)sender;//判斷觸發(fā)事件的是不是Button
groupName = butX.Text.Trim();
flagBtnGroup = true;
//3、準(zhǔn)備要回傳的數(shù)據(jù)。
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);
//變量傳值 ,注意順序?qū)懺赟howDialog()方法之前
frmGro .stationID = this.terminalID;
frmGro .ShowDialog();
}
//5、事件具體實(shí)現(xiàn)
public void frmGro _setFormTextValue(string textValue,bool flag)
{
this.newGroupName = textValue;
this.flagBtnGroup = flag;
if (!string.IsNullOrEmpty(newGroupName))
{
……
}
}
特點(diǎn) :適合子窗體數(shù)據(jù)實(shí)時(shí)回傳父窗體。
方式四:使用構(gòu)造函數(shù)傳遞一個(gè)數(shù)值
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窗體整個(gè)傳遞給B窗體
有些時(shí)候需要在B窗體里對(duì)A窗體的某個(gè)控件值做修改,并且需要立即改變A窗體的控件顯示,本方法適合這種情況。
修改FormA,把要在B里處理的控件的可訪問性(Modifiers)設(shè)為public,然后按下面的方式處理
class FormA
{
public void ShowB()
{
FormB fb=new FormB(this); // 在構(gòu)造函數(shù)里把A窗體本身傳過去
fb.Show();
}
}
class FormB
{
FormA fm; //B窗體增加一個(gè)FormA類型的成員
public FormB(FormA fm) //添加一個(gè)帶參數(shù)的構(gòu)造方法,參數(shù)類型是FormA
{
this.fm=fm;
}
protected void Method1()
{
fm.txtName.Text="Haha!"; //在這兒可以直接操作A窗體里的控件了!
}
}
叨叨兩句
項(xiàng)目中父窗體向子窗體傳值傳的是固定值,用的是第一種方式,子窗體向父窗體傳值傳的是變化的值,用的是第三種方式,第三種方式為我解決了一個(gè)大麻煩。
總結(jié)
感謝您的閱讀,窗體傳值有好多種方法,構(gòu)造參數(shù)參數(shù)傳值、公共屬性傳值等,各種場(chǎng)景下找到適合需求的最好,希望為小編提出寶貴意見!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)基于鏈表的內(nèi)存記事本實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)基于鏈表的內(nèi)存記事本,實(shí)例分析了C#基于鏈表實(shí)現(xiàn)的記事本功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#使用ODBC與OLEDB連接數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了C#使用ODBC與OLEDB連接數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了C#基于ODBC與OLEDB實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接操作簡(jiǎn)單操作技巧,需要的朋友可以參考下2017-05-05
c# WinForm 窗體之間傳值的幾種方式(小結(jié))
這篇文章主要介紹了WinForm 窗體之間傳值的幾種方式(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09
c# 多線程環(huán)境下控制對(duì)共享資源訪問的解決方法
這篇文章主要介紹了c# 多線程環(huán)境下控制對(duì)共享資源訪問的解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07
Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決
今天在做個(gè)東西,發(fā)現(xiàn)報(bào)錯(cuò),特此來記錄一下,本文介紹了Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決,感興趣的可以了解一下2021-05-05
C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例
這篇文章主要介紹了C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11

