版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、總結(jié)C#中窗體間傳遞數(shù)據(jù)的幾種方法(由別人的方法整理)?在編寫(xiě)C#windows應(yīng)用程序的時(shí)候我們經(jīng)常會(huì)遇到這種問(wèn)題,怎么樣在兩個(gè)窗體間傳遞數(shù)據(jù) 呢?以下是我整理的網(wǎng)上的各種方法,在遇到個(gè)實(shí)際問(wèn)題:在forml中打開(kāi)個(gè)form2窗口 作為錄入界而,將錄入的值經(jīng)轉(zhuǎn)換后在forml中顯示。采用了委托的方法,可以實(shí)現(xiàn)。(與VC 的回調(diào)的應(yīng)用相似)1. 可以通過(guò)委托的方法來(lái)解決問(wèn)題:通過(guò)form 1做個(gè)錄入界而,將里邊通過(guò)文本框錄入的數(shù)值復(fù)值給form2中的listview各 列,用3個(gè)textbox 1.text舉例吧,分別對(duì)應(yīng)listview的3個(gè)列??梢赃@么做,如果兩個(gè)窗體是在同一個(gè)命名空間下定
2、義個(gè)代理,注意這個(gè)代理是全局的:(即同命名空間下,與Forml, Form2平級(jí)的)public delegate void Mylnvoke(string Iteml,string Item2,string Item3);在窗體From2中有這么個(gè)回調(diào)函數(shù),用于在UstView里添加個(gè)新項(xiàng)的:private void UpdateListView(string Iteml/String Item2zstring Item3)比如說(shuō)點(diǎn)擊Form2的-個(gè)按鈕彈出Forml進(jìn)行錄入,在點(diǎn)擊按鈕的事件下:把委托傳過(guò)去Forml frmEdit=new Form 1(new Mylnvoke(Upda
3、teListView);frmEdit.ShowDialog(this);在Forml里定義一個(gè)屬性private Mylnvoke mi=null;在構(gòu)造函數(shù)中接收這個(gè)委托:public Forml(MyInvoke mylnvoke)? this.mi=mylnvoke;錄入數(shù)據(jù)后,點(diǎn)擊0K按鈕,在點(diǎn)擊事件下: 回調(diào)this.Close();關(guān)閉 Forml補(bǔ)充:如果我要是想再把form2的值給forml,Forml frmEdit=new Forml(new MyInvoke(UpdateListView)zstring paralzstring para2.);frmEdit.Show
4、Dialog(this);然后將Forml的構(gòu)造函數(shù)改成可以接收幾個(gè)參數(shù)的就行了。2. 假如主框架為Forml,打開(kāi)的搜索對(duì)話框是Form2.直接在Form2類中申明個(gè)Forml實(shí)例: Forml fl=new Foml();然后就可以通過(guò)fl來(lái)調(diào)用Forml中的域和函數(shù)其實(shí)不是這樣的, 你申明的新的Forml實(shí)例不是原來(lái)的那個(gè)Forml對(duì)象這樣操作的是新的Forml中的域和函 數(shù),和最先打開(kāi)的Forml是沒(méi)有關(guān)系的。我們要做的是把當(dāng)前的Forml實(shí)例傳遞給Form2,如果是這樣的話,問(wèn)題就很好解決了。方法1:首先,我們?cè)贔orm2中定義:private Forml mF_Form我們更改Fo
5、rm2的構(gòu)造函數(shù)為有參數(shù)的public Form2 ( Forml myForm )/ Windows窗體設(shè)計(jì)器支持所必需的IIInitializeComponent ();this.mF_Form? = myForm ;?/這樣在Forml中申明Form2的時(shí)候就把Forml的實(shí)例傳遞 過(guò)來(lái)了/ TODO:在InitializeComponent調(diào)用后添加任何構(gòu)造函數(shù)代碼/在Forml中,我在 妥用到Form2的地方申明如下:Form2 f2=new? Form2(this);/這里的this指的就是Forml當(dāng)前的實(shí)例,也就是把當(dāng)前Forml的實(shí)例通過(guò)Form2的構(gòu)造函數(shù)傳遞給Form2類
6、(其實(shí)在網(wǎng)上看到過(guò)比較抵的方式,就是在構(gòu)造 函數(shù)里而傳遞要傳遞的信息如:字符串或是數(shù)字等,這樣做很有局限性,不能傳遞其他的,所有 我們可以直接傳遞實(shí)例,來(lái)完成傳遞更多的信息。)這樣在Form2中使用myForm就可以對(duì)原來(lái)的Forml窗口進(jìn)行操作了。但是你要把耍操作的 Forml中的域和函數(shù)定義成public形式的(這樣可能不安全),此時(shí)的myForm就是真正的最 開(kāi)始打開(kāi)的Forml 了,你可以用這個(gè)實(shí)例來(lái)進(jìn)行兩個(gè)窗體的通訊了。()3. 其實(shí)C#中提供了窗體間進(jìn)行通訊的現(xiàn)成的屬性,呵呵,我們能想到的,微軟也想到他 們創(chuàng)造的語(yǔ)言其實(shí)確實(shí)可以說(shuō)是人性化了。在Formi類中申明Form2時(shí)用如下代
7、碼:Form2 f2=new Form2();/類Form2中的構(gòu)造函數(shù)不改,還是無(wú)參的f2.owner=this;/這里的this指的是類Forml當(dāng)前的實(shí)例。也可以使用函數(shù)的方法,給當(dāng)前實(shí)例添加個(gè)附屬窗口?代碼:this.AddOwnedForm(f2);在Form2類的定義中寫(xiě)如下代碼:Forml fl=this.owner;這樣fl對(duì)應(yīng)的就是原來(lái)的Form 1的實(shí)例了,也就可以用這個(gè)進(jìn)行通訊了。但是還是要把不同類 之間訪問(wèn)的域和函數(shù)定義成public,哎,安全確實(shí)是個(gè)問(wèn)題! !?4.使用靜態(tài)類?這個(gè)也是我們經(jīng)常要用到的-種數(shù)據(jù)交互方法。下面是定義的一個(gè)類:using System;us
8、ing System.Collections;namespace ZZ? public class AppDatas? z 1? private static ArrayList listData;? static AppDatas()? ? listData = new ArrayList();? listDataAdd(”DotNet“);? listData.Add(,C#M);? listData.Add(HA”);? listData.Add(HWebServiceH);? listData.Add(,XML,');? ? public static ArrayList Li
9、stData? ? getreturn listData;? ? public static ArrayList GetListData()? ? return listData;? ? J上聞包含了 個(gè)靜態(tài)類成員 listData, 個(gè)靜態(tài)構(gòu)造函數(shù)static AppDatas(),用來(lái)初始化listData 的數(shù)據(jù)。還有個(gè)靜態(tài)屬性ListData和個(gè)靜態(tài)GetListData()方法,他們實(shí)現(xiàn)了同樣的功能就 是返回listData o由于前面兩篇文章已經(jīng)講了很多,這里不細(xì)說(shuō)了,下而是完整的代碼:Forml.cs 文件using System;using System.Drawing;usi
10、ng System.Collections;using System.ComponentModel;namespace ZZ? z 1? public Forml()? ? InitializeComponent();? ? protected override void Dispose( bool disposing )? ? if( disposing )? if(components != null)? components.Dispose();? base.Dispose( disposing );? ? STAThread? static void Main()? ? Applica
11、tion.Run(new Forml();? ? private void InitializeComponent()? ? this.SuspendLayout();? this.Name = "Forml"? this.Text = "Form I'1;? this.ResumeLayout(false);? ? private void buttonEdit_Click(object sender, System.EventArgs e)? ? Form2 formChild = new Form2();? formChild.ShowDialog(
12、);? Form2.cs 文件using System.Drawing;using System.Collect!ons;using System.ComponentModel;namespace ZZ? <nOK;? public Form2()? ? InitializeComponent();? foreach(object o in AppDatas.ListData)? ? protected override void Dispose( bool disposing )? if( disposing )? if(components != null)? components.
13、Dispose();? base.Dispose( disposing );? ? private void InitializeComponent()? ? this.SuspendLayout();確定";Frm2M;增加";? this.Name = "FormZ'? this.Text = ”Form2:? this.ResumeLayout(false);? ? private void buttonOK_Click(object sender, System.EventArgs e)? ? this.Close();? ? private vo
14、id buttonAdd_Click(object sender, System.EventArgs e)? ? ? ? else? MessageBox.ShowC'請(qǐng)輸入添加的內(nèi)容!”);? ? private void buttonDeLClick(object sender, System.EventArgs e)? ? if(index!=-l)? ? ? else? MessageBox.Show(n請(qǐng)選擇刪除項(xiàng));? ? J?總結(jié),我認(rèn)為使用靜態(tài)類比較多的地方就是把應(yīng)用程序的配置文件裝載到個(gè)靜態(tài)類里面, 讓所有的窗體和其他實(shí)例都可以通過(guò)靜態(tài)屬性以及靜態(tài)方法使用這些數(shù)據(jù),比
15、如三層結(jié)構(gòu)或多層 結(jié)構(gòu)都可以訪問(wèn)它,而不是在多個(gè)實(shí)例間傳來(lái)傳去。在這里我們討論的是Windows窗體,其實(shí) 在兩個(gè)不同的實(shí)例間交互數(shù)據(jù),都可以采用三篇文章中的方案實(shí)現(xiàn),除非是這個(gè)類特有的屬性或 若方法?,F(xiàn)在都講完了,雖然不是什么高深的東西,但是希望能對(duì)些初學(xué)者有所幫助,同時(shí)也 歡迎各位朋友進(jìn)行技術(shù)交流,共同提高。分析上面幾種方法:1. ?采用了委托的方法,可以實(shí)現(xiàn)。:很好的實(shí)現(xiàn)了數(shù)據(jù)處理與數(shù)據(jù)顯示的分離,即FORM2 主)顯示與FORM1數(shù)據(jù)處理,(不需耍將FORM2的顯示放在FORM1中)與VC的回調(diào)的應(yīng)用有延續(xù)性。并且確保了 FORM1中要修改的屬性的私有性。2. ?方法2、3都是傳遞主窗
16、口的引用,比較簡(jiǎn)單易用??梢詫?shí)現(xiàn)FORM2 (主)與FORM 1所 有數(shù)據(jù)的傳遞(不過(guò)需要將要FORM1傳遞和要修改的數(shù)據(jù)設(shè)為PUBLIC),而這樣會(huì)存在安全 問(wèn)題。委托方法可以很好地實(shí)現(xiàn)數(shù)據(jù)的保護(hù)總結(jié)C#中窗體間傳遞數(shù)據(jù)的幾種方法(由別人的方法整理)?在編寫(xiě)C#windows應(yīng)用程序的時(shí)候我們經(jīng)常會(huì)遇到這種問(wèn)題,怎么樣在兩個(gè)窗體間傳遞數(shù)據(jù) 呢?以下是我整理的網(wǎng)上的各種方法,在遇到個(gè)實(shí)際問(wèn)題:在forml中打開(kāi)個(gè)form2窗口 作為錄入界而,將錄入的值經(jīng)轉(zhuǎn)換后在forml中顯示。采用委托的方法,可以實(shí)現(xiàn)。(與VC的回調(diào)的應(yīng)用相似)1.可以通過(guò)委托的方法來(lái)解決問(wèn)題:通過(guò)form 1做個(gè)錄入界面,
17、將里邊通過(guò)文本框錄入的數(shù)值復(fù)值給form2中的listview各列,用3個(gè)textbox 1.text舉例吧,分別對(duì)應(yīng)listview的3個(gè)列??梢赃@么做,如果兩個(gè)窗體是在同個(gè)命名空間下定義個(gè)代理,注盤(pán)這個(gè)代理是全局的:(即同 諭名空間下,與Forml, Form2平級(jí)的)public delegate void Mylnvoke(string Iteml,string Item2,string Item3);在窗體From2中有這么個(gè)回調(diào)函數(shù),用于在UstView里添加個(gè)新項(xiàng)的:private void UpdateListView(string Iteml/String Item2,str
18、ing Item3)比如說(shuō)點(diǎn)擊Form2的-個(gè)按鈕彈出Forml進(jìn)行錄入,在點(diǎn)擊按鈕的事件下:把委托傳過(guò)去Forml frmEdit=new Form 1(new Mylnvoke(UpdateListView);frmEdit.ShowDialog(this);在Forml里定義一個(gè)屬性private Mylnvoke mi=null;在構(gòu)造函數(shù)中接收這個(gè)委托:public Forml(Myinvoke mylnvoke)? this.mi=mylnvoke;錄入數(shù)據(jù)后,點(diǎn)擊OK按鈕,在點(diǎn)擊事件下:回調(diào)this.Close();關(guān)閉 Forml補(bǔ)充:如果我要是想再把form2的值給forml
19、,Forml frmEdit=new Form 1(new Mylnvoke(UpdateListView),string paral,string para2.);frmEdit.ShowDialog(this);然后將Forml的構(gòu)造函數(shù)改成可以接收幾個(gè)參數(shù)的就行了。2.假如主框架為Forml,打開(kāi)的搜索對(duì)話框是Form2.直接在Form2類中申明 個(gè)Forml實(shí)例: Forml fl=new Forml();然后就可以通過(guò)fl來(lái)調(diào)用Forml中的域和函數(shù)了。其實(shí)不是這樣的, 你申明的新的Forml實(shí)例不是原來(lái)的那個(gè)Forml對(duì)象這樣操作的是新的Forml中的域和函 數(shù),和最先打開(kāi)的For
20、ml是沒(méi)有關(guān)系的。我們要做的是把當(dāng)前的Forml實(shí)例傳遞給Form2,如果是這樣的話,問(wèn)題就很好解決了。方法1:首先,我們?cè)贔orm2中定義:private Forml mF_Form我們更改Form2的構(gòu)造函數(shù)為有參數(shù)的public Form2 ( Forml myForm )/ Windows窗體設(shè)計(jì)器支持所必需的/InitializeComponent ();this.mF_Form? = myForm ;? /這樣在Forml中申明Form2的時(shí)候就把Forml的實(shí)例傳遞 過(guò)來(lái)了/ TODO:在InitializeComponent調(diào)用后添加任何構(gòu)造函數(shù)代碼/在Form 1.中,我在
21、妥用到Form2的地方申明如下:Form2 f2=new? Form2(this);/這里的this指的就是Forml當(dāng)前的實(shí)例,也就是把當(dāng)前Forml 的實(shí)例通過(guò)Form2的構(gòu)造函數(shù)傳遞給Form2類(其實(shí)在網(wǎng)上看到過(guò)比較抵的方式,就是在構(gòu)造 函數(shù)里而傳遞要傳遞的信息如:字符串或是數(shù)字等,這樣做很有局限性,不能傳遞其他的,所有 我們可以直接傳遞實(shí)例,來(lái)完成傳遞更多的信息。)這樣在Form2中使用myForm就可以對(duì)原來(lái)的Forml窗口進(jìn)行操作了。但是你要把耍操作的 Forml中的域和函數(shù)定義成public形式的(這樣可能不安全),此時(shí)的myForm就是真正的最 開(kāi)始打開(kāi)的Forml 了,你可
22、以用這個(gè)實(shí)例來(lái)進(jìn)行兩個(gè)窗體的通訊了。()3. 其實(shí)C#中提供了窗體間進(jìn)行通訊的現(xiàn)成的屬性,呵呵,我們能想到的,微軟也想到他 們創(chuàng)造的語(yǔ)言其實(shí)確實(shí)可以說(shuō)是人性化了。在Forml類中申明Form2時(shí)用如下代碼:Form2 f2=new Form2();/類Form2中的構(gòu)造函數(shù)不改,還是無(wú)參的f2.owner=this;/這里的this指的是類Forml當(dāng)前的實(shí)例。也可以使用函數(shù)的方法,給當(dāng)前實(shí)例添加個(gè)附屬窗口?代碼:this.AddOwnedForm(f2);在Form2類的定義中寫(xiě)如下代碼:Forml fl=this.owner;這樣fl對(duì)應(yīng)的就是原來(lái)的Forml的實(shí)例了,也就可以用這個(gè)進(jìn)行通
23、訊了。但是還是要把不同類 之間訪問(wèn)的域和函數(shù)定義成public,哎,安全確實(shí)是個(gè)問(wèn)題! !? 4.使用靜態(tài)類?這個(gè)也是我們經(jīng)常要用到的-種數(shù)據(jù)交互方法。下面是定義的一個(gè)類:using System;using System.Collections;namespace ZZ? public class AppDatas? Z 1? private static ArrayList listData;? static AppDatas()? ? listData = new ArrayList();? listDataAdd(”DotNetJ;? listData.AddC,C#H);? list
24、Data.Add(HA”);? listData.Add(nWebServicen);? listDataAdd(”XM);? ? public static ArrayList ListData? ? getreturn listData;? ? public static ArrayList GetListData()? ? return listData;? ? I上包含了 個(gè)靜態(tài)類成員 listData, 個(gè)靜態(tài)構(gòu)造函數(shù)static AppDatas(),用來(lái)初始化listData 的數(shù)據(jù)。還有個(gè)靜態(tài)屬性ListData和個(gè)靜態(tài)GetListData()方法,他們實(shí)現(xiàn)了同樣的功能就 是
25、返回listData o由于前而兩篇文章已經(jīng)講了很多,這里不細(xì)說(shuō)了,下面是完整的代碼:Forml.cs 文件using System;using System.Drawing;using System.Collections;using System.ComponentModel;namespace ZZ? / 1? public Forml()? ? InitializeComponent();? ? protected override void Dispose( bool disposing )? ? if( disposing )? if(components != null)? co
26、mponents.Dispose();? base.Dispose( disposing );? ? STAThread? static void Main()? ? Application.Run(new Forml();? ? private void InitializeComponent()? ? this.SuspendLayout();? this. Name = 'Forml"? this.Text = ”Forml”;? this.ResumeLayout(false);? ? private void butt on Edit_Click(object se
27、nder, System. EventArgs e)? ? Form2 formChild = new Form2();? formChild.ShowDialog();? ? JForm2.cs 文件using System.Drawing;using System.Collections;using System.ComponentModel;namespace ZZ? z 1? public Form2()? ? InitializeComponentO;? foreach(object o in AppDatas.ListData)? ? protected override void Dispose( bool disposing )? ? if( disposing )? if(components != null)? components.Dispose();? base.Dispose( disposing );? ? private void In
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度安全風(fēng)險(xiǎn)評(píng)估責(zé)任書(shū)協(xié)議預(yù)防事故發(fā)生3篇
- 2024紙箱購(gòu)銷合同書(shū)
- 2025年度電力工程車(chē)輛司機(jī)聘用協(xié)議書(shū)及安全要求3篇
- 2025年度餐飲服務(wù)業(yè)個(gè)人臨時(shí)雇傭合同范本4篇
- 2025年校企合作產(chǎn)學(xué)研合作創(chuàng)新基地建設(shè)合同3篇
- 2025年度個(gè)人合伙餐飲連鎖經(jīng)營(yíng)合作協(xié)議書(shū)4篇
- 2025個(gè)人工傷賠償協(xié)議書(shū)范本5篇
- 2025年江西贛州稀土集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年蓄水池建筑工程施工質(zhì)量保修服務(wù)合同3篇
- 2025年遼寧朝陽(yáng)水務(wù)集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 安徽省蕪湖市2023-2024學(xué)年高一上學(xué)期期末考試 英語(yǔ) 含答案
- 電力工程施工安全風(fēng)險(xiǎn)評(píng)估與防控
- 醫(yī)學(xué)教程 常見(jiàn)體表腫瘤與腫塊課件
- 內(nèi)分泌系統(tǒng)異常與虛勞病關(guān)系
- 智聯(lián)招聘在線測(cè)評(píng)題
- DB3418T 008-2019 宣紙潤(rùn)墨性感官評(píng)判方法
- 【魔鏡洞察】2024藥食同源保健品滋補(bǔ)品行業(yè)分析報(bào)告
- 生豬屠宰獸醫(yī)衛(wèi)生檢驗(yàn)人員理論考試題及答案
- 鋼筋桁架樓承板施工方案
- 2024年駐村第一書(shū)記工作總結(jié)干貨3篇
- 教室裝修施工計(jì)劃
評(píng)論
0/150
提交評(píng)論