摘要:本文我們將列舉不同窗體間數(shù)據(jù)傳遞的四種情況,和用Visual C#實(shí)現(xiàn)這四種情況的具體方法。
一個(gè)稍微復(fù)雜一點(diǎn)的程序一般都有二個(gè)或者更多的窗體。有時(shí)在程序設(shè)計(jì)中,數(shù)據(jù)不僅要在同一個(gè)窗體中傳遞,還要在窗體間傳遞,這種傳遞是主窗體與從窗體之間數(shù)據(jù)的互相傳遞。從本文開始,我們將列舉不同窗體間數(shù)據(jù)傳遞的四種情況,和用Visual C#實(shí)現(xiàn)這四種情況的具體方法。下面先介紹用Visual C#實(shí)現(xiàn)窗體間傳遞數(shù)據(jù)中第一種情況——從主窗體向從窗體傳遞字符串。在閱讀完本文后,你還嘗試一下利用此方法在窗體間傳送數(shù)值等數(shù)據(jù)。 本文中程序設(shè)計(jì)、調(diào)試、運(yùn)行的軟件環(huán)境:
Windows2000 服務(wù)器版
Visual Studio.Net正式版,.Net FrameWork SDK版本號(hào)3705
實(shí)現(xiàn)步驟:
1.啟動(dòng)Visual Studio .Net
2.選擇菜單【文件】|【新建】|【項(xiàng)目】后,彈出【新建項(xiàng)目】對(duì)話框
3.將【項(xiàng)目類型】設(shè)置為【Visual C#項(xiàng)目】
4.將【模板】設(shè)置為【控制臺(tái)應(yīng)用程序】
5.在【名稱】文本框中輸入【VC#中不同窗體數(shù)據(jù)傳遞方法01】
6.在【位置】的文本框中輸入【E:\VS.NET項(xiàng)目】,然后單擊【確定】按鈕,這樣VC#中不同窗體數(shù)據(jù)傳遞方法01項(xiàng)目就創(chuàng)建完成了
7.把Visual Studio.Net的當(dāng)前窗口切換到【Form1.cs(設(shè)計(jì))】窗口,并從【工具箱】中的【W(wǎng)indows窗體】選項(xiàng)卡中拖入下列組件到【Form1.cs(設(shè)計(jì))】窗體中,并執(zhí)行相應(yīng)操作:
· 二個(gè)TextBox組件,用以輸入向Form2窗體傳送的數(shù)據(jù)
· 二個(gè)Label組件
· 一個(gè)Button組件,名稱為button1,并在拖入【Form1.cs(設(shè)計(jì))】窗體后,雙擊它,則Visual Stuido .Net產(chǎn)生其Click事件對(duì)應(yīng)的處理代碼。
8.把Visual Studio .Net的當(dāng)前窗口切換到【Form1.cs】窗口,即:Form1.cs的代碼編輯窗口。并用下列代碼替換替代系統(tǒng)產(chǎn)生的InitializeComponent過程。
DE<private void InitializeComponent ( ){ this.button1 = new System.Windows.Forms.Button ( ) ; this.textBox1 = new System.Windows.Forms.TextBox ( ) ; this.textBox2 = new System.Windows.Forms.TextBox ( ) ; this.label1 = new System.Windows.Forms.Label ( ) ; this.label2 = new System.Windows.Forms.Label ( ) ; this.SuspendLayout ( ) ; this.button1.Location = new System.Drawing.Point ( 103 , 149 ) ; this.button1.Name = "button1" ; this.button1.Size = new System.Drawing.Size ( 75 , 36 ) ; this.button1.TabIndex = 0 ; this.button1.Text = "發(fā)送" ; this.button1.Click += new System.EventHandler ( this.button1_Click ) ; this.textBox1.Location = new System.Drawing.Point ( 93 , 56 ) ; this.textBox1.Name = "textBox1" ; this.textBox1.Size = new System.Drawing.Size ( 122 , 21 ) ; this.textBox1.TabIndex = 1 ; this.textBox1.Text = "" ; this.textBox2.Location = new System.Drawing.Point ( 93 , 99 ) ; this.textBox2.Name = "textBox2" ; this.textBox2.Size = new System.Drawing.Size ( 123 , 21 ) ; this.textBox2.TabIndex = 2 ; this.textBox2.Text = "" ; this.label1.Location = new System.Drawing.Point ( 29 , 57 ) ; this.label1.Name = "label1" ; this.label1.TabIndex = 3 ; this.label1.Text = "歡迎詞:" ; this.label2.Location = new System.Drawing.Point ( 16 , 100 ) ; this.label2.Name = "label2" ; this.label2.TabIndex = 4 ; this.label2.Text = "提示信息:" ; this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; this.ClientSize = new System.Drawing.Size ( 263 , 223 ) ; this.Controls.AddRange ( new System.Windows.Forms.Control[ ] { this.textBox2 , this.textBox1 , this.button1 , this.label2 , this.label1 } ) ; this.Name = "Form1" ; this.Text = "Form1" ; this.Load += new System.EventHandler ( this.Form1_Load ) ; this.ResumeLayout ( false ) ;}DE<
此時(shí),VC#中不同窗體數(shù)據(jù)傳遞方法01項(xiàng)目的主窗體Form1的設(shè)計(jì)界面就完成了,具體如圖1所示:
圖1:VC#中不同窗體數(shù)據(jù)傳遞方法01項(xiàng)目主窗體設(shè)計(jì)界面
9.把Visual Studio.Net的當(dāng)前窗口切換到Form1.cs的代碼編輯窗口,并用下列代碼替換Form1.cs中button1組件的Click事件對(duì)應(yīng)的處理代碼。
DE<private void button1_Click ( object sender , System.EventArgs e ) { Form2 myForm = new Form2 ( textBox1.Text , textBox2.Text ) ; myForm.Show ( ) ; }DE<
10.選擇菜單【項(xiàng)目】|【添加Windows窗體】后,彈出【添加新項(xiàng)-VC#中不同窗體數(shù)據(jù)傳遞方法01】對(duì)話框。在此對(duì)話框中的【名稱(N):】文本框中輸入【Form2】后,單擊【打開】按鈕,則在VC#中不同窗體數(shù)據(jù)傳遞方法01項(xiàng)目中添加了一個(gè)新的窗體,名稱為【Form2】。
11.把Visual Studio.Net的當(dāng)前窗口切換到【Form2.cs(設(shè)計(jì))】窗口,并從【工具箱】中的【W(wǎng)indows窗體】選項(xiàng)卡中拖入下列組件到【Form2.cs(設(shè)計(jì))】窗體中,并執(zhí)行相應(yīng)操作:
· 二個(gè)TextBox組件,用以顯示從Form1傳送來的字符串?dāng)?shù)據(jù)
· 二個(gè)Label組件
· 一個(gè)Button組件,名稱為button1,并在拖入【Form2.cs(設(shè)計(jì))】窗體后,雙擊它,則Visual Stuido .Net產(chǎn)生其Click事件對(duì)應(yīng)的處理代碼。
12.把Visual Studio.Net的當(dāng)前窗口切換到Form2.cs的代碼編輯窗口,并在定義Form2代碼的后部添加下列代碼,下列代碼是定義二個(gè)字符串變量,用以接收從Form1傳送來的字符串?dāng)?shù)據(jù):
DE<private string str1 , str2 ;DE<
13.并用下列代碼替換系統(tǒng)產(chǎn)生的Form2對(duì)應(yīng)的代碼:
DE<public Form2 ( string sendData01 , string sendData02 ){ // // Windows 窗體設(shè)計(jì)器支持所必需的 // InitializeComponent ( ) ; str1 = sendData01 ; str2 = sendData02 ; // // TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼 //}DE<
14.用下列代碼替換Form2.cs中的由Visual Studio .Net系統(tǒng)產(chǎn)生的InitializeComponent過程:
DE<private void InitializeComponent ( ){ this.textBox2 = new System.Windows.Forms.TextBox ( ) ; this.textBox1 = new System.Windows.Forms.TextBox ( ) ; this.button1 = new System.Windows.Forms.Button ( ) ; this.label2 = new System.Windows.Forms.Label ( ) ; this.label1 = new System.Windows.Forms.Label ( ) ; this.SuspendLayout ( ) ; this.textBox2.Location = new System.Drawing.Point ( 109 , 93 ) ; this.textBox2.Name = "textBox2" ; this.textBox2.Size = new System.Drawing.Size ( 123 , 21 ) ; this.textBox2.TabIndex = 7 ; this.textBox2.Text = "" ; this.textBox1.Location = new System.Drawing.Point ( 109 , 50 ) ; this.textBox1.Name = "textBox1" ; this.textBox1.Size = new System.Drawing.Size ( 122 , 21 ) ; this.textBox1.TabIndex = 6 ; this.textBox1.Text = "" ; this.button1.Location = new System.Drawing.Point ( 75 , 143 ) ; this.button1.Name = "button1" ; this.button1.Size = new System.Drawing.Size ( 119 , 43 ) ; this.button1.TabIndex = 5 ; this.button1.Text = "顯示傳送來數(shù)據(jù)" ; this.button1.Click += new System.EventHandler ( this.button1_Click ) ; this.label2.Location = new System.Drawing.Point ( 32 , 94 ) ; this.label2.Name = "label2" ; this.label2.TabIndex = 9 ; this.label2.Text = "提示信息:" ; this.label1.Location = new System.Drawing.Point ( 45 , 51 ) ; this.label1.Name = "label1" ; this.label1.TabIndex = 8 ; this.label1.Text = "歡迎詞:" ; this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; this.ClientSize = new System.Drawing.Size ( 265 , 228 ) ; this.Controls.AddRange ( new System.Windows.Forms.Control[ ] { this.textBox2 , this.textBox1 , this.button1 , this.label2 , this.label1 } ) ; this.Name = "Form2" ; this.Text = "Form2" ; this.ResumeLayout ( false ) ;}DE<
15.用下列代碼替換Form2.cs中button1組件Click事件對(duì)應(yīng)的處理代碼,下列代碼的作用是把從Form1窗體中接收來的字符串?dāng)?shù)據(jù)通過同樣的方式顯示出來:
DE<private void button1_Click ( object sender , System.EventArgs e ){ textBox1.Text = str1 ; textBox2.Text = str2 ;}DE<
16.至此,在上述步驟都正確完成,并全部保存后,VC#中不同窗體數(shù)據(jù)傳遞方法01項(xiàng)目的全部工作就完成了。圖02是VC#中不同窗體數(shù)據(jù)傳遞方法01程序的運(yùn)行界面。其中Form2中顯示出來的字符串就是從主窗體中傳遞過去的。
圖02:VC#中不同窗體數(shù)據(jù)傳遞方法01程序的運(yùn)行界面
總結(jié)
用Visual C#實(shí)現(xiàn)窗體間數(shù)據(jù)傳遞的第一種情況的全部工作就完成了,細(xì)心的讀者已經(jīng)發(fā)現(xiàn),這種方法明顯存在一個(gè)主要缺點(diǎn),就是主窗體向從窗體傳遞數(shù)據(jù)的數(shù)目是固定的。這個(gè)缺點(diǎn)將在下面徹底加以解決。
窗體間數(shù)據(jù)傳遞第一種情況的解決方法存在一個(gè)主要的缺點(diǎn),就是窗體間傳遞的參數(shù)數(shù)目是固定的,并且類型也是固定的。這是因?yàn)?,上文中修改了從命名空間System.Windows.Forms中的Form類派生而得到的Form2類的構(gòu)造函數(shù),由于構(gòu)造函數(shù)中的參數(shù)和類型都是固定的,而主窗體向從窗體傳遞數(shù)據(jù),就是通過構(gòu)造函數(shù)中的參數(shù)來實(shí)現(xiàn)的,所以就造成了上面的那個(gè)缺點(diǎn)。其實(shí)在這種方法中還存在一個(gè)缺點(diǎn),就是每一次窗體間的數(shù)據(jù)傳遞,就必須構(gòu)建一個(gè)窗體,并且這種數(shù)據(jù)傳遞是一次性的。這些缺點(diǎn)對(duì)于窗體間傳遞少量數(shù)據(jù),一般不會(huì)有太大影響,但如果要傳遞大量數(shù)據(jù),并且要通過主窗體來實(shí)時(shí)向從窗體傳遞數(shù)據(jù),使用這種方法就勉為其難了。
下面介紹另外一種從主窗體向從窗體傳遞數(shù)據(jù)的實(shí)現(xiàn)方法,這種方法能夠完全解決上面的二個(gè)缺點(diǎn),程序在主窗體中就像操作窗體中加入的組件一樣,靈活的操作從窗體。
設(shè)計(jì)思路
此方法實(shí)現(xiàn)二個(gè)功能:
其一,主窗體能夠?qū)崟r(shí)地向從窗體傳送數(shù)據(jù),表現(xiàn)為當(dāng)更改主窗體中的跟蹤條(TrackBar)的數(shù)值,從窗體中定義的一個(gè)Label組件就顯示出跟蹤條的當(dāng)前數(shù)值;
其二,從窗體能夠向主窗體提出數(shù)據(jù)請(qǐng)求,并且能夠獲取主窗體中各組件顯示的數(shù)據(jù)。程序表現(xiàn)為,當(dāng)單擊從窗體中的【從Form1中獲取數(shù)據(jù)】按鈕,程序能夠把主窗體中的二個(gè)TextBox組件顯示的內(nèi)容傳遞到從窗體,并且通過從窗體中的二個(gè)TextBox組件分別顯示出來。
第一個(gè)功能的實(shí)現(xiàn)思路是把從窗體看成是主窗體的一個(gè)實(shí)例,加入到從窗體中的組件,可以看出是從窗體中定義的一個(gè)個(gè)變量,由于從窗體中加入的組件的組件缺省定義類型是Private(私有的),所以要想訪問這些組件,必須改變?yōu)镻ublic(共有的);而第二個(gè)功能的實(shí)現(xiàn)思路是通過修改Form2的構(gòu)造函數(shù),構(gòu)造函數(shù)實(shí)現(xiàn)功能是通過Form1類的實(shí)例(即為主窗體)來創(chuàng)建并初始化Form2類的實(shí)例(即為從窗體)。這樣對(duì)于從窗體來說,主窗體則為其一個(gè)實(shí)例,從而也就可以向主窗體提出數(shù)據(jù)請(qǐng)求,當(dāng)然要把需要訪問的各組件定義類型從缺省的Private(私有的)類型修改為Public(共有的)。上述二個(gè)功能的實(shí)現(xiàn)方法,第二種方法比較復(fù)雜,希望各位能夠結(jié)合后面的具體實(shí)現(xiàn)代碼來理解。
第二種窗體間的數(shù)據(jù)傳遞情況實(shí)現(xiàn)步驟
1.首先創(chuàng)建一個(gè)Visual C#的項(xiàng)目文件,項(xiàng)目名稱為【VC#中不同窗體數(shù)據(jù)傳遞方法02】。
2.把Visual Studio .Net的當(dāng)前窗口切換到【Form1.cs(設(shè)計(jì))】窗口,并從【工具箱】中的【W(wǎng)indows窗體】選項(xiàng)卡中拖入下列組件到【Form1.cs(設(shè)計(jì))】窗體中,并執(zhí)行相應(yīng)操作:
· 二個(gè)TextBox組件,用以輸入向Form2窗體傳送的數(shù)據(jù)
· 二個(gè)Label組件
· 一個(gè)TrackBar組件,名稱為trackBar1。
3.把Visual Studio .Net的當(dāng)前窗口切換到【Form1.cs】窗口,即:Form1.cs的代碼編輯窗口。并用下列代碼替換替代系統(tǒng)產(chǎn)生的InitializeComponent過程。
DE<private void InitializeComponent ( ){ this.label1 = new System.Windows.Forms.Label ( ) ; this.label2 = new System.Windows.Forms.Label ( ) ; this.textBox1 = new System.Windows.Forms.TextBox ( ) ; this.textBox2 = new System.Windows.Forms.TextBox ( ) ; this.trackBar1 = new System.Windows.Forms.TrackBar ( ) ; ( ( System.ComponentModel.ISupportInitialize ) ( this.trackBar1 ) ).BeginInit ( ) ; this.SuspendLayout ( ) ; this.label1.Location = new System.Drawing.Point ( 27 , 41 ) ; this.label1.Name = "label1" ; this.label1.TabIndex = 0 ; this.label1.Text = "歡迎詞:" ; this.label2.Location = new System.Drawing.Point ( 27 , 83 ) ; this.label2.Name = "label2" ; this.label2.TabIndex = 1 ; this.label2.Text = "提示信息:" ; this.textBox1.Location = new System.Drawing.Point ( 108 , 38 ) ; this.textBox1.Name = "textBox1" ; this.textBox1.TabIndex = 2 ; this.textBox1.Text = "" ; this.textBox2.Location = new System.Drawing.Point ( 109 , 78 ) ; this.textBox2.Name = "textBox2" ; this.textBox2.TabIndex = 3 ; this.textBox2.Text = "" ; this.trackBar1.LargeChange = 1 ; this.trackBar1.Location = new System.Drawing.Point ( 12 , 182 ) ; this.trackBar1.Maximum = 100 ; this.trackBar1.Name = "trackBar1" ; this.trackBar1.Size = new System.Drawing.Size ( 272 , 42 ) ; this.trackBar1.TabIndex = 1 ; this.trackBar1.ValueChanged += new System.EventHandler ( this.trackBar1_ValueChanged ) ; this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ; this.Controls.AddRange ( new System.Windows.Forms.Control[] { this.trackBar1 , this.textBox2 , this.textBox1 , this.label2 , this.label1 } ) ; this.MaximizeBox = false ; this.MinimizeBox = false ; this.Name = "Form1" ; this.Text = "Form1" ; this.Load += new System.EventHandler ( this.Form1_Load ) ; ( ( System.ComponentModel.ISupportInitialize ) ( this.trackBar1 ) ).EndInit ( ) ; this.ResumeLayout ( false ) ;}DE<
4.由于從窗體向主窗體提出的數(shù)據(jù)請(qǐng)求是二個(gè)TextBox組件的"Text"屬性值,所以要修改Form1.cs文件中這二個(gè)TextBox組件的定義類型,把缺省定義為"private"類型修改為"public"類型,修改后的這二個(gè)TextBox組件在Form1.cs中的定義語(yǔ)句如下:
DE<public System.Windows.Forms.TextBox textBox1 ; public System.Windows.Forms.TextBox textBox2 ;DE<
在上述代碼后面再添加下面代碼,下面代碼是創(chuàng)建一個(gè)Form2類的實(shí)例m_Form,即從窗體:
DE<private Form2 m_Form ;DE<
5.在Form1.cs中的Main函數(shù)后,添加下列代碼,下列代碼的功能是實(shí)現(xiàn)當(dāng)修改主窗體中的跟蹤條數(shù)值后,從窗體中的label3組件的顯示數(shù)值能夠隨之而變化,這樣就實(shí)現(xiàn)主窗體實(shí)時(shí)傳遞數(shù)據(jù)到從窗體了:
DE<private void trackBar1_ValueChanged ( object sender , System.EventArgs e ){ m_Form.label3 .Text = trackBar1.Value.ToString ( ) ;}DE<
6.在添加完上面代碼,并在其后部,再添加下列代碼,下列代碼的功能是使用Form2類的構(gòu)造函數(shù),并通過Form1類的實(shí)例來創(chuàng)建并初始化Form2類的實(shí)例。在項(xiàng)目文件中加入Form2類,并修改Form2類的構(gòu)造函數(shù)工作將在本節(jié)的第7到11步驟中完成。
DE<private void Form1_Load ( object sender , System.EventArgs e ){ m_Form = new Form2 ( this ) ; //通過主窗體來創(chuàng)建、初始化從窗體 m_Form.Show ( ) ; //顯示從窗體}DE<
7.選擇菜單【項(xiàng)目】|【添加Windows窗體】后,彈出【添加新項(xiàng)-VC#中不同窗體數(shù)據(jù)傳遞方法01】對(duì)話框。在此對(duì)話框中的【名稱(N):】文本框中輸入【Form2】后,單擊【打開】按鈕,則在VC#中不同窗體數(shù)據(jù)傳遞方法01項(xiàng)目中添加了一個(gè)新的窗體,名稱為【Form2】。 8.把Visual Studio .Net的當(dāng)前窗口切換到【Form2.cs(設(shè)計(jì))】窗口,并從【工具箱】中的【W(wǎng)indows窗體】選項(xiàng)卡中拖入下列組件到【Form2.cs(設(shè)計(jì))】窗體中,并執(zhí)行相應(yīng)操作:
· 二個(gè)TextBox組件,用以顯示向主窗體請(qǐng)求獲得的數(shù)據(jù)。
· 二個(gè)Label組件。
· 一個(gè)Button組件,名稱為button1。
9.把Visual Studio .Net的當(dāng)前窗口切換到【Form2.cs】窗口,即:Form2.cs的代碼編輯窗口。并用下列代碼替換替代系統(tǒng)產(chǎn)生的InitializeComponent過程。
DE<{ this.textBox1 = new System.Windows.Forms.TextBox ( ) ; this.textBox2 = new System.Windows.Forms.TextBox ( ) ; this.label2 = new System.Windows.Forms.Label ( ) ; this.label1 = new System.Windows.Forms.Label ( ) ; this.button1 = new System.Windows.Forms.Button ( ) ; this.label3 = new System.Windows.Forms.Label ( ) ; this.SuspendLayout ( ) ; this.textBox1.Location = new System.Drawing.Point ( 95 , 42 ) ; this.textBox1.Name = "textBox1" ; this.textBox1.Size = new System.Drawing.Size ( 125 , 21 ) ; this.textBox1.TabIndex = 2 ; this.textBox1.Text = "" ; this.textBox2.Location = new System.Drawing.Point ( 94 , 80 ) ; this.textBox2.Name = "textBox2" ; this.textBox2.Size = new System.Drawing.Size ( 127 , 21 ) ; this.textBox2.TabIndex = 3 ; this.textBox2.Text = "" ; this.label2.Location = new System.Drawing.Point ( 27 , 83 ) ; this.label2.Name = "label2" ; this.label2.TabIndex = 5 ; this.label2.Text = "提示信息:" ; this.label1.Location = new System.Drawing.Point ( 38 , 45 ) ; this.label1.Name = "label1" ; this.label1.TabIndex = 4 ; this.label1.Text = "歡迎詞:" ; this.button1.Location = new System.Drawing.Point ( 80 , 136 ) ; this.button1.Name = "button1" ; this.button1.Size = new System.Drawing.Size ( 135 , 53 ) ; this.button1.TabIndex = 6 ; this.button1.Text = "從Form1中獲取數(shù)據(jù)" ; this.button1.Click += new System.EventHandler ( this.button1_Click ) ; this.label3.Location = new System.Drawing.Point ( 102 , 210 ) ; this.label3.Name = "label3" ; this.label3.TabIndex = 7 ; this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ; this.Controls.AddRange ( new System.Windows.Forms.Control[] { this.label3 , this.button1 , this.textBox2 , this.textBox1 , this.label2 , this.label1 } ) ; this.MaximizeBox = false ; this.MinimizeBox = false ; this.Name = "Form2" ; this.Text = "Form2" ; this.ResumeLayout ( false ) ;}DE<
10.由于主窗體是把其中的跟蹤條的數(shù)值通過從窗體中的label組件來顯示的,所以必須把Form2.cs文件中創(chuàng)建label3組件時(shí)定義的"private"類型修改為"public"類型,修改后的創(chuàng)建label3組件的代碼為:
DE<public System.Windows.Forms.Label label3 ;DE<
由于Form2類的實(shí)例是通過Form1類的實(shí)例來初始化,所以在創(chuàng)建label3組件后面添加下列代碼,下列代碼是創(chuàng)建一個(gè)Form1類的實(shí)例,其作用是初始化Form2類的實(shí)例(即從窗體):
DE<private Form1 mF_Form ;DE<
11.修改Form2類的構(gòu)造函數(shù),具體操作如下,用下列代碼替換Form2.cs中缺省的構(gòu)造函數(shù):
DE<public Form2 ( Form1 myForm ){ // // Windows 窗體設(shè)計(jì)器支持所必需的 // InitializeComponent ( ) ; this.mF_Form = myForm ; // // TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼 //}DE<
12.在Form2.cs中的Main函數(shù)后,添加下列代碼,下列代碼的功能是實(shí)現(xiàn)向主窗體提出數(shù)據(jù)請(qǐng)求,并獲取主窗體的數(shù)據(jù),當(dāng)然這些數(shù)據(jù)的類型必須修改為"public"類型。
DE<private void button1_Click ( object sender , System.EventArgs e ){ textBox1.Text = this.mF_Form.textBox1.Text ; textBox2.Text = this.mF_Form.textBox2.Text ;}DE<
13.至此,在上述步驟都成功完成,并全部保存后,Visual C#實(shí)現(xiàn)窗體間傳遞數(shù)據(jù)第二種情況的處理方法就全部完成了。此時(shí)單擊快捷鍵【F5】就可以運(yùn)行程序了,當(dāng)調(diào)整Form1窗體的跟蹤條數(shù)值,我們會(huì)發(fā)現(xiàn)Form2窗體中的label3組件顯示的數(shù)值也隨之變化;當(dāng)在Form1窗體的二個(gè)TextBox組件中輸入數(shù)據(jù)后,單擊Form2窗體中的【從Form2中獲取數(shù)據(jù)】按鈕,則程序能夠成功的從Form1中獲取數(shù)據(jù),并通過Form2中對(duì)應(yīng)的TextBox組件顯示出來。圖01就是程序運(yùn)行后的界面:
圖01:【VC#中不同窗體數(shù)據(jù)傳遞方法02】程序的運(yùn)行界面
小結(jié)
本節(jié)介紹的這種實(shí)現(xiàn)窗體間數(shù)據(jù)傳送的方法要比第一篇介紹的方法要難許多,其難點(diǎn)就在于如何修改構(gòu)造函數(shù)。對(duì)于那些要從其他窗體中要訪問的數(shù)據(jù),必須設(shè)定修改為"public",否則無法實(shí)現(xiàn)窗體間數(shù)據(jù)傳遞。
這二篇文章介紹的都是主窗體向從窗體傳遞數(shù)據(jù),在下一篇文章中,將介紹從窗體向主窗體傳遞數(shù)據(jù)的實(shí)現(xiàn)方法。
在前面的二篇文章中(Visual C#實(shí)現(xiàn)窗體間數(shù)據(jù)傳遞
1,
2),我們已經(jīng)分別探討了主窗體向從窗體傳遞數(shù)據(jù)的二種實(shí)現(xiàn)方法,在接下來內(nèi)容中,我們將介紹從從窗體向主窗體傳遞數(shù)據(jù)的二種常用的處理方法。
在下面這種從從窗體向主窗體傳遞數(shù)據(jù)的方法中,將接觸到C#中二個(gè)比較重要,也是比較難以掌握的二個(gè)概念:委托(Delegate)和事件(Event)。C#中的委托類似于C和C++中的函數(shù)指針,但我們也知道,在C#并不提倡使用指針,因?yàn)檫@將會(huì)是的程序不受托管,而因此變得不安全。而委托和指針的主要區(qū)別就是,它是完全面相對(duì)象的,并且是類型安全的,通過委托使可以實(shí)現(xiàn)把方法引用封裝在委托對(duì)象內(nèi)。然后再將該委托對(duì)象傳遞給可調(diào)用所引用方法的代碼。在C#中事件是當(dāng)對(duì)象發(fā)生某些的事情時(shí),類向該類的客戶提供通知的一種方法。在本節(jié)介紹的這種傳遞數(shù)據(jù)的方法中就是通過事件來實(shí)現(xiàn)的。在C#中事件和委托的淵源勃深,這是因?yàn)樵谏昝魇录闹?,首先要聲明該事件的委托類型。在委托類型中將定義要傳遞給事件的一組參數(shù)(由于本節(jié)要傳遞的是一個(gè)字符串,所以本節(jié)定義的委托類型中的參數(shù)類型為字符串)。在定義完委托類型后,再根據(jù)委托類型申明事件本身,在申明事件的時(shí)候要使用到關(guān)鍵字"event"。這樣在上述工作完成后,就可以像使用類中的其他事件一樣使用申明、調(diào)用事件了。
委托類型和事件其實(shí)在用Visual Studio .Net開發(fā)C#應(yīng)用程序的時(shí)候,經(jīng)常使用到,只不過,Visual Stduio .Net集成開發(fā)環(huán)境接管了這些工作,所以我們并沒有意識(shí)到,下面這一句代碼是Visual Studio .Net定義Button類的實(shí)例button1的Click事件:
DE<this.button1.Click += new System.EventHandler ( this.button1_Click ) ;DE<
其中"Click"就是申明的事件,而"EventHandler"就是委托類型。但是這些事件和委托類型都已經(jīng)在.Net FrameWork SDK中定義完畢,所以,我們只要調(diào)用就可以了,但在本節(jié)介紹的從從窗體向主窗體傳遞數(shù)據(jù)中,這些都需要我們來定義。
本文中程序設(shè)計(jì)、調(diào)試、運(yùn)行的軟件環(huán)境:
(1).Windows 2000 Server版
(2).Visual Studio .Net正式版,.Net FrameWork SDK版本號(hào)3705
實(shí)現(xiàn)從從窗體向主窗體傳遞數(shù)據(jù)
首先要我們要明確,主窗體其實(shí)是Form1類的實(shí)例,而從窗體是Form2類的實(shí)例。實(shí)現(xiàn)從從窗體向主窗體傳遞數(shù)據(jù)的方法的主要思路是:s首先在Form2類中定義一個(gè)委托類型SendMess,這個(gè)委托類型中的參數(shù)類型為一個(gè)字符串類型(就是通過這個(gè)類型來傳送字符串?dāng)?shù)據(jù)的,當(dāng)然如果你存在其他類型的數(shù)據(jù),可以通過修改這個(gè)參數(shù)類型來完成),然后根據(jù)這個(gè)委托類型在Form2類中申明一個(gè)Send事件。這樣當(dāng)在Form1類中創(chuàng)建一個(gè)Form2類的實(shí)例的時(shí)候,同時(shí)也為這個(gè)Form2類實(shí)例定義一個(gè)Send事件。當(dāng)在從窗體中單擊按鈕時(shí),則在按鈕的單擊事件中觸發(fā)Send事件,并以從窗體中要傳遞的字符串作為參數(shù),同時(shí)在主窗體中的處理Send事件的代碼中,通過TextBox組件的text屬性來接收從窗體傳遞來的字符串?dāng)?shù)據(jù),至此就實(shí)現(xiàn)了把從窗體中的字符串?dāng)?shù)據(jù)傳遞到主窗體中了。雖然實(shí)現(xiàn)的功能不是很負(fù)責(zé),但涉及到的知識(shí)卻是很多的,也很讓人胡涂!下面是這種方法的具體的實(shí)現(xiàn)步驟:
1.首先創(chuàng)建一個(gè)Visual C#的項(xiàng)目文件,項(xiàng)目名稱為【VC#中不同窗體數(shù)據(jù)傳遞方法03】。
2.把Visual Studio .Net的當(dāng)前窗口切換到【Form1.cs(設(shè)計(jì))】窗口,并從【工具箱】中的【W(wǎng)indows窗體】選項(xiàng)卡中拖入下列組件到【Form1.cs(設(shè)計(jì))】窗體中,并執(zhí)行相應(yīng)操作:
一個(gè)TextBox組件,用以顯示從從窗體傳遞來的字符串?dāng)?shù)據(jù)。
一個(gè)Label組件。
一個(gè)Button組件,名稱為button1,并在button1被拖入窗體后,雙擊,則系統(tǒng)產(chǎn)生其Click事件對(duì)應(yīng)的處理代碼。
3.把Visual Studio .Net的當(dāng)前窗口切換到【Form1.cs】窗口,即:Form1.cs的代碼編輯窗口。并用下列代碼替換替代系統(tǒng)產(chǎn)生的InitializeComponent過程。
DE<private void InitializeComponent ( ){ this.textBox1 = new System.Windows.Forms.TextBox ( ) ; this.label1 = new System.Windows.Forms.Label ( ) ; this.button1 = new System.Windows.Forms.Button ( ) ; this.SuspendLayout ( ) ; this.textBox1.Location = new System.Drawing.Point ( 107 , 71 ) ; this.textBox1.Name = "textBox1" ; this.textBox1.Size = new System.Drawing.Size ( 140 , 21 ) ; this.textBox1.TabIndex = 0 ; this.textBox1.Text = "" ; this.label1.Location = new System.Drawing.Point ( 17 , 78 ) ; this.label1.Name = "label1" ; this.label1.TabIndex = 1 ; this.label1.Text = "傳遞來的數(shù)據(jù):" ; this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ; this.button1.Location = new System.Drawing.Point ( 104 , 143 ) ; this.button1.Name = "button1" ; this.button1.Size = new System.Drawing.Size ( 91 , 41 ) ; this.button1.TabIndex = 2 ; this.button1.Text = "顯示Form2" ; this.button1.Click += new System.EventHandler ( this.button1_Click ) ; this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ; this.Controls.AddRange ( new System.Windows.Forms.Control[ ] { this.button1 , this.textBox1 , this.label1 } ) ; this.MaximizeBox = false ; this.MinimizeBox = false ; this.Name = "Form1" ; this.Text = "從窗體向主窗體傳遞數(shù)據(jù)" ; this.ResumeLayout ( false ) ;DE< myForm.Send += new Form2.SendMess ( Send ) ;}
請(qǐng)注意上述代碼中粗體的代碼,上述代碼是定義Form2類實(shí)例myForm的Send事件,其中"SendMess"是定義的委托類型。定義"SendMess"和"Send"代碼位于項(xiàng)目文件中的Form2.cs中。
4.在Form1.cs中的class的代碼區(qū)加入下列代碼,下列代碼是創(chuàng)建一個(gè)Form2類的實(shí)例,并初始化:
DE<private Form2 myForm = new Form2 ( ) ;DE<
5.在Form1.cs中的Main函數(shù)之后,加入下列代碼,下列代碼的功能是處理myForm中的Send事件,正是在Send事件中實(shí)現(xiàn)從從窗體向主窗體傳遞字符串?dāng)?shù)據(jù):
DE<private void Send ( string str ){ textBox1.Text = str ; //把接收來的字符串通過TextBox組件顯示出來}DE<
6.用下列代碼替換Form1.cs中button1組件的Click事件對(duì)應(yīng)的處理代碼,下列代碼的作用是顯示Form2類的實(shí)例myForm:
DE<private void button1_Click ( object sender , System.EventArgs e ){ myForm.ShowDialog ( ) ; //顯示從窗體}DE<
7.選擇菜單【項(xiàng)目】|【添加Windows窗體】后,彈出【添加新項(xiàng)-VC#中不同窗體數(shù)據(jù)傳遞方法03】對(duì)話框。在此對(duì)話框中的【名稱(N):】文本框中輸入【Form2】后,單擊【打開】按鈕,則在VC#中不同窗體數(shù)據(jù)傳遞方法03項(xiàng)目中添加了一個(gè)新的窗體,名稱為【Form2】。
8.把Visual Studio .Net的當(dāng)前窗口切換到【Form2.cs(設(shè)計(jì))】窗口,并從【工具箱】中的【W(wǎng)indows窗體】選項(xiàng)卡中拖入下列組件到【Form2.cs(設(shè)計(jì))】窗體中,并執(zhí)行相應(yīng)操作:
一個(gè)TextBox組件,用以輸入向主窗體傳遞的字符串?dāng)?shù)據(jù)。
一個(gè)Label組件。
一個(gè)Button組件,名稱為button1,并在button1被拖入窗體后,雙擊之,則系統(tǒng)產(chǎn)生其Click事件對(duì)應(yīng)的處理代碼。
9.把Visual Studio .Net的當(dāng)前窗口切換到【Form2.cs】窗口,即:Form2.cs的代碼編輯窗口。并用下列代碼替換替代系統(tǒng)產(chǎn)生的InitializeComponent過程。
DE<private void InitializeComponent ( ){ this.label1 = new System.Windows.Forms.Label ( ) ; this.textBox1 = new System.Windows.Forms.TextBox ( ) ; this.button1 = new System.Windows.Forms.Button ( ) ; this.SuspendLayout ( ) ; this.label1.Location = new System.Drawing.Point ( 30 , 62 ) ; this.label1.Name = "label1" ; this.label1.Size = new System.Drawing.Size ( 163 , 23 ) ; this.label1.TabIndex = 0 ; this.label1.Text = "傳遞到主窗體的字符串:" ; this.textBox1.Location = new System.Drawing.Point ( 37 , 94 ) ; this.textBox1.Name = "textBox1" ; this.textBox1.Size = new System.Drawing.Size ( 187 , 21 ) ; this.textBox1.TabIndex = 1 ; this.textBox1.Text = "" ; this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ; this.button1.Location = new System.Drawing.Point ( 99 , 155 ) ; this.button1.Name = "button1" ; this.button1.Size = new System.Drawing.Size ( 85 , 41 ) ; this.button1.TabIndex = 2 ; this.button1.Text = "傳遞" ; this.button1.Click += new System.EventHandler ( this.button1_Click ) ; this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ; this.Controls.AddRange ( new System.Windows.Forms.Control[ ] { this.button1 , this.textBox1 , this.label1 } ) ; this.MaximizeBox = false ; this.MinimizeBox = false ; this.Name = "Form2" ; this.Text = "Form2" ; this.ResumeLayout ( false ) ;}DE<
10.在Form2.cs的class代碼區(qū)添加下列代碼,下列代碼是在Form2類中增加一個(gè)事件類型Send,當(dāng)然首先要定義一個(gè)委托類型SendMess:
DE<public delegate void SendMess ( string str ) ; //定義委托類型 public event SendMess Send ; //定義一個(gè)事件類型DE<
11.用下列代碼替換Form2.cs中button2的Click事件對(duì)應(yīng)的處理代碼,下列代碼的功能是觸發(fā)Send事件,傳遞字符串?dāng)?shù)據(jù):
DE<public delegate void SendMess ( string str ) ; //定義委托類型 public event SendMess Send ; //定義一個(gè)事件類型DE<
12.至此,在上述步驟都正確完成,并成功保存后,【VC#中不同窗體數(shù)據(jù)傳遞方法03】項(xiàng)目的全部工作就完成了。此時(shí)單擊快捷鍵【F5】運(yùn)行程序,單擊主窗體中【顯示Form2】按鈕,則從窗體Form2就顯示出來,在Form2中的【傳遞到主窗體的字符串】文本框中輸入"Hello World!"后,單擊【傳遞】按鈕,則程序就能夠把字符串"Hello World!"傳遞到主窗體,并通過主窗體中的【傳遞來的字符串】文本框顯示出來,圖01是【VC#中不同窗體數(shù)據(jù)傳遞方法03】程序的運(yùn)行界面:
圖01:【VC#中不同窗體數(shù)據(jù)傳遞方法03】的運(yùn)行界面
總結(jié)
本節(jié)介紹的雖然是從從窗體向主窗體傳遞字符串類型數(shù)據(jù)。對(duì)于其他類型的數(shù)據(jù)(如:Image類型)其實(shí)現(xiàn)的方法也是一樣的,只不過在定義委托類型時(shí),其參數(shù)類型要定義為Image類型。同時(shí)在程序的其他對(duì)應(yīng)地方做相應(yīng)的修改就可以了,希望諸位能夠親自嘗試一下,這對(duì)了解、掌握Delegate、Event在C#中的用法是非常有幫助。對(duì)于Visual C#初學(xué)者來說,本文介紹的這種方法是難以理解的,但本文介紹的這種方法對(duì)于精通Visual C#編程是很有幫助的,對(duì)理解Visual C#編程思想也有很大的益處,因?yàn)槲覀冏畛S玫腃#的開發(fā)工具Visual Studio .Net,由于其功能實(shí)在太強(qiáng)大,并且操作方便,在編程中替代我們做了許多煩雜的工作,這些替代工作的確給我們編程帶來了許多方便、加快了編程速度,但同時(shí)也掩蓋了許多相對(duì)底層的操作,使得我們對(duì)某些操作并不覺察,就是覺察到,也很難理解其中的來龍去脈缺。而本文就簡(jiǎn)單的介紹了一些功能實(shí)現(xiàn)方式,所以希望讀者在通讀完本文后,不僅能夠掌握從窗體向主窗體傳遞數(shù)據(jù)的方法,也能夠加深對(duì)這些關(guān)鍵理解和掌握程度。