標籤: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#表單傳值方法總結