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