a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

c# WinForm 窗體之間傳值的幾種方式(小結)

2019-10-29 19:59:28
字體:
來源:轉載
供稿:網友

前言

小編最近維護一個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窗體里的控件了!}}

叨叨兩句

項目中父窗體向子窗體傳值傳的是固定值,用的是第一種方式,子窗體向父窗體傳值傳的是變化的值,用的是第三種方式,第三種方式為我解決了一個大麻煩。

總結

感謝您的閱讀,窗體傳值有好多種方法,構造參數參數傳值、公共屬性傳值等,各種場景下找到適合需求的最好,希望為小編提出寶貴意見!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久亚洲网| 欧美成人一区二区三区 | 成人av在线看 | 黄色免费av | 欧美性一区二区三区 | 男女网站 | 毛片网| 爱爱视频免费播放 | 国产综合精品一区二区三区 | 亚洲天堂久久 | 国产一级视频 | 欧美日韩无 | 亚洲视频在线播放 | 久草免费在线 | 麻豆精品久久久 | 一区二区在线观看视频 | 亚洲国产成人精品女人久久久 | 国产无毒不卡 | 在线播放国产视频 | 国产成人一区 | 色噜噜视频 | 一区二区国产精品 | 日本亚洲国产一区二区三区 | 免费成人精品 | 一区二区亚洲 | 91干在线观看 | 国产在线拍 | 欧美日韩h| 精品在线一区二区三区 | 日韩精品www| 国产成人精品午夜视频' | 亚洲欧美一区二区三区在线 | 欧美一区二区久久久 | 日韩在线精品视频 | 宅宅久久 | 久久久久一区二区三区 | 午夜免费看片 | 欧美精品一区二区视频 | 日韩在线免费 | 91精品久久久久久久91蜜桃 | 欧美黄色片 |