文章目錄
在winForm應用程式中,視窗間資料的傳遞是最多的應用之一,尤其是在管理軟體當中。
視窗的資料傳遞,有多種方式,在這篇隨筆中主要是闡述一下利用委託如何來傳遞資料。
在本執行個體程式中,有兩個表單:一個主表單FrmMain,接收資料;一個子表單FrmChild,傳出資料,UI如下:
在主表單中,[設定]按鈕,彈出子表單,在文字框中輸入相應的值後,點擊[確認]返回到主表單,同時返回資料至主表單。
具體代碼實現如下:
一、定義事件類別:
public class PassDataWinFormEventArgs : EventArgs
{
public PassDataWinFormEventArgs()
{
//
}
public PassDataWinFormEventArgs(string refName, string refPlace, int refAge)
{
this._name = refName;
this._place = refPlace;
this._age = refAge;
}
private string _name;
private string _place;
private int _age;
public string Name
{
get { return _name; }
set { _name = value; }
}
public string Place
{
get { return _place; }
set { _place = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
}
通過PassDataWinFormEventArgs的執行個體,傳遞資料。
二、在子表單中設計如下代碼:
//添加一個委託
public delegate void PassDataBetweenFormHandler(object sender, PassDataWinFormEventArgs e);
//添加一個PassDataBetweenFormHandler類型的事件
public event PassDataBetweenFormHandler PassDataBetweenForm;
書寫子表單確認按鈕的代碼如下:
private void bbtOK_Click(object sender, EventArgs e)
{
string name,place;
int age;
name = txtName.Text;
place = txtPlace.Text;
Int32.TryParse(txtAge.Text, out age);
PassDataWinFormEventArgs args = new PassDataWinFormEventArgs(name, place, age);
PassDataBetweenForm(this, args);
this.Dispose();
}
三、設計主表單代碼:
主表單中[設定]按鈕的代碼如下:
private void bbtSetup_Click(object sender, EventArgs e)
{
FrmChild frmChild = new FrmChild();
frmChild.PassDataBetweenForm += new FrmChild.PassDataBetweenFormHandler(FrmChild_PassDataBetweenForm);
frmChild.Show();
frmChild.Activate();
}
主要用來開啟子表單,綁定事件。
在FrmChild_PassDataBetweenForm()方法中接收PassDataWinFormEventArgs執行個體傳遞迴來的資料,故此FrmChild_PassDataBetweenForm()代碼如下:
private void FrmChild_PassDataBetweenForm(object sender,PassDataWinFormEventArgs e)
{
this.txtName.Text = e.Name;
this.txtPlace.Text = e.Place;
this.txtAge.Text = e.Age.ToString();
}
四、後記:
利用委託進行資料傳遞,有一個很大的優點就是,可以在任何表單中調用子表單,而不用修改子表單內部的設計,從而達到高度複用子表單。
0 0
0
(請您對文章做出評價)« 上一篇:委託之非同步
» 下一篇:Javascript擷取CheckBoxList的value
posted on 2009-10-24 23:19 inforasc 閱讀(345) 評論(9) 編輯 收藏 網摘 所屬分類: C#基礎知識
評論
1740010
#1樓 2009-10-25 22:05 WinForm初學者[未註冊使用者] 在子表單中頂一個public 的 PassDataWinFormEventArgs,主表單直接擷取,這種方式有什麼缺點呐?
回複 引用
#2樓 2009-10-25 22:17 netKing 調試走到這一步時,報錯
PassDataBetweenForm(this, args);
錯誤是:未將對象引用設定到對象的執行個體。
回複 引用 查看
#3樓 2009-10-26 09:31 邢少 什麼意思?..你是要說明委託的一種應用方式嗎?還是要說委託可以用來傳遞參數。
還是說它是一個回呼函數。
回複 引用 查看
#4樓[樓主] 2009-10-26 20:33 inforasc @邢少
應該是 委託的一種應用吧!
在winform之間傳遞資料的時候,曾經嘗試過其他方法,比如用Owner屬性,總是感覺耦合性較高!
回複 引用 查看
#5樓[樓主] 2009-10-26 20:36 inforasc @netKing
代碼應該是沒問題的,我是從Vs.Net源碼裡面直接黏貼出來的。
可以告訴我具體是哪一個 對象未 執行個體化 嗎?
回複 引用 查看
#6樓 2009-10-27 08:39 邢少 @inforasc
嗯。推薦。記得以前有一次 有人問了我一個問題。問:有a介面,介面上有一個按鈕,彈出b頁面,實現b控制a頁面的圖片變化?有幾種方式?最少3種
回複 引用 查看
#7樓 2009-10-27 23:35 ibate86 謝謝樓主,雖然不知道是不是新的思路,但卻是第一次聽說。多謝~
回複 引用 查看
#8樓[樓主] 2009-10-28 01:37 inforasc @ibate86
不是新思路,是實際項目中使用的,而且在一些技術文章上也看到過,好像在CodeProject上
回複 引用 查看
#9樓 2010-01-04 13:43 StephenJu
view source
print?
01 |
private void bbtOK_Click( object sender, EventArgs e) |
05 |
place = txtPlace.Text; |
06 |
Int32.TryParse(txtAge.Text, out age); |
07 |
if (PassDataBetweenForm != null ) |
09 |
PassDataWinFormEventArgs args = new PassDataWinFormEventArgs(name, place, age); PassDataBetweenForm( this , args); |