1. 程式人生 > >【WinForm】—窗體之間傳值的幾種方式

【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))
            {
                 ……
            }
         }

特點 :適合子窗體資料實時回傳父窗體。

叨叨兩句

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

總結

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