欧美一区2区三区4区公司二百,国产精品婷婷午夜在线观看,自拍偷拍亚洲精品,国产美女诱惑一区二区

窗口間的數據傳遞(二)

?

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

?

1.使用Form類的Owner屬性

?

獲取或設置擁有此窗體的窗體。若要使某窗體歸另一個窗體所有,請為其 Owner 屬性分配一個對將成為所有者的窗體的引用。當一個窗體歸另一窗體所有時,它便隨著所有者窗體最小化和關閉。例如,如果 Form2 歸窗體 Form1 所有,則關閉或最小化Form1 時,也會關閉或最小化 Form2。并且附屬窗體從不顯示在其所有者窗體后面。可以將附屬窗體用于查找和替換窗口之類的窗口,當選定所有者窗體時,這些窗口不應消失。若要確定某父窗體擁有的窗體,請使用OwnedForms屬性。

?

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

窗口間的數據傳遞(二)

?

?

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

說明:在這個例子中我們的兩個窗體都加了一個ListBox用來顯示ArrayList中的內容。

?

主窗體中控件:listBoxFrm1buttonEdit

?

子窗體中控件:listBoxFrm2textBoxAddbuttonAddbuttonEditbuttonOK

?

主窗體中還是定義類數據成員,

?

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.Ownerthis,這樣,子窗體和主窗體就有聯系了,

?

當然我們也可以改成如下:

?

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屬性來建立主從窗體間的橋梁,這個是不是類似于把主窗體作為子窗體的構造函數參數傳入實現的功能差不多;另外又采用了屬性和方法來完成數據的交互,我覺得這種實現方法很實用,特別是用在不需要實例化類或著已經有了實例的情況下傳遞數據。

文章鏈接: http://m.qzkangyuan.com/10729.html

文章標題:窗口間的數據傳遞(二)

文章版權:夢飛科技所發布的內容,部分為原創文章,轉載請注明來源,網絡轉載文章如有侵權請聯系我們!

聲明:本站所有文章,如無特殊說明或標注,均為本站原創發布。任何個人或組織,在未征得本站同意時,禁止復制、盜用、采集、發布本站內容到任何網站、書籍等各類媒體平臺。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
投稿分享

窗口間的數據傳遞(一)

2022-9-29 20:58:29

建站教程投稿分享

窗口間的數據傳遞(三)

2022-9-30 14:46:32

0 條回復 A文章作者 M管理員
    暫無討論,說說你的看法吧
?
個人中心
購物車
優惠劵
今日簽到
有新私信 私信列表
搜索
主站蜘蛛池模板: 新乡市| 云梦县| 宜宾县| 永靖县| 孝义市| 安阳县| 长垣县| 广西| 方山县| 本溪| 育儿| 外汇| 泰州市| 正定县| 格尔木市| 徐闻县| 荥阳市| 桃园市| 广汉市| 锦州市| 镇雄县| 铜陵市| 屏山县| 佛坪县| 广丰县| 柞水县| 邹平县| 绵阳市| 隆子县| 大埔区| 钟山县| 思南县| 河东区| 苏尼特左旗| 石嘴山市| 泾阳县| 南涧| 建湖县| 公主岭市| 娄烦县| 无极县|