.NET 表單之間的互動

來源:互聯網
上載者:User
互動 進行 .NET 表單編程時應該牢牢把握下列原則:在訪問表單之前,你必須進行表單執行個體化;如果在項目中有多處代碼訪問同一表單,則你必須把它的同一執行個體指標傳遞給這些代碼。對於早已習慣了直接把預設表單執行個體當成全域變數來使用的 Visual Basic 6.0 程式員來說,這可是個嚴重的挑戰。好在 .NET 為你提供了兩條出路:其一,把表單執行個體指標儲存在全域變數中;其二,把表單執行個體指標傳遞給任何需要訪問它的表單、類、模組或者過程。
.NET 中的數值全域化
Visual Basic .NET 不支援全域變數,然而它藉助 Shared (相當於 C# 中的 static) 變數卻能類比全域變數。事實上,前面介紹的 Visual Basic 升級嚮導自動添加到表單代碼中的 DefInstance 屬性就是 Shared 類成員。無論容納 DefInstance 屬性的表單類是否已經執行個體化,它都能被項目中的任何代碼所引用。象這樣的 Shared 屬性不就相當於全域變數嗎?因此,你可以建立這樣的類:
Public Class myForms
Private Shared m_CustomerForm As CustomerForm
Public Shared Property CustomerForm() As CustomerForm
Get
Return m_CustomerForm
End Get
Set(ByVal Value As CustomerForm)
m_CustomerForm = Value
End Set
End Property
End Class
你需要在首次執行個體化一個表單時,把該表單的執行個體儲存到一個類中:
Dim myNewCust As New CustomerForm()
myNewCust.Show()
myForms.CustomerForm = myNewCust
這裡的 CustomerForm 屬性值就是你的表單執行個體。於是,其它代碼就能從項目的任何地方通過它來間接訪問你的表單了:
Module DoingStuffWithForms
Sub DoExcitingThings()
myForms.CustomerForm.Text = _
DateTime.Now().ToLongTimeString
End Sub
End Module
象這樣把表單執行個體儲存為屬性值就能按照你的要求類比 Visual Basic 6.0 中的全域變數。如此類比的“全域變數”其範圍比類域 (class scope) 高一個層次。所謂類域,是指變數僅僅在定義它的類(確切地說,應該包括模組、類或表單)中有效。比類域還低一層次的是過程域 (procedure scope),即變數僅僅在定義它的常式中有效。
表單指標在項目中的傳遞
除了把表單執行個體全域化以外,你還可以把表單類指標儲存在變數中傳遞給需要訪問該表單的常式。假設你有一個表單 Form1,並希望在點擊 Form1 中某個按鈕 (Button1) 時開啟另第二表單 Form2 ,然後在點擊第二表單 Form2 中的另一個按鈕 (Button2) 時進行某項計算。你可以把整個代碼都寫在 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.Click
myForm2 = New Form2()
myForm2.Show()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Calculations.CompoundInterestCalc(myForm2)
End Sub
End Class
無論是把表單指標全域化,還是把它以參數的形式傳遞,都是可行的。然而,你必鬚根據項目的需要選擇最佳方案。當 .NET 項目中只有少數幾個過程需要訪問特定表單時,我建議你給這些過程增加一個參數,以在必要時接受表單指標。當你的項目有太多過程需要訪問該表單時,你就應該考慮設定一個全域表單指標變數。當然了,你最好還是考慮調整項目代碼結構,使得真正訪問該表單的類或者過程只有一個。如果你希望用表單來顯示登入資訊,則你可以先建立一個類,把表單執行個體儲存為它的 Shared 類成員,然後添加一個 Shared 方法 WriteToLogWindow 來完成實際的表單訪問。於是,項目中的任何代碼只需調用此 WriteToLogWindow 方法就能間接訪問顯示登入資訊的表單了:
Public Class Log
Private Shared m_LogForm As Form2
Public Shared Property LogForm() As Form2
Get
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.txtLogInfo.Text)
sb.Append(Environment.NewLine)
sb.Append(Message)
m_LogForm.txtLogInfo.Text = sb.ToString()
End Sub
End Class
讀取和改變表單內的資訊
到現在為止,我們討論的只是如何建立和訪問表單執行個體,而沒有涉及如何讀取或改變表單內的資訊。如果你的表單已經按照前述方法執行個體化,並且訪問表單的代碼都位於表單所在的項目中,則你可以直接操作表單中的任何控制項來讀取和改變表單內的資訊。但我覺得這樣並不理想。與其直接存取表單中的文字框、按鈕等控制項,還不如增加一個 Public 屬性,通過它來控制表單中的控制項。如果你有意嘗試這種特殊的表單訪問方式,請跟我來:
在 Visual Basic .NET 中建立一個 Windows 應用程式項目。
此時項目中已經自動產生了一個表單 Form1 。現在添加另一個表單 Form2 :在“方案總管”中按按右鍵項目名稱 -> “添加” -> “添加 Windows 表單” -> 點擊“開啟”以接受預設名稱 Form2.vb 。
在 Form1 中添加兩個按鈕,分別按照預設值命名為 Button1 和 Button2 ,並且調整它們在表單中的位置以免重疊。
在 Form2 中添加一個簡單文字框,按照預設值命名為 TextBox1
把下列代碼添加到 Form2 的“End Class”前面 (在“方案總管”中按按右鍵 “Form2”-> “查看代碼”,再粘貼下列代碼):
Public Property CustomerName() As String
Get
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 運行項目,並點擊表單中的 Button1 和 Button2 按鈕,以觀察代碼運行情況。
表面看來,通過 CustomerName 屬性來訪問 Form2 與直接存取 Form2 非常相似。然而,這種間接的表單訪問方式能夠帶來很多好處,其中最重要的一點就在於它實現了更高的抽象性。換言之,哪怕你不知道 Form2 中控制項的任何細節 (比如:表單中是否包含 textbox 控制項) ,也能與 Form2 交換資料;你所要做的只是讀取或設定 CustomerName 屬性值而已。有了這種抽象,你就能在修改 Form2 的實現時不影響項目中的其它代碼,因而大大簡化了整個項目代碼的維護。單從本文的例子來看,這種基於屬性的表單編程模式似乎並不比常規方式簡單。然而,它以屬性的形式隱藏了表單的全部細節,故能用簡潔、一致的代碼來訪問表單。所以,它在一些相當複雜的使用者介面編程中能夠大顯身手。總而言之,通過屬性值來訪問表單及其控制項的編程模式雖然不太直觀,卻對程式員很有價值:它不但比直接存取表單的編程模式來得更專業,而且讓整個項目的代碼清晰易讀。

在項目中我採用的是全域變數的方法,代碼如下:

Public Class myForm

    Private Shared m_MainForm As System.Windows.Forms.Form

    Public Shared Property MainForm() As System.Windows.Forms.Form
        Get
            Return m_MainForm
        End Get
        Set(ByVal Value As System.Windows.Forms.Form)
            m_MainForm = Value
        End Set
    End Property
    End Class



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。