控件数组(针对 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 属性作为循环变量循环访问控件数组。

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 控件共享 Change 事件处理程序(Visual Basic 2008 中为 TextChanged)。在 Visual Basic 2008 中,事件处理程序的 Handles 子句指定事件将处理的控件。事件处理程序返回一个泛型 Object,因此必须强制转换为要使用 Object 方法处理的特定对象类型(在本例中为 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 类型。

说明:

Form 对象是 Control 类型;也可将 Form 作为参数传递。

因为 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 用户)

其他资源

适用于 Visual Basic 6.0 用户的 Windows 窗体控件