子表單和父表單雙向傳值——C#表單傳值方法總結

來源:互聯網
上載者:User

標籤:c#   表單傳值   

簡介

  在很多情境下,我們的程式需要完成表單間的傳值功能,有時候是父表單→子表單單向傳值、子表單→父表單傳值甚至是,也有時候我們需要父表單?子表單雙向傳值。
  在本文中主要介紹一些能夠實現雙向傳值的方法,能夠雙向傳值的方法也能夠實現單向傳值。
  本文的所有源碼都可以在GitHub上下載。
  
  本文介紹的方法僅限於我自己知道並且實現過的,我相信還有很多我並不知道的方法,因此也許在很多朋友眼中本文的內容是淺顯甚至可笑的,希望路過的各方朋友不吝賜教,我也希望不斷地進步!

方法1:Public欄位+ShowDialog原理

  這個方法的原理就是:
  1.父表單在執行個體化子表單對象(假定名為childWindow)的時候,通過對子表單Public欄位進行賦值的方法,完成父表單→子表單的傳值;
  2.父表單執行個體化子表單後,調用子表單的childWindow.ShowDialog()方法;
  3.隨後在父表單中對childWindow.DialogResult的值進行判斷,當會話結束的時候,將childWindow的欄位值傳給父表單,實現子表單→父表單的傳值。

代碼

  範例程式碼:
  父表單為MainWindow,子表單為ChildWindow,我們將兩個表單間Title欄位值進行互傳。邏輯代碼我們都放在了表單的按鈕點擊事件中,用按鈕來觸發。
  
  父表單代碼:

/// <summary>/// 給子表單傳值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_ShowChild_Click(object sender, RoutedEventArgs e){    ChildWindow child = new ChildWindow() {  Title="我的名字是父表單給的!" };//第1步,給子表單傳值了    child.ShowDialog();//第2步,調用ShowDialog    if (child.DialogResult==true)//第3步,然後對DialogResult進行判斷    {        this.Title = child.Title;//子表單給父表單傳值    }}

  子表單代碼  

/// <summary>/// 給父表單傳值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_ShowFather_Click(object sender, RoutedEventArgs e){    this.Title = "我要給父表單傳值";    this.DialogResult = true;//第3步,首先會話結束}
效果

  為證:
  父表單→子表單
  點擊“給子表單傳值”
  
  子表單→父表單
  點擊“給父表單傳值”
  

總結

  優點:這種方法簡單方便,可以實現子表單和父表單間互相傳值;
  缺點:不夠靈活,子表單和父表單都需要承載中間值的對象,而且需要藉助ShowDialog()和DialogResult。

方法2:公用類的靜態欄位原理

  這個方法的原理就是:父表單和子表單分別對同一公用類的靜態欄位(可以是同一個欄位也可以是不同的欄位)進行賦值,然後父表單和子表單各自擷取這些欄位的值,就能夠實現表單間的傳值。
  該方法同樣需要藉助到ShowDialog()和DialogResult。

代碼

  公用類代碼  

/// <summary>/// 公用類/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public class InfoClass{    public static string Title { get; set; }    public static string Message { get; set; }}

  父表單代碼 

/// <summary>/// 執行個體化子表單,為公用類靜態欄位賦值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_ShowChild_Click(object sender, RoutedEventArgs e){    InfoClass.Title = "我的名字來自公用類!";    ChildWindow child = new ChildWindow();    child.ShowDialog();    if (child.DialogResult==true)    {        this.Title=InfoClass.Title;        MessageBox.Show(InfoClass.Message);    }}

  子表單代碼 

/// <summary>/// 載入事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Window_Loaded(object sender, RoutedEventArgs e){    this.Title = InfoClass.Title;}/// <summary>/// 修改公用類的靜態欄位,變相為父表單賦值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_ShowFather_Click(object sender, RoutedEventArgs e){    InfoClass.Title = "我的名字也是來自公用類!";    InfoClass.Message = "這是子表單留下的資訊!";    this.DialogResult = true;}
效果

  為證:
  父表單→子表單
  點擊“給子表單傳值”
  
  子表單→父表單
  點擊“給父表單傳值”
  
  

總結方法3:建構函式+委託(我認為最好的方法)原理

  這個方法的原理就是:
  1.父表單利用子表單的建構函式向子表單傳值;
  2.自訂子表單的建構函式,函數簽名包含一個委託函數;
  3.在子表單中調用來自父表單傳遞的委託函數,對對父表單進行傳值。

代碼

  委託代碼
  這個方法需要用到委託函數,我們將委託函數單獨定義在公用類檔案裡面。
  代碼如下:

public delegate void ShowMessage(string value);

  父表單代碼
  

/// <summary>/// 通過自訂建構函式,給子表單傳值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_ShowChild_Click(object sender, RoutedEventArgs e){    ChildWindow child = new ChildWindow(ShowErrorMessage,"這是來自父表單的資訊");    child.Show();}/// <summary>/// 符合委託函數ShowMessage傳回型別和簽名的函數執行個體/// </summary>/// <param name="value"></param>private void ShowErrorMessage(string value){    MessageBox.Show(value,"父表單提示框");}

  子表單代碼

ShowMessage sm;string value="";public ChildWindow(ShowMessage _sm,string _value){    InitializeComponent();    sm = _sm;    value = _value;}/// <summary>/// 載入事件,顯示父表單傳遞來的值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Window_Loaded(object sender, RoutedEventArgs e){    MessageBox.Show(value, "子表單提示框");}/// <summary>/// 調用父表單傳來的委託函數,給父表單傳值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_ShowFather_Click(object sender, RoutedEventArgs e){    sm.Invoke("這是來自子表單的資訊!");}
效果

  為證:
  
  父表單→子表單
  點擊“給子表單傳值”
  
  子表單→父表單
  點擊“給父表單傳值”
  
  

總結

  優點:能夠在不關閉子表單的情況下實現兩個表單間的傳值(而且不僅限於傳值),靈活方便,功能強大;
  缺點:需要對委託有一定的瞭解,使用起來需要對這個方法有一定的理解;

子表單和父表單雙向傳值——C#表單傳值方法總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.