前言
小編最近維護一個Winfrom窗體,是項目中CS端的主窗體,很多子窗體需要從主窗體獲取值,同時子窗體還需要給主窗體回傳值,下面來給大家介紹一下。
正文
本文中以主窗體為frmMain,子窗體為frmGroup ,兩窗體之間的傳值來做示例。
方式一: 使用公共靜態(tài)變量傳值
主窗體frmMain中代碼
1
2
3
4
5
6
7
|
public partial class frmMain : Form { //聲明工位ID 為公共靜態(tài)變量 public static string terminalID = "" ; //給靜態(tài)變量賦值 terminalID = "q13bh01-bh12" ; } |
子窗體frmGroup中代碼
1
2
3
4
5
6
|
private void frmGroup_Load( object sender, EventArgs e) { this .txtTerminalID.Text= frmMain.terminalID.Trim(); //可以再賦值給靜態(tài)成員,方便其他窗體調(diào)用 frmMain.terminalID = "q13bh01-bh11" ; } |
特點 : 雙向傳值,實現(xiàn)簡單
缺點: 靜態(tài)變量在類加載的時候分配內(nèi)存,存儲于方法區(qū),一般不會被銷毀,在系統(tǒng)不夠內(nèi)存情況下會自動回收靜態(tài)內(nèi)存,這樣就會引起訪問全局靜態(tài)錯誤。
方式二: 使用公共變量傳值
主窗體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(); //變量傳值 ,注意順序?qū)懺赟howDialog()方法之前 frmGro .stationID = this .terminalID; frmGro .ShowDialog(); } } |
子窗體frmGroup中代碼
1
2
3
4
5
|
public partial class frmGroup : Form { //定義公共屬性 public string stationID = "" ; } |
特點 : 單向傳值,只能主窗體給子窗體傳值,實現(xiàn)簡單
方式三: 使用委托傳值
先來看子窗體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; //判斷觸發(fā)事件的是不是Button groupName = butX.Text.Trim(); flagBtnGroup = true ; //3、準備要回傳的數(shù)據(jù)。 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); //變量傳值 ,注意順序?qū)懺赟howDialog()方法之前 frmGro .stationID = this .terminalID; frmGro .ShowDialog(); } //5、事件具體實現(xiàn) public void frmGro _setFormTextValue( string textValue, bool flag) { this .newGroupName = textValue; this .flagBtnGroup = flag; if (! string .IsNullOrEmpty(newGroupName)) { …… } } |
特點 :適合子窗體數(shù)據(jù)實時回傳父窗體。
方式四:使用構(gòu)造函數(shù)傳遞一個數(shù)值
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)設(shè)為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 ); // 在構(gòu)造函數(shù)里把A窗體本身傳過去 fb.Show(); } } class FormB { FormA fm; //B窗體增加一個FormA類型的成員 public FormB(FormA fm) //添加一個帶參數(shù)的構(gòu)造方法,參數(shù)類型是FormA { this .fm=fm; } protected void Method1() { fm.txtName.Text= "Haha!" ; //在這兒可以直接操作A窗體里的控件了! } } |
叨叨兩句
項目中父窗體向子窗體傳值傳的是固定值,用的是第一種方式,子窗體向父窗體傳值傳的是變化的值,用的是第三種方式,第三種方式為我解決了一個大麻煩。
總結(jié)
感謝您的閱讀,窗體傳值有好多種方法,構(gòu)造參數(shù)參數(shù)傳值、公共屬性傳值等,各種場景下找到適合需求的最好,希望為小編提出寶貴意見!
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/zt15732625878/article/details/79685336