国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

在.net中輕松掌握Windows窗體間的數(shù)據(jù)交互(二)

2024-07-10 13:00:21
字體:
供稿:網(wǎng)友


在.net中輕松掌握windows窗體間的數(shù)據(jù)交互(二)

zhzuo(秋楓)

《在.net中輕松掌握windows窗體間的數(shù)據(jù)交互(一)》一文中我們講了使用帶參數(shù)的構(gòu)造函數(shù)來實(shí)現(xiàn)窗體間的數(shù)據(jù)傳遞,我認(rèn)為是用的比較多的一種,接下來讓我們看看另外兩種實(shí)現(xiàn)方法。

二.給窗體添加屬性或方法

1.使用form類的owner屬性

獲取或設(shè)置擁有此窗體的窗體。若要使某窗體歸另一個(gè)窗體所有,請(qǐng)為其 owner 屬性分配一個(gè)對(duì)將成為所有者的窗體的引用。當(dāng)一個(gè)窗體歸另一窗體所有時(shí),它便隨著所有者窗體最小化和關(guān)閉。例如,如果 form2 歸窗體 form1 所有,則關(guān)閉或最小化 form1 時(shí),也會(huì)關(guān)閉或最小化 form2。并且附屬窗體從不顯示在其所有者窗體后面??梢詫⒏綄俅绑w用于查找和替換窗口之類的窗口,當(dāng)選定所有者窗體時(shí),這些窗口不應(yīng)消失。若要確定某父窗體擁有的窗體,請(qǐng)使用ownedforms屬性。

上面是sdk幫助文檔上講的,下面我們就來使用它。

首先還是使用第一篇文章中的第二個(gè)例子,窗體如下:


說明:在這個(gè)例子中我們的兩個(gè)窗體都加了一個(gè)listbox用來顯示arraylist中的內(nèi)容。

主窗體中控件:listboxfrm1,buttonedit;

子窗體中控件:listboxfrm2,textboxadd,buttonadd,buttonedit,buttonok。

主窗體中還是定義類數(shù)據(jù)成員,

private arraylist listdata1;

在構(gòu)造函數(shù)里實(shí)例化它,填充數(shù)據(jù),最后綁定到listboxfrm1。

構(gòu)造函數(shù)如下:

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;

}

主窗體的修改按鈕處理函數(shù):

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;

}

我們?cè)O(shè)置了formchild.owner為this,這樣,子窗體和主窗體就有聯(lián)系了,

當(dāng)然我們也可以改成如下:

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)來實(shí)現(xiàn),

public arraylist listdata1

{

get{return this.listdata1;}

}

這里我采用屬性,感覺語法更靈活,清楚。

下面是對(duì)form2的修改,

構(gòu)造函數(shù)又恢復(fù)原貌了。

public form2()

{

initializecomponent();

}

另外又新增了一個(gè)窗體的load事件,在它的事件處理函數(shù)中來獲取主窗體中的數(shù)據(jù),

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);

}

有人會(huì)問,為什么不把上面的代碼放到構(gòu)造函數(shù)里面去呢?如下不是更好,

public form2()

{

initializecomponent();

form1 pareform = (form1)this.owner;

this.listdata2 = pareform.listdata1;

foreach(object o in this.listdata2)

this.listboxfrm2.items.add(o);

}

那我會(huì)對(duì)你說錯(cuò)了,因?yàn)樵谥鞔绑w修改按鈕被點(diǎn)擊后,開始執(zhí)行

form2 formchild = new form2();

而在form2的實(shí)例化過程中會(huì)在構(gòu)造函數(shù)中執(zhí)行

form1 pareform = (form1)this.owner;

而這時(shí)的this.owner是沒有值的,為空引用,那么下面的代碼肯定也出問題,

this.listdata2 = pareform.listdata1;

foreach(object o in this.listdata2)

this.listboxfrm2.items.add(o);

當(dāng)整個(gè)form2實(shí)例化完成后,才會(huì)執(zhí)行

formchild.owner = this;

這條代碼,所以使用了form2_load事件。

那怎樣可以不使用form2_load事件呢?等下面我們來修改代碼實(shí)現(xiàn)它。

下面的子窗體代碼沒有變化,

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("請(qǐng)輸入添加的內(nèi)容!");

}

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("請(qǐng)選擇刪除項(xiàng)!");

}

private void buttonok_click(object sender, system.eventargs e)

{

this.close();

}

好了,結(jié)果同第一篇中的一樣,子窗體能修改主窗體的值。

2.使用自定義屬性或方法

下面我們來講講怎樣使用自定義屬性或方法來完成數(shù)據(jù)修改功能而不使用form2_load事件。

主窗體的修改按鈕點(diǎn)擊處理函數(shù)如下:

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;

}

并且我們?nèi)サ袅酥鞔绑w的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);

}

而在主窗體的修改按鈕處理函數(shù)中也要相應(yīng)改動(dòng):

formchild.listdata2 = this.listdata1;

改為

formchild.setlistdata(this.listdata1);

總結(jié),我們通過form類的owner屬性來建立主從窗體間的橋梁,這個(gè)是不是類似于把主窗體作為子窗體的構(gòu)造函數(shù)參數(shù)傳入實(shí)現(xiàn)的功能差不多;另外又采用了屬性和方法來完成數(shù)據(jù)的交互,我覺得這種實(shí)現(xiàn)方法很實(shí)用,特別是用在不需要實(shí)例化類或著已經(jīng)有了實(shí)例的情況下傳遞數(shù)據(jù)。下一篇文章我們來講如何使用靜態(tài)類來完成數(shù)據(jù)的交互。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 个旧市| 安阳市| 三门峡市| 阳山县| 郧西县| 安西县| 涞源县| 绵阳市| 九龙城区| 湖南省| 县级市| 东城区| 同仁县| 泸水县| 始兴县| 远安县| 鄂伦春自治旗| 兰考县| 舟山市| 依安县| 惠水县| 三门峡市| 雷山县| 双城市| 江门市| 栖霞市| 皮山县| 平定县| 大庆市| 静安区| 长春市| 五寨县| 宝坻区| 弥渡县| 肃宁县| 山东省| 岗巴县| 博白县| 博白县| 卢湾区| 沙田区|