在.net中輕鬆掌握Windows表單間的資料互動(二)
來源:互聯網
上載者:User
window|互動|資料
在.net中輕鬆掌握Windows表單間的資料互動(二)
zhzuo(秋楓)
《在.net中輕鬆掌握Windows表單間的資料互動(一)》一文中我們講了使用帶參數的建構函式來實現表單間的資料傳遞,我認為是用的比較多的一種,接下來讓我們看看另外兩種實現方法。
二.給表單添加屬性或方法
1.使用Form類的Owner屬性
擷取或設定擁有此表單的表單。若要使某表單歸另一個表單所有,請為其 Owner 屬性分配一個對將成為所有者的表單的引用。當一個表單歸另一表單所有時,它便隨著所有者表單最小化和關閉。例如,如果 Form2 歸表單 Form1 所有,則關閉或最小化 Form1 時,也會關閉或最小化 Form2。並且附屬表單從不顯示在其所有者表單後面。可以將附屬表單用於尋找和替換視窗之類的視窗,當選定所有者表單時,這些視窗不應消失。若要確定某父表單擁有的表單,請使用OwnedForms屬性。
上面是SDK協助文檔上講的,下面我們就來使用它。
首先還是使用第一篇文章中的第二個例子,表單如下:
說明:在這個例子中我們的兩個表單都加了一個ListBox用來顯示ArrayList中的內容。
主表單中控制項:listBoxFrm1,buttonEdit;
子表單中控制項:listBoxFrm2,textBoxAdd,buttonAdd,buttonEdit,buttonOK。
主表單中還是定義類資料成員,
private ArrayList listData1;
在建構函式裡執行個體化它,填充資料,最後綁定到listBoxFrm1。
建構函式如下:
public Form1()
{
InitializeComponent();
this.listData1 = new ArrayList();
this.listData1.Add("DotNet");
this.listData1.Add("C#");
this.listData1.Add("Asp.net");
this.listData1.Add("WebService");
this.listData1.Add("XML");
this.listBoxFrm1.DataSource = this.listData1;
}
主表單的修改按鈕處理函數:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
Form2 formChild = new Form2();
formChild.Owner = this;
formChild.ShowDialog();
this.listBoxFrm1.DataSource = null;
this.listBoxFrm1.DataSource = this.listData1;
}
我們設定了formChild.Owner為this,這樣,子表單和主表單就有聯絡了,
當然我們也可以改成如下:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
Form2 formChild = new Form2();
formChild.ShowDialog(this);
this.listBoxFrm1.DataSource = null;
this.listBoxFrm1.DataSource = this.listData1;
}
不過這樣還不行,目前主表單的listData1變數外部存取不到,
private ArrayList listData1;
必須修改為public存取修飾詞,
public ArrayList listData1;
也可以通過屬性(property)來實現,
public ArrayList ListData1
{
get{return this.listData1;}
}
這裡我採用屬性,感覺文法更靈活,清楚。
下面是對Form2的修改,
建構函式又恢複原貌了。
public Form2()
{
InitializeComponent();
}
另外又新增了一個表單的Load事件,在它的事件處理函數中來擷取主表單中的資料,
private void Form2_Load(object sender, System.EventArgs e)
{
Form1 pareForm = (Form1)this.Owner;
this.listData2 = pareForm.ListData1;
foreach(object o in this.listData2)
this.listBoxFrm2.Items.Add(o);
}
有人會問,為什麼不把上面的代碼放到建構函式裡面去呢?如下不是更好,
public Form2()
{
InitializeComponent();
Form1 pareForm = (Form1)this.Owner;
this.listData2 = pareForm.ListData1;
foreach(object o in this.listData2)
this.listBoxFrm2.Items.Add(o);
}
那我會對你說錯了,因為在主表單修改按鈕被點擊後,開始執行
Form2 formChild = new Form2();
而在Form2的執行個體化過程中會在建構函式中執行
Form1 pareForm = (Form1)this.Owner;
而這時的this.Owner是沒有值的,為空白引用,那麼下面的代碼肯定也出問題,
this.listData2 = pareForm.ListData1;
foreach(object o in this.listData2)
this.listBoxFrm2.Items.Add(o);
當整個Form2執行個體化完成後,才會執行
formChild.Owner = this;
這條代碼,所以使用了Form2_Load事件。
那怎樣可以不使用Form2_Load事件呢?等下面我們來修改代碼實現它。
下面的子表單代碼沒有變化,
private void buttonAdd_Click(object sender, System.EventArgs e)
{
if(this.textBoxAdd.Text.Trim().Length>0)
{
this.listData2.Add(this.textBoxAdd.Text.Trim());
this.listBoxFrm2.Items.Add(this.textBoxAdd.Text.Trim());
}
else
MessageBox.Show("請輸入添加的內容!");
}
private void buttonDel_Click(object sender, System.EventArgs e)
{
int index = this.listBoxFrm2.SelectedIndex;
if(index!=-1)
{
this.listData2.RemoveAt(index);
this.listBoxFrm2.Items.RemoveAt(index);
}
else
MessageBox.Show("請選擇刪除項!");
}
private void buttonOK_Click(object sender, System.EventArgs e)
{
this.Close();
}
好了,結果同第一篇中的一樣,子表單能修改主表單的值。
2.使用自訂屬性或方法
下面我們來講講怎樣使用自訂屬性或方法來完成資料修改功能而不使用Form2_Load事件。
主表單的修改按鈕點擊處理函數如下:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
Form2 formChild = new Form2();
formChild.ListData2 = this.listData1;
formChild.ShowDialog();
this.listBoxFrm1.DataSource = null;
this.listBoxFrm1.DataSource = this.listData1;
}
並且我們去掉了主表單的ListData1屬性,
//public ArrayList ListData1
//{
// get{return this.listData1;}
//}
而在子表單中加上ListData2屬性,
public ArrayList ListData2
{
set
{
this.listData2 = value;
foreach(object o in this.listData2)
this.listBoxFrm2.Items.Add(o);
}
}
也可以把屬性改成方法,
public void SetListData(ArrayList listData)
{
this.listData2 = listData;
foreach(object o in this.listData2)
this.listBoxFrm2.Items.Add(o);
}
而在主表單的修改按鈕處理函數中也要相應改動:
formChild.ListData2 = this.listData1;
改為
formChild.SetListData(this.listData1);
總結,我們通過Form類的Owner屬性來建立主從表單間的橋樑,這個是不是類似於把主表單作為子表單的建構函式參數傳入實現的功能差不多;另外又採用了屬性和方法來完成資料的互動,我覺得這種實現方法很實用,特別是用在不需要執行個體化類或著已經有了執行個體的情況下傳遞資料。下一篇文章我們來講如何使用靜態類來完成資料的互動。