Поделиться через


Массивы элементов управления для пользователей Visual Basic 6.0

Обновлен: Ноябрь 2007

Хотя массивы элементов управления больше не поддерживаются в 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.ControlCollection класса Control.

В Visual Basic 6.0 элементы управления одного массива могли быть размещены в разных контейнерах. Например, элементы управления TextBox, содержащиеся в двух разных элементах управления Frame, могли быть частью одного массива.

В Visual Basic 2008 коллекция Controls возвращает только элементы управления, размещенные в одном контейнере. Необходимо отдельно выполнить итерацию элементов управления каждого контейнера; это можно сделать с помощью рекурсивной функции.

Добавление элементов управления во время выполнения

В Visual Basic 6.0 элементы управления можно было добавить к массиву во время выполнения с помощью оператора Load. Элементы управления должны были иметь тот же тип, что и массив, а массив требовалось создать в режиме разработки, по крайней мере с одним элементом. После добавления элемента управления требовалось задать значение True для свойства Visible.

В Visual Basic 2008 элементы управления добавляются во время выполнения с помощью ключевого слова New в операторе Dim, затем использовать метод Add для контейнера, в который нужно добавить элемент управления.

Добавление обработчиков событий во время выполнения

В Visual Basic 6.0 при добавлении элемента управления к массиву во время выполнения новые события элементов управления автоматически обрабатывались событиями этого массива.

В Visual Basic 2008 требуется определить обработчики событий для элементов управления, добавляемых во время выполнения. Это делается с помощью оператора AddHandler.

Изменения кода для массива элементов управления

В следующем коде показаны различия в методах программирования между Visual Basic 6.0 и Visual Basic 2008.

Общий доступ к обработчикам событий

В следующем примере демонстрируется общий доступ к обработчику событий Change (TextChanged в Visual Basic 2008) для группы из трех элементов управления TextBox. В Visual Basic 2008 предложение Handles обработчика событий указывает, какое управление событием будет обрабатываться. Обработчик событий возвращает универсальный Object, поэтому он должен быть приведен к отдельному типу объекта (в данном случае, TextBox), который нужно обработать с помощью метода DirectCast.

' 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
kxt4418a.alert_note(ru-ru,VS.90).gifПримечание.

Поведение событие несколько отличается в Visual Basic 2008. Событие TextChanged создается при инициализации каждого элемента управления (например, в событии Form_Load), а также при изменении текста во время выполнения. В Visual Basic 6.0 событие Change создавалось только при изменении текста.

Итерация элементов управления

В следующем примере показана функция для итерации группы элементов управления текстового поля и удаления текста. В примере Visual Basic 6.0 свойство Index массива элементов управления используется как переменная цикла.

В Visual Basic 2008 объект Control передается как аргумент; он содержит коллекцию Control.ControlCollection, включающую все элементы управления, размещенные в этом элементе управления. Оператор Typeof используется для того, чтобы определить, каждый ли элемент управления имеет тип TextBox.

kxt4418a.alert_note(ru-ru,VS.90).gifПримечание.

Объект 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)

Другие ресурсы

Элементы управления Windows Forms (для пользователей Visual Basic 6.0)