Динамическое создание контроллов в VB .NET

Как программно создать объект

Как задать свойства этому объекту

Показать

Например, создаем новую кнопку с текстом «Кнопка»
Способ 1:

Способ 2:

Замечу, что все свойства, что мы не указали явно, будут по умолчанию, например, цвет шрифта, ширина, высота кнопки и т.д.

Как заставить объект «что-то уметь делать»

Показать

Мы должны задать соответствие нашего контролла какому-либо событию.
Для этого создадим простую процедуру:

Она может называться не Btn_Click, а как угодно, но рекомендуется давать процедурам внятные имена, это является хорошим тоном в программировании. Теперь в процедуре создания кнопки мы добавляем код:

Получится следующее:

2 последние строчки могут быть в любом порядке
После Btn. нам будут предложены все уже известные нам события, характерные для кнопки. Почему для кнопки? Потому что мы сами так объявили эти 3 произвольные буквы. Объяви мы их как TextBox, получили бы события, характерные лишь для текстового поля.

Как узнать, в каком объекте было вызвано событие

Показать

Если мы создаем не один, а несколько объектов, например, кнопок, то невозможно описать всевозможные процедуры. Да это и не нужно. Нам просто достаточно добавить нужные параметры в процедуру:

sender — это и есть наша кнопка. Разные кнопки — разный sender. После точки Студия не предложит нам вариантов, так что пишем сами.
Второй параметр e дает информацию о том, ЧТО вызвало событие. В таком примере толку от него мало.

Как удалить обработчик события с объекта

Показать

Немного усложним наш пример. Объявим глобально коллекцию кнопок:

Теперь процедура создания несколько изменилась:

Допустим, нам необходимо, чтобы событие в третьей кнопке более не обрабатывалось. Это сделает код:

С таким же успехом мы можем переопределить событие на другое

Если не удалить первый обработчик, то будут выполняться ОБЕ процедуры.

Как создать форму, аналогичную текущей со всеми свойствами.

Показать

Задача решается аналогично

Аналогично задаются / меняются свойства, события и т.д,. Создание подобных форм можно реализовать, например, в ICQ-клиенте, когда у каждого написавшего сообщение пользователя открывается свое окно, с его сообщениями и другой его персональной информацией.

Я хотел бы подчеркнуть, что хоть мы и пишем

Это вовсе не означает, что у новой формы будет имя «NewForm»
У ней, как и у всех последующих будут все свойства первой формы, в том числе и имя. Поэтому имя всех таких форм — «Form1«, и идентификация формы по ее имени невозможна.

Другое дело, когда мы создаем экземпляр Кнопки «С нуля». У такой кнопки нет ни имени, ни текста на ней. Поэтому все такие экземпляры — безымянны. Если бы мы аналогично создавали и форму, у ней бы так же не было имени.
Создать «одним махом» экземпляр (копию) уже имеющейся кнопки нельзя (а формы — можно)

Итак, мы для идентификации объектов можем использовать их имена (Вспоминаем sender)
Я бы хотел заострить внимание еще на одном свойстве контроллов, оно называется Tag. Его незаслуженно редко используют. Поэтому это еще один козырь, который мы можем использовать не только для идентификации контроллов, но и для хранения практически любой строковой информации.

Создавать новые контроллы мы можем, разумеется, не только на форме, а и на других объектах. Обращаю внимание, что координаты нового контролла будут рассчитываться не относительно формы, а относительно родительского объекта, например, если мы разместим свежеиспеченную кнопку с координатами {0, 0} на PictureBox, расположенного в центре формы, то контролл будет находиться в верхнем левом углу PictureBox, но не формы.

И еще один пример создания кнопки с событием

Используем WihtEvents вместо AddHandler:

 





Запись опубликована в рубрике Полезные коды на Visual Basic .NET, VB .NET FAQ. Добавьте в закладки постоянную ссылку.


Что еще можно почитать

Bad Boys Blue — Pretty Young Girl (Instrumental) (Декабрь 19, 2015)
Автозаполнение TextBox (Декабрь 4, 2015)
Plazma — The Real Song (Remix disco 80’s) (Ноябрь 3, 2015)
Алимханов А. & С. Астор — Fly With Me (Январь 14, 2017)
Не запускается служба Сервер (Декабрь 7, 2015)


Добавить комментарий