Visual Basic 6.0 使用者可用的 Controls 集合
更新:2007 年 11 月
在 Visual Basic 2008 中,Control.ControlCollection 類別會取代 Visual Basic 6.0 的 Controls 集合。
概念上的差異
在 Visual Basic 6.0 中,Controls 集合就是代表表單或容器 (Container) 控制項中,各控制項的項目集合。
在 Visual Basic 2008 中,Control.ControlCollection 類別會取代 Controls 集合。表單具有預設的 Control.ControlCollection 類別,可使用 Me.Controls 語法進行存取。
Add 方法
在 Visual Basic 6.0 中,Controls 集合的 Add 方法是晚期繫結,透過將 Control 類別指定為引數,可在 Add 方法中建立控制項。
在 Visual Basic 2008 中,Control.ControlCollection 類別的 Add 方法在加入至集合之前,需要使用 New 關鍵字建立控制項。
Remove 方法
Visual Basic 6.0 Controls 集合的 Remove 方法只可用於使用 Add 方法加入的控制項。Visual Basic 2008Control.ControlCollection 類別則沒有這個限制。
Timer 和 Menu 控制項
在 Visual Basic 6.0 中,Timer 和 Menu 控制項是 Controls 集合的成員。在 Visual Basic 2008 中,這些控制項是由 Timer 和 MainMenu 或 ContextMenu 元件取代,元件不是 Control.ControlCollection 類別的成員。
被收納的控制項
在 Visual Basic 6.0 中,Controls 集合包括容器控制項子系的控制項 (例如,位於 Frame 控制項中的控制項),Visual Basic 2008 的 Control.ControlCollection 類別則否。若要逐一查看表單上的所有控制項,您必須遞迴地逐一查看每個容器控制項的 Controls 類別。
Controls 集合的程式碼變更
下列範例會示範 Visual Basic 6.0 與 Visual Basic 2008 之間的程式撰寫技巧差異。
加入及移除控制項的程式碼變更
下列程式碼將說明 Visual Basic 6.0 Controls 集合和 Visual Basic 2008Control.ControlCollection 類別之間的差異。
' Visual Basic 6.0
Private Sub Command1_Click()
' Declare a new Control variable.
Dim c As Control
' Create and add the new control.
Set c = Controls.Add("VB.TextBox", "Text1")
' Make the new control visible.
c.Visible = True
' Set the initial text.
c.Text = "Hello"
' Retrieve the text from the new TextBox.
If Controls.Count > 1 Then
MsgBox (Controls("Text1").Text)
End If
' Remove the new control.
Controls.Remove (Text1)
' The following line causes a compilation error.
' You cannot remove controls added at design time.
Controls.Remove (Command1)
End Sub
' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Create a new TextBox control.
Dim TextBox1 As New System.Windows.Forms.TextBox
TextBox1.Name = "TextBox1"
' Add the new control to the form's Controls collection.
Me.Controls.Add(TextBox1)
' No need to set Visible property.
' Set the initial text.
TextBox1.Text = "Hello"
' Retrieve the text from the new TextBox.
If Me.Controls.Count > 1 Then
MsgBox(Me.Controls("TextBox1").Text)
End If
' Remove the new control.
Me.Controls.Remove(TextBox1)
' Remove the control added at design time.
Me.Controls.Remove(Button1)
End Sub
逐一查看控制項集合的程式碼變更
下列程式碼說明在表單上逐一查看所有控制項,然後清除所有 CheckBox 控制項的函式。這個範例假設 CheckBox 控制項在 GroupBox 或 Panel 控制項上,而非在表單上。在 Visual Basic 2008 範例中,由於表單的 Controls 集合只包含直接在表單上的控制項,函式會遞迴地為具有子系的控制項呼叫本身。
' Visual Basic 6.0
Private Sub ClearChecks()
For Each Control in Me.Controls
If TypeOf Control Is CheckBox Then
Control.Value = vbUnchecked
End If
Next
End Sub
' Visual Basic
Private Sub ClearChecks(ByVal Container As Control)
Dim ctl As Control
Dim chk As CheckBox
For Each ctl In Container.Controls
If TypeOf ctl Is CheckBox Then
chk = ctl
chk.Checked = False
End If
' Recursively call this function for any container controls.
If ctl.HasChildren Then
ClearChecks(ctl)
End If
Next
End Sub
升級注意事項
由於 Visual Basic 6.0 和 Visual Basic 2008Controls 集合之間的差異,所以不會升級 Add 方法的呼叫。您必須加入程式碼,以使用新的 Add 方法重建應用程式的行為。