激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - c# WinForm 窗體之間傳值的幾種方式(小結)

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

2022-02-28 14:22大白快跑8 C#

這篇文章主要介紹了WinForm 窗體之間傳值的幾種方式(小結),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

小編最近維護一個Winfrom窗體,是項目中CS端的主窗體,很多子窗體需要從主窗體獲取值,同時子窗體還需要給主窗體回傳值,下面來給大家介紹一下。

正文

本文中以主窗體為frmMain,子窗體為frmGroup ,兩窗體之間的傳值來做示例。

方式一: 使用公共靜態變量傳值

主窗體frmMain中代碼

?
1
2
3
4
5
6
7
public partial class frmMain : Form
{
 //聲明工位ID 為公共靜態變量
 public static string terminalID = "";
 //給靜態變量賦值
 terminalID = "q13bh01-bh12";
 }

子窗體frmGroup中代碼

?
1
2
3
4
5
6
private void frmGroup_Load(object sender, EventArgs e)
{
  this.txtTerminalID.Text= frmMain.terminalID.Trim();
  //可以再賦值給靜態成員,方便其他窗體調用
  frmMain.terminalID = "q13bh01-bh11";
}

特點 : 雙向傳值,實現簡單
缺點: 靜態變量在類加載的時候分配內存,存儲于方法區,一般不會被銷毀,在系統不夠內存情況下會自動回收靜態內存,這樣就會引起訪問全局靜態錯誤。

方式二: 使用公共變量傳值

主窗體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();
      //變量傳值 ,注意順序寫在ShowDialog()方法之前
      frmGro .stationID = this.terminalID;
      frmGro .ShowDialog();
    }
 }

子窗體frmGroup中代碼

?
1
2
3
4
5
public partial class frmGroup : Form
{
 //定義公共屬性
 public string stationID = "";
}

特點 : 單向傳值,只能主窗體給子窗體傳值,實現簡單

方式三: 使用委托傳值

先來看子窗體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;//判斷觸發事件的是不是Button
        groupName = butX.Text.Trim();
        flagBtnGroup = true;
        //3、準備要回傳的數據。
        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);
     //變量傳值 ,注意順序寫在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))
     {
        ……
     }
    }

特點 :適合子窗體數據實時回傳父窗體。

方式四:使用構造函數傳遞一個數值

?
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)設為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); // 在構造函數里把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窗體里的控件了!
}
}

叨叨兩句

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

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/zt15732625878/article/details/79685336

延伸 · 閱讀

精彩推薦
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
主站蜘蛛池模板: 色网站在线免费观看 | a视频在线免费观看 | 国产成人在线看 | 久久免费精品 | 一级电影免费在线观看 | 日本网站一区 | 亚洲精品欧美在线 | 欧美一区二区三区久久精品视 | 中文字幕在线观看免费 | 色人阁在线视频 | 91九色网 | 中文字幕专区高清在线观看 | 中国大陆一级毛片 | 黑色丝袜美美女被躁视频 | 99影视在线视频免费观看 | 法国性经典xxxhd | 日韩av日韩 | 在线视频1区 | 久久久精品精品 | 久草在线新时代视觉 | 特级a欧美做爰片毛片 | 日韩字幕| 九九热视频在线免费观看 | 成人福利在线免费观看 | 国产国语毛片 | 成人毛片av在线 | 亚洲一区在线观看视频 | 亚洲最大的成人网 | 97青青| 精品久久久久久久久久久下田 | 精品国产第一区二区三区 | 色婷婷一区二区三区 | 久久精品污| 日本在线播放一区二区三区 | 九九热在线精品视频 | 免费在线国产精品 | 欧美日韩国产中文字幕 | 国产精品视频六区 | 成人免费av在线播放 | 免费看真人a一级毛片 | 日产精品久久久一区二区开放时间 |