Создание коллекции, методы коллекции
Я рассмотрю распространенный случай, когда в коллекцию входят только элементы управления.
Задача: На вашей форме имеется несколько десятков кнопок, меток и текстовых полей, которые делают свое дело, скажем, помогают обрабатывать банковскую информацию. Глядя на них, можно сказать кто принес деньги, сколько принес, в долларах или рублях, сколько денег у него стало, сколько всего в банке денег и т.д. Вам нужно, чтобы иногда, в некоторые моменты выполнения программы, такие-то и такие-то кнопки, метки и текстовые поля из самых разных мест формы (всего, скажем, дюжина объектов) меняли цвет. Ну, скажем, для того, чтобы привлечь к себе ваше внимание. А в какие-нибудь другие моменты эта же самая дюжина должна делать что-нибудь другое, например, все кнопки из этой дюжины должны быть деактивированы, чтобы на них случайно не нажали. И так далее. В общем, эта дюжина иногда должна вести себя по-другому, чем остальные элементы управления.
Решение: Создадим проект. Для простоты разместим на форме только шесть элементов управления: 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 с указанием индекса или ключа элемента.
Очевидно, что работа с коллекциями напоминает работу с одномерными массивами, в чем-то побогаче ее, а в чем-то и менее удобна.
В следующем подразделе мы продолжим пояснения нашего примера.