netlib.narod.ru< Назад | Оглавление | Далее >

Дочерние элементы формы

Класс Control содержит весьма полезное и удобное неизменяемое свойство Controls:


Свойства Control (выборочно)



Тип Свойство Доступ

Control.ControlCollection Controls Чтение


Хотя свойство Controls определено в классе Control, его полезность проявляется только в классах-наследниках Control, являющихся родительскими для других элементов управления, например Form. Тип Control.ControlCollection, определенный для этого свойства, может выглядеть немного экзотически, но на самом деле это просто открытый класс ControlCollection, определенный в классе Control. В программе не нужно ссылаться на имя этого класса — только на свойство Controls.

Нечто подобное вы уже видели в конце главы 11. Класс ImageList содержит свойство Images типа ImageList.ImageCollection. А в главе 14 вы увидите, что класс Menu содержит свойство MenuItems типа Menu.MenuItemCollection.

Класс Control.ControlCollection реализует интерфейсы IList, ICollection и IEnumerable (определенные в пространстве имен System.Collections). В результате свойство Controls представляет собой гибкий массив (в точности как класс ArrayList, рассмотренный в конце главы 8), в который можно добавлять элементы и удалять их. По сути свойство Controls является массивом всех дочерних элементов управления формы.

Допустим, вы создали три кнопки, btn1, btn2 и btn3. Вы делаете эти кнопки дочерними элементами формы так:

  btnl.Parent = this;
  btn2.Parent = this;
  btn3.Parent = this;

После исполнения этих инструкций можно получить количество дочерних элементов управления, используя свойство Count свойства Controls формы. Если эти кнопки — единственные дочерние элементы формы, выражение:

  Controls.Count

вернет 3. Для доступа к свойству Controls можно использовать индекс, как и для массива. Возвращаемый объект имеет тип Control. Так, инструкция:

  Control Ctrl = Controls[1];

запишет в перемененную Ctrl объект btn2. Если вы знаете, что элемент управления является кнопкой, можно привести возвращаемое значение к типу Button:

  Button btn = (Button)Controls[1];

Обращение по индексу допускает только чтение. Вам не удастся сделать что-то вроде:

  Controls[1] = new Button(); // Не выполнится!

Дочерние элементы управления попадают в класс Control.ControlCollection автоматически, как только они становятся дочерними элементами формы. Кроме того, поместить элемент управления в этот набор можно одним из двух следующих методов:


Методы Control.ControlCollection (выборочно)



void Add(Control Ctrl)
void AddRange(Control[] actrl)


На первый взгляд выражение:

  Controls.Add(btn1);

выглядит, как вызов статического метода Add из класса Controls. Это не так! Controls — это свойство Form, унаследованное от Control. Тип этого свойства — Control.ControlCollection, т.е. класс, в котором определен метод Add. Вызов метода Add эквивалентен:

  btn1.Parent = this;

Выражение:

  Controls.AddRange(new Control[] { btnl, btn2, btn3 });

эквивалентно трем приведенным ранее инструкциям, в которых устанавливалось свойство Parent кнопок. Кстати, очевидно, что выражение AddRange было бы короче, если бы три кнопки находились в массиве.

Можно удалять элементы управления из набора:


Методы Control.ControlCollection (выборочно)



void Remove(Control сtrl)
void RemoveAt(int iIndex)
void Clear()


Удаление элемента из набора не уничтожает его. Это эквивалентно присваиванию свойству Parent этого элемента значения null. Метод Clear удаляет все элементы управления из набора.

При удалении элемента оставшиеся элементы управления переиндексируются так, что пустых мест не остается. Пропущенных индексов никогда не бывает — индексы всегда находятся в диапазоне от 0 до Count–1.

Можно получить индекс конкретного элемента управления:


Методы Control.ControlCollection (выборочно)



bool Contains(Control ctrl)
int GetChildIndex(Control ctrl)
int GetChildIndex(Control ctrl, bool bThrowException)


Перед вызовом GetChildIndex уместно вызвать метод Contains, чтобы выяснить, содержит ли набор этот элемент управления. Если нет, первая версия GetChildIndex генерирует исключение. Вторая версия не генерирует исключение, если значение параметра bThrowExceptionравно false. Если элемент не содержится в наборе, метод возвращает –1.

Можно присвоить элементу управления новый индекс:


Методы Control.ControlCollection (выборочно)



void SetChildIndex(Control Ctrl, int iNewIndex)


Здесь тоже остальные элементы переиндексируются так, что индексы идут последовательно, от 0 до числа, на единицу меньшего количества элементов. Если хотите присвоить элементу управления максимальный индекс, укажите в параметре iNewIndex –1.

Зачем менять индексы в наборе элементов управления? А затем, что индексы служат не только для простого доступа к элементам управления — они также определяют Z-порядок элементов управления.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz