Visual Basic 6.0 使用者可用的控制項陣列
更新:2007 年 11 月
雖然 Visual Basic 2008 不再支援控制項陣列,但是您可以使用事件模型,複製和擴展大部分的控制項陣列功能。
概念上的差異
在 Visual Basic 6.0 中,控制項陣列可以用來管理表單上的控制項,它們提供了共用事件處理常式、逐一查看控制項群組,以及在執行階段加入控制項的功能。
在 Visual Basic 2008 中,已不再支援控制項陣列。改為使用事件模型讓控制項陣列變成非必要的功能,而且 .NET Framework 會提供使用控制項的相同功能。
共用事件處理常式
在 Visual Basic 6.0 中,控制項陣列可用來指定共用一組事件的控制項群組。控制項必須屬於相同型別,而且必須具有相同名稱。
Visual Basic 2008 可讓任何事件處理常式從多個控制項處理事件,即使這些控制項具有不同的名稱或不同型別的控制項也一樣。
例如,您可以將兩個 Button 控制項 (Button1 和 Button2) 及一個 CheckBox 控制項 (CheckBox1) 加入至表單,然後建立事件處理常式,處理所有三個控制項的 Click 事件。
Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click
逐一查看控制項
Visual Basic 6.0 控制項陣列的另一個功能是能夠使用 Index 屬性,逐一查看控制項群組。例如,若要清除控制項陣列中所有 TextBox 控制項的文字,您可以將 Index 屬性當做迴圈 (Loop) 變數,逐一查看控制項陣列。
雖然 Visual Basic 2008 控制項沒有 Index 屬性,但是您仍可以使用 Control 類別的 Control.ControlCollection,逐一查看表單或容器上的控制項。
在 Visual Basic 6.0 中,單一控制項陣列中的控制項可以位於不同容器中。例如,包含在兩個不同 Frame 控制項的 TextBox 控制項,可以是相同控制項陣列的一部分。
在 Visual Basic 2008 中,Controls 集合只會傳回位在單一容器中的控制項。您必須個別地逐一查看每個容器控制項中的控制項,這可以使用遞迴函式完成。
在執行階段加入控制項
在 Visual Basic 6.0 中,控制項可以在執行階段使用 Load 陳述式加入至控制項陣列。控制項必須與控制項陣列具有相同型別,且在設計階段,就必須建立至少含有一個元素的控制項陣列。加入控制項之後,Visible 屬性必須設定為 True。
在 Visual Basic 2008 中,在執行階段加入控制項的方法是在 Dim 陳述式中使用 New 關鍵字,然後對要加入控制項的容器使用 Add 方法。
在執行階段加入事件處理常式
在 Visual Basic 6.0 中,當您在執行階段將控制項加入至控制項陣列時,新控制項的事件會自動比照控制項陣列的事件處理。
在 Visual Basic 2008 中,您需要為在執行階段加入的控制項定義事件處理常式。這可以使用 AddHandler 陳述式完成。
控制項陣列的程式碼變更
下列程式碼將說明 Visual Basic 6.0 與 Visual Basic 2008 之間程式碼撰寫技巧的差異。
共用事件處理常式
下列範例會示範為包含三個 TextBox 控制項的群組 (在 Visual Basic 2008 中為 TextChanged) 共用 Change 事件處理常式。在 Visual Basic 2008 中,事件處理常式的 Handles 子句會指定事件將處理哪一個控制項。由於事件處理常式會傳回泛型 Object,所以您必須使用 DirectCast 方法,將其轉換為要處理的特定物件型別 (此例中為 TextBox)。
' Visual Basic 6.0
Private Sub Text1_Change(Index As Integer)
Select Case Index
Case 0
MsgBox("The text in the first TextBox has changed")
Case 1
MsgBox("The text in the second TextBox has changed")
Case 2
MsgBox("The text in the third TextBox has changed")
End Select
End Sub
' Visual Basic
Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _
TextBox2.TextChanged, TextBox3.TextChanged
Select Case DirectCast(sender, TextBox).Name
Case TextBox1.Name
MsgBox("The text in the first TextBox has changed")
Case TextBox2.Name
MsgBox("The text in the second TextBox has changed")
Case TextBox3.Name
MsgBox("The text in the third TextBox has changed")
End Select
End Sub
注意事項: |
---|
Visual Basic 2008 中的事件行為略有不同。初始化每一個控制項 (例如在 Form_Load 事件中) 時,以及在執行階段變更文字時,都會引發事件 TextChanged。在 Visual Basic 6.0 中,只有在變更文字時,才會引發 Change 事件。 |
逐一查看控制項
下列範例會示範逐一查看文字方塊群組和清除其文字的函式。在 Visual Basic 6.0 範例中,控制項陣列的 Index 屬性會當做迴圈變數使用。
在 Visual Basic 2008 中,Control 物件會當做引數來傳遞,它具有 Control.ControlCollection 集合,其中包含所有位於該控制項中的控制項。Typeof 運算子則會用來判斷每一個控制項是否具有型別 TextBox。
注意事項: |
---|
由於 Control.ControlCollection 集合不會包含巢狀控制項,所以會使用 HasChildren 方法,判斷每一個控制項是否包含其他控制項,若有的話,就會遞迴地呼叫 ClearText 函式。
' Visual Basic 6.0
Private Sub ClearText()
For i = 0 To Text1().UBound
Text1(i).Text = ""
Next
End Sub
' Visual Basic
Private Sub ClearText(ByVal container As Control)
Dim ctrl As Control
For Each ctrl In container.Controls
If TypeOf (ctrl) Is TextBox Then
ctrl.Text = ""
End If
If ctrl.HasChildren Then
ClearText(ctrl)
End If
Next
End Sub
在執行階段加入控制項
下列範例會示範在執行階段將文字方塊控制項加入至表單。在 Visual Basic 6.0 中,控制項會加入至控制項陣列。在 Visual Basic 2008 中,控制項則會加入至 Control.ControlCollection 集合。在 Visual Basic 6.0 中,新 TextBox 的事件會自動由控制項陣列處理。在 Visual Basic 2008 中,您必須透過 AddHandler 陳述式來連結事件處理。
這兩個範例假設文字方塊已在設計階段加入至表單,且在 Visual Basic 6.0 範例中,已建立包含單一元素的控制項陣列。此外,Visual Basic 2008 範例也假設第一個 TextBox 控制項中存在名為 TextChangedHandler 的事件處理常式。
' Visual Basic 6.0
Private Sub AddControl()
' Add a TextBox as the second element of a control array.
Load Text1(1)
' Set the location below the first TextBox.
Text1(1).Move Text1(0).Left, Text1(0).Top + 500
' Make the new TextBox visible
Text1(1).Visible = True
' Visual Basic
' Declare a new TextBox.
Dim TextBox2 As New TextBox
' Set the location below the first TextBox
TextBox2.Left = TextBox1.Left
TextBox2.Top = TextBox1.Top + 30
' Add the TextBox to the form's Controls collection.
Me.Controls.Add(TextBox2)
AddHandler TextBox2.TextChanged, AddressOf TextChangedHandler
升級注意事項
以 Visual Basic 6.0 建立的應用程式升級為 Visual Basic 2008 時,所有的控制項陣列都會升級為控制項專有的特殊陣列類別。這些類別會包含於 Microsoft.VisualBasic.Compatibility.VB6 命名空間中,升級工具會用它們來模擬 Visual Basic 6.0 控制項陣列行為。
雖然可以在新的 Visual Basic 2008 開發中使用這些控制項陣列類別,但建議您改用 .NET Framework 事件模型和函式。
請參閱
概念
Visual Basic 6.0 使用者可用的事件和事件處理方式