這篇文章主要介紹“VB.NET實(shí)現(xiàn)多窗體的方法”,在日常操作中,相信很多人在VB.NET實(shí)現(xiàn)多窗體的方法問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”VB.NET實(shí)現(xiàn)多窗體的方法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
在大連等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需開發(fā)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,大連網(wǎng)站建設(shè)費(fèi)用合理。
前言
在微軟 Visual Basic 6.0 中,一條簡(jiǎn)單的 “Form2.Show” 語句就能顯示項(xiàng)目中的第二窗體 (Form2)。然而,它在 Visaul Basic .NET 中卻行不通了,因?yàn)?.NET 版在窗體處理機(jī)制上有了很大的變化。剛剛轉(zhuǎn)向 .NET 版的 Visaul Basic 程序員實(shí)在難以接受這么大的變化,因?yàn)楝F(xiàn)在連“顯示第二窗體”這么簡(jiǎn)單的任務(wù)都無從下手。我希望能夠通過本文向大家介紹 Visaul Basic .NET 與早期的 Visual Basic 在窗體處理機(jī)制上有哪些不同之處,以及如何按照 .NET 的模式進(jìn)行VB.NET多窗體編程。
Visual Basic 6.0 對(duì) Visual Basic .NET
窗體(窗體類)正如其它類一樣,無論在哪個(gè)版本的 Visual Basic 中都是必不可少的。VB.NET多窗體也有屬性、方法和事件,且在同一個(gè)項(xiàng)目中也允許創(chuàng)建多個(gè)窗體實(shí)例。例如:假設(shè)你在 Visual Basic 6.0 項(xiàng)目中定義了一個(gè)窗體 Form2 ,則你可以創(chuàng)建它的 3 個(gè)實(shí)例并同時(shí)顯示出來。代碼如下:
Dim myFirstForm As Form2 Dim mySecondForm As Form2 Dim myThirdForm As Form2 Set myFirstForm = New Form2 Set mySecondForm = New Form2 Set myThirdForm = New Form2 myFirstForm.Show mySecondForm.Show myThirdForm.Show
以上代碼用 3 條 Set 語句生成了 3 個(gè) Form2 實(shí)例。你可以把它原封不動(dòng)地搬到 Visual Basic .NET 中運(yùn)行,它照樣能夠正確顯示 3 個(gè) Form2 窗體。在這里,“Form2” 其實(shí)相當(dāng)于一個(gè)普通的類。Visual Basic 6.0 允許代碼直接訪問尚未實(shí)例化的窗體類;然而Visual Basic .NET 卻規(guī)定在訪問任何類之前都要進(jìn)行實(shí)例化,而且必須借助實(shí)例來訪問類。這種變化當(dāng)然有可能造成許多疑惑。Visual Basic 6.0 等早期版本能自動(dòng)生成每個(gè)窗體的默認(rèn)實(shí)例,從而允許直接通過窗體名稱來訪問窗體。例如:在 Visual Basic 6.0 項(xiàng)目中,可以直接用代碼 “Form2.Show” 顯示 Form2 的默認(rèn)實(shí)例;然而在 Visual Basic .NET 中,這么做只會(huì)引發(fā)錯(cuò)誤,因?yàn)?Visual Basic .NET 既不會(huì)創(chuàng)建默認(rèn)的窗體實(shí)例,也不允許直接訪問尚未實(shí)例化的窗體類。
這就是 Visual Basic .NET 與早期 Visual Basic 在窗體處理機(jī)制上的關(guān)鍵區(qū)別——你只有先創(chuàng)建窗體實(shí)例,然后才可以顯示窗體外觀、訪問窗體屬性及其控件。它們還有另一個(gè)區(qū)別:Visual Basic 6.0 項(xiàng)目自動(dòng)創(chuàng)建的默認(rèn)窗體實(shí)例都能被當(dāng)成全局變量使用,也就是說,項(xiàng)目中的任何代碼都能直接引用VB.NET多窗體,并且每次被引用的都是該窗體的同一個(gè)實(shí)例。例如:你可以在窗體中 button 控件的 Click 事件處理程序里用代碼 “Form2.Show” 顯示 Form2 窗體,然后用下列代碼改變 Form2 中某個(gè) textbox 控件 (TextBox1)的內(nèi)容:
Form2.TextBox1.Text = "Fred"
可是,你在 Visual Basic .NET 中運(yùn)行它卻會(huì)得到一條錯(cuò)誤消息:“Reference to a Non-Shared Member Requires an Object Reference”(引用非共享類成員必須使用對(duì)象指針)。這是在提醒你:你正在訪問的類尚未進(jìn)行實(shí)例化。有一個(gè)簡(jiǎn)便的解決方案:當(dāng)你在調(diào)試過程中得到上述錯(cuò)誤消息時(shí),就把相應(yīng)的語句:
Form2.Show()
改成:
Dim myForm2 As
New Form2()myForm2.Show()
此方案適用于大多數(shù)場(chǎng)合。然而,當(dāng)項(xiàng)目中還有其它代碼訪問同一個(gè) Form2 實(shí)例 (比如改變其中 TextBox1 的文本) 時(shí),你可能會(huì)考慮把下列語句:
Form2.TextBox1.Text =
"Fred"
改成:
Dim myForm2 As
New Form2()myForm2.TextBox1.
Text = "Fred"
不幸的是,這段代碼創(chuàng)建了一個(gè)新的 Form2 實(shí)例,結(jié)果你所訪問的VB.NET多窗體不再是原先的 Form2 ,這豈不麻煩了!更壞的是,你不會(huì)因此而得到任何錯(cuò)誤消息提示,同時(shí)你先前調(diào)用 Show() 顯示的 Form2 窗體也不會(huì)發(fā)生任何變化。
升級(jí)向?qū)绾谓鉀Q它
如果你用升級(jí)向?qū)?(Upgrade Wizard) 把 Visual Basic 6.0 項(xiàng)目升級(jí)為 Visual Basic .NET 版,則它會(huì)在每個(gè)窗體中自動(dòng)添加一段特殊代碼,通過顯式創(chuàng)建窗體實(shí)例來模擬早期 Visual Basic 版本中的默認(rèn)實(shí)例化機(jī)制。此段代碼被包裹于標(biāo)號(hào)為 “Upgrade Support”的代碼區(qū)塊內(nèi),借助一個(gè)新增的 Shared 屬性來生成當(dāng)前窗體的實(shí)例:
Private Shared m_vb6FormDef
Instance As Form1Private Shared m_Initializing
DefInstance As BooleanPublic Shared Property
DefInstance() As Form1Get
If m_vb6FormDefInstance Is
Nothing _OrElse m_vb6FormDefInstance.
IsDisposed Thenm_InitializingDefInstance = True
m_vb6FormDefInstance = New Form1()
m_InitializingDefInstance = False
End If
DefInstance = m_vb6FormDefInstance
End Get
Set(ByVal Value As Form1)
m_vb6FormDefInstance = Value
End Set
End Property
代碼中的 DefInstance 是一個(gè) Shared 屬性,它能以 “窗體名.DefInstance” 的形式直接訪問。它所在項(xiàng)目中的任何代碼訪問它都將得到同一個(gè)窗體實(shí)例。這樣,你就能模擬 Visual Basic 6.0 項(xiàng)目對(duì)VB.NET多窗體的直接引用了,只不過在代碼中以 “Form2.DefInstance” 代替 “Form2” 而已。
這時(shí),你只需用 Form2.DefInstance.Show() 和Form2.DefInstance.TextBox1.Text = "Fred" 分別替換原先對(duì) Form2 相應(yīng)的直接引用就大功告成了。假如你不用升級(jí)向?qū)?,而是?Visual Basic .NET 窗體中手工插入上述代碼 (以及升級(jí)向?qū)г诖绑w的 New過程中自動(dòng)添加的代碼),也行。當(dāng)然了,你并不一定非要修改窗體代碼,因?yàn)橛幸环N編程模式可以在 .NET 項(xiàng)目中模擬默認(rèn)窗體實(shí)例的創(chuàng)建。本文將用余下的篇幅來介紹這種編程模式。
VB.NET多窗體之間的交互
在 Visual Basic 6.0 等早期版本中,多個(gè)窗體之間的交互通常需要借助默認(rèn)窗體實(shí)例來完成。下面我將結(jié)合某些具體的編程任務(wù)來講解如何在 .NET 下實(shí)現(xiàn)多窗體交互,希望它能對(duì)你的開發(fā)任務(wù)有所幫助。
保持窗體引用的全局性
前面提到,進(jìn)行 .NET 窗體編程時(shí)應(yīng)該牢牢把握下列原則:在訪問窗體之前,你必須進(jìn)行窗體實(shí)例化;如果在項(xiàng)目中有多處代碼訪問同一窗體,則你必須把它的同一實(shí)例指針傳遞給這些代碼。對(duì)于早已習(xí)慣了直接把默認(rèn)窗體實(shí)例當(dāng)成全局變量來使用的 Visual Basic 6.0 程序員來說,這可是個(gè)嚴(yán)重的挑戰(zhàn)。好在 .NET 為你提供了兩條出路:其一,把窗體實(shí)例指針保存在全局變量中;其二,把窗體實(shí)例指針傳遞給任何需要訪問它的窗體、類、模塊或者過程。
.NET 中的數(shù)值全局化
我以前曾經(jīng)指出,Visual Basic .NET 不支持全局變量,現(xiàn)在我又要說,在 .NET 中可以在某種程度上實(shí)現(xiàn)數(shù)值全局化。這算不算此一時(shí),彼一時(shí)?不,我不是那種人。Visual Basic .NET 確實(shí)不支持全局變量,然而它借助 Shared (相當(dāng)于 C# 中的 static) 變量卻能模擬全局變量。事實(shí)上,前面介紹的 Visual Basic 升級(jí)向?qū)ё詣?dòng)添加到窗體代碼中的 DefInstance 屬性就是 Shared 類成員。無論容納 DefInstance 屬性的窗體類是否已經(jīng)實(shí)例化,它都能被項(xiàng)目中的任何代碼所引用。象這樣的 Shared 屬性不就相當(dāng)于全局變量嗎?因此,你可以創(chuàng)建這樣的類:
Public Class myForms
Private Shared m_CustomerForm
As CustomerFormPublic Shared Property
CustomerForm() As CustomerFormGet
Return m_CustomerForm
End Get
Set(ByVal Value As CustomerForm)
m_CustomerForm = Value
End Set
End Property
End Class
你需要在***實(shí)例化一個(gè)VB.NET多窗體時(shí),把該窗體的實(shí)例保存到一個(gè)類中:
Dim myNewCust As New
CustomerForm()myNewCust.Show()
myForms.CustomerForm =
myNewCust
這里的 CustomerForm 屬性值就是你的窗體實(shí)例。于是,其它代碼就能從項(xiàng)目的任何地方通過它來間接訪問你的窗體了:
Module DoingStuffWithForms
Sub DoExcitingThings()
myForms.CustomerForm.Text = _
DateTime.Now().
ToLongTimeStringEnd Sub
End Module
象這樣把VB.NET多窗體實(shí)例保存為屬性值就能按照你的要求模擬 Visual Basic 6.0 中的全局變量。如此模擬的“全局變量”其作用域比類域 (class scope) 高一個(gè)層次。所謂類域,是指變量僅僅在定義它的類(確切地說,應(yīng)該包括模塊、類或窗體)中有效。比類域還低一層次的是過程域 (procedure scope),即變量僅僅在定義它的例程中有效。
窗體指針在項(xiàng)目中的傳遞
除了把窗體實(shí)例全局化以外,你還可以把窗體類指針保存在變量中傳遞給需要訪問該窗體的例程。假設(shè)你有一個(gè)窗體 Form1,并希望在點(diǎn)擊 Form1 中某個(gè)按鈕 (Button1) 時(shí)打開另第二窗體 Form2 ,然后在點(diǎn)擊第二窗體 Form2 中的另一個(gè)按鈕 (Button2) 時(shí)進(jìn)行某項(xiàng)計(jì)算。你可以把整個(gè)代碼都寫在 Form1 中,即:
Public Class Form1
Inherits System.Windows.Forms.Form
Dim myForm2 As Form2
Private Sub Button1_Click
(ByVal sender As System.
Object,_ ByVal e As System.
EventArgs) Handles Button1.ClickmyForm2 = New Form2()
myForm2.Show()
End Sub
Private Sub Button2_Click
(ByVal sender As System.Object,
_ByVal e As System.EventArgs)
Handles Button2.ClickCalculations.CompoundInterest
Calc(myForm2)End Sub
End Class
無論是把窗體指針全局化,還是把它以參數(shù)的形式傳遞,都是可行的。然而,你必須根據(jù)項(xiàng)目的需要選擇***方案。當(dāng) .NET 項(xiàng)目中只有少數(shù)幾個(gè)過程需要訪問特定窗體時(shí),我建議你給這些過程增加一個(gè)參數(shù),以在必要時(shí)接受窗體指針。當(dāng)你的項(xiàng)目有太多過程需要訪問該窗體時(shí),你就應(yīng)該考慮設(shè)置一個(gè)全局窗體指針變量。當(dāng)然了,你***還是考慮調(diào)整項(xiàng)目代碼結(jié)構(gòu),使得真正訪問該窗體的類或者過程只有一個(gè)。如果你希望用窗體來顯示登錄信息,則你可以先創(chuàng)建一個(gè)類,把VB.NET多窗體實(shí)例保存為它的 Shared 類成員,然后添加一個(gè) Shared 方法 WriteToLogWindow 來完成實(shí)際的窗體訪問。于是,項(xiàng)目中的任何代碼只需調(diào)用此 WriteToLogWindow 方法就能間接訪問顯示登錄信息的窗體了:
Public Class Log
Private Shared m_LogForm As Form2
Public Shared Property LogForm()
As Form2Get
Return m_LogForm
End Get
Set(ByVal Value As Form2)
m_LogForm = Value
End Set
End Property
Public Shared Sub WriteToLogWindow
(ByVal Message As String)Dim sb As New _
StringBuilder(m_LogForm.txtLog
Info.Text)sb.Append(Environment.NewLine)
sb.Append(Message)
m_LogForm.txtLogInfo.Text =
sb.ToString()End Sub
End Class
讀取和改變VB.NET多窗體內(nèi)的信息
到現(xiàn)在為止,我們討論的只是如何創(chuàng)建和訪問窗體實(shí)例,而沒有涉及如何讀取或改變窗體內(nèi)的信息。如果你的窗體已經(jīng)按照前述方法實(shí)例化,并且訪問窗體的代碼都位于窗體所在的項(xiàng)目中,則你可以直接操作窗體中的任何控件來讀取和改變窗體內(nèi)的信息。但我覺得這樣并不理想。與其直接訪問窗體中的文本框、按鈕等控件,還不如增加一個(gè) Public 屬性,通過它來控制窗體中的控件。如果你有意嘗試這種特殊的窗體訪問方式,請(qǐng)跟我來:
在 Visual Basic .NET 中新建一個(gè) Windows 應(yīng)用程序項(xiàng)目。
此時(shí)項(xiàng)目中已經(jīng)自動(dòng)生成了一個(gè)窗體 Form1 。現(xiàn)在添加另一個(gè)窗體 Form2 :在“解決方案資源管理器”中按右鍵單擊項(xiàng)目名稱 -> “添加” -> “添加 Windows 窗體” -> 點(diǎn)擊“打開”以接受默認(rèn)名稱 Form2.vb 。
在 Form1 中添加兩個(gè)按鈕,分別按照默認(rèn)值命名為 Button1 和 Button2 ,并且調(diào)整它們?cè)诖绑w中的位置以免重疊。
在 Form2 中添加一個(gè)簡(jiǎn)單文本框,按照默認(rèn)值命名為 TextBox1
把下列代碼添加到 Form2 的“End Class”前面 (在“解決方案資源管理器”中按右鍵單擊 “Form2”-> “查看代碼”,再粘貼下列代碼):
Public Property CustomerName()
As StringGet
Return TextBox1.Text
End Get
Set(ByVal Value As String)
TextBox1.Text = Value
End Set
End Property
接下來要做的是:
a. 切換到 Form1 的代碼,在 “Inherits System.Windows.Forms.Form” 后面增加一行:
Dim myForm2 As New Form2()
b. 在 Form1 中雙擊Button1 按鈕,在它的 Click 事件處理程序代碼中輸入下列代碼:
myForm2.CustomerName =
"Fred"myForm2.Show()
c. 在 Form1 中雙擊Button2 按鈕,在它的 Click 事件處理程序代碼中輸入下列代碼:
MessageBox.Show
(myForm2.CustomerName)myForm2.CustomerName =
"Joe"
d. 按 F5 運(yùn)行項(xiàng)目,并點(diǎn)擊窗體中的 Button1 和 Button2 按鈕,以觀察代碼運(yùn)行情況。
表面看來,通過 CustomerName 屬性來訪問 Form2 與直接訪問 Form2 非常相似。然而,這種間接的窗體訪問方式能夠帶來很多好處,其中最重要的一點(diǎn)就在于它實(shí)現(xiàn)了更高的抽象性。換言之,哪怕你不知道 Form2 中控件的任何細(xì)節(jié) (比如:窗體中是否包含 textbox 控件) ,也能與 Form2 交換數(shù)據(jù);你所要做的只是讀取或設(shè)置 CustomerName 屬性值而已。有了這種抽象,你就能在修改 Form2 的實(shí)現(xiàn)時(shí)不影響項(xiàng)目中的其它代碼,因而大大簡(jiǎn)化了整個(gè)項(xiàng)目代碼的維護(hù)。
單從本文的例子來看,這種基于屬性的窗體編程模式似乎并不比常規(guī)方式簡(jiǎn)單。然而,它以屬性的形式隱藏了窗體的全部細(xì)節(jié),故能用簡(jiǎn)潔、一致的代碼來訪問窗體。所以,它在一些相當(dāng)復(fù)雜的用戶界面編程中能夠大顯身手??偠灾?,通過屬性值來訪問窗體及其控件的編程模式雖然不太直觀,卻對(duì)程序員很有價(jià)值:它不但比直接訪問窗體的編程模式來得更專業(yè),而且讓整個(gè)項(xiàng)目的代碼清晰易讀。
結(jié)論
Visual Basic .NET 取消了早期版本中的“默認(rèn)窗體實(shí)例”,卻引起了不少 .NET 編程新手的困惑。Visual Basic .NET 規(guī)定,只有通過引用窗體實(shí)例,才能訪問窗體的屬性、方法及其控件。你所保存的窗體實(shí)例指針應(yīng)該盡量讓整個(gè)項(xiàng)目都能直接訪問到它。VB.NET多窗體處理機(jī)制已經(jīng)變得更合理、更強(qiáng)大。
到此,關(guān)于“VB.NET實(shí)現(xiàn)多窗體的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
本文標(biāo)題:VB.NET實(shí)現(xiàn)多窗體的方法
URL地址:http://jinyejixie.com/article2/ggshoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站策劃、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)