ПОНЯТНО О Visual Basic NET (том 2)

Создание коллекции, методы коллекции


Я рассмотрю распространенный случай, когда в коллекцию входят только элементы управления.

Задача: На вашей форме имеется несколько десятков кнопок, меток и текстовых полей, которые делают свое дело, скажем, помогают обрабатывать банковскую информацию. Глядя на них, можно сказать кто принес деньги, сколько принес, в долларах или рублях, сколько денег у него стало, сколько всего в банке денег и т.д. Вам нужно, чтобы иногда, в некоторые моменты выполнения программы, такие-то и такие-то кнопки, метки и текстовые поля из самых разных мест формы (всего, скажем, дюжина объектов) меняли цвет. Ну, скажем, для того, чтобы привлечь к себе ваше внимание. А в какие-нибудь другие моменты эта же самая дюжина должна делать что-нибудь другое, например, все кнопки из этой дюжины должны быть деактивированы, чтобы на них случайно не нажали. И так далее. В общем, эта дюжина иногда должна вести себя по-другому, чем остальные элементы управления.  

Решение: Создадим проект. Для простоты разместим на форме только шесть элементов управления: Label1, TextBox1, Button1, Label2, TextBox2, Button2. Пусть в нашу «дюжину» входят из них только Label2, TextBox2, Button2.

Мы могли бы поместить нашу «дюжину» в рамку (GroupBox). Но рамка не обладает такой функциональностью, как коллекция. К тому же она требует пространственной отграниченности входящих в нее элементов управления от остальных.

Программным путем создадим из наших объектов коллекцию. Для этого сначала придумаем ей имя  Моя_коллекция. Коллекция – это объект, экземпляр класса Collection, и создается она соответствующим привычным образом:.

        Dim Моя_коллекция As New Collection                  'Объявляем и создаем коллекцию

Коллекция объявлена, но пока она пуста, в ней нет ни одного элемента. Теперь будем по очереди добавлять объекты в коллекцию. Смотрим программу и пояснения к ней:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Моя_коллекция As New Collection                 'Объявляем и создаем коллекцию


        Моя_коллекция.Add(Label2)                                   'Добавляем в коллекцию 1-й элемент
        Моя_коллекция.Add(TextBox2, "Текстик")             'Добавляем в коллекцию 2-й элемент
        Моя_коллекция.Add(Button2, "Кнопочка")             'Добавляем в коллекцию 3-й элемент


        Debug.WriteLine(Моя_коллекция.Count)                'Печатается  3 - число элементов в коллекции
        Debug.WriteLine(Моя_коллекция(2))                       'Печатаются сведения об объекте TextBox2
        Debug.WriteLine(Моя_коллекция(1).Text)               'Печатается "Label2"
        Моя_коллекция(3).Height = 80                                 'Задается высота кнопки Button2
        Моя_коллекция("Текстик").Width = 100                   'Задается ширина поля TextBox2
        Dim i As Integer
        For i = 2 To 3                                                              'ДЛЯ 2 и 3 объекта
            Debug.WriteLine(Моя_коллекция(i).Top)              'распечатывается вертикальная координата
        Next
        Dim Мой_объект As Control
        For Each
Мой_объект In Моя_коллекция               'ДЛЯ КАЖДОГО объекта В
коллекции:
            Мой_объект.BackColor = Color.Yellow                 'задается желтый цвет
        Next
        For Each Мой_объект In Моя_коллекция                 'ДЛЯ КАЖДОГО объекта В коллекции:
            If TypeName(Мой_объект) = "Button" Then           'если имя типа объекта - Button, то
                Мой_объект.Enabled = False                             'деактивировать ее
            End If
        Next
        Моя_коллекция.Remove(2)                                      'Удаляем из коллекции 2-й элемент
        Моя_коллекция.Remove("Кнопочка")                      'Удаляем из коллекции кнопку
End Sub
Пояснения: У всех коллекций, как экземпляров класса Collection, есть несколько методов, три из них (Add, Remove, Count) я сейчас поясню.


При помощи метода Add мы добавляем в коллекцию элементы. При этом обязательно указывается имя элемента. Также удобно через запятую указать произвольную строку – ключ элемента, по которому можно к нему при желании обращаться, что мы и сделали в двух местах ("Текстик" и "Кнопочка"). Элементы, добавляемые в коллекцию, получают номера в том порядке, в котором их добавляли, начиная с 1 (а не с 0). Обращаться к отдельным элементам коллекции можно по полученному номеру (индексу) прямо как к элементу массива, а можно и по ключу, там, где он задан.
Как видите, здесь для добавления каждого элемента мы использовали отдельный оператор, хотя есть ситуации, когда можно это делать и в цикле.
Метод Count просто сообщает число элементов в коллекции.
Строки процедуры с 6 по 13 иллюстрируют обращение к элементам коллекции по индексу или по ключу, в том числе в цикле.
Чтобы удалить отдельный элемент из коллекции (не с формы), используется метод Remove с указанием индекса или ключа элемента.
Очевидно, что работа с коллекциями напоминает работу с одномерными массивами, в чем-то побогаче ее,  а в чем-то и менее удобна.
В следующем подразделе мы продолжим пояснения нашего примера.

Содержание раздела