Массивы элементов управления в Visual Basic 2008.
Хотя массивы элементов управления больше не поддерживаются в 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.
- 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
- 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. Событие TextChanged создается при инициализации каждого элемента управления (например, в событии Form_Load), а также при изменении текста во время выполнения. В 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 вызывается рекурсивно.
- Private Sub ClearText()
- For i = 0 To Text1().UBound
- Text1(i).Text = ""
- Next
- End Sub
- 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.
- Private Sub AddControl()
- Load Text1(1)
- Text1(1).Move Text1(0).Left, Text1(0).Top + 500
- Text1(1).Visible = True
- Dim TextBox2 As New TextBox
- TextBox2.Left = TextBox1.Left
- TextBox2.Top = TextBox1.Top + 30
- 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.