MyTetra Share
Делитесь знаниями!
Динамическое создание контроллов в VB .NET
23.03.2018
22:37
Текстовые метки: VB .NET
Раздел: VB

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

Опубликовано Январь 1, 2016 автором Памирыч

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


Visual Basic .NET

        Dim Tb As New TextBox

        Me.Controls.Add(Tb)

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

Показать

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


Visual Basic .NET

1

2

3

4

5

6

7

        Dim Btn As New Button

        With Btn

            .Top = 10

            .Left = 20

            .Text = "Кнопка"

        End With

        Me.Controls.Add(Btn)

Способ 2:


Visual Basic .NET

1

2

        Dim Btn As New Button With {.Top = 10, .Left = 20, .Text = "Кнопка"}

        Me.Controls.Add(Btn)

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

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

Показать

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


Visual Basic .NET

1

2

3

    Sub Btn_Click()

        MsgBox("Вы щелкнули по созданной Вами кнопке")

    End Sub

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


Visual Basic .NET

1

AddHandler Btn.Click, AddressOf Btn_Click

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


Visual Basic .NET

1

2

3

        Dim Btn As New Button With {.Top = 10, .Left = 20, .Text = "Кнопка"}

        AddHandler Btn.Click, AddressOf Btn_Click

        Me.Controls.Add(Btn)

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

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

Показать

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


Visual Basic .NET

1

Sub Btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)


Visual Basic .NET

1

2

3

4

5

6

7

8

9

10

11

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

        Static Ind As Integer 'Статическая переменная-счетчик

        Dim Btn As New Button With {.Top = Ind * 25, .Text = "Кнопка " & Ind}

        AddHandler Btn.Click, AddressOf Btn_Click 'Привязываем кнопку к событию

        Me.Controls.Add(Btn) 'Показываем кнопку

        Ind += 1 'Увеличиваем счетчик на единицу

    End Sub

    Sub Btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)

        MsgBox("Вы щелкнули по кнопке " & sender.Text & "; Top = " & sender.Top & "; Left = " & sender.Left)

    End Sub

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

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

Показать

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


Visual Basic .NET

1

    Dim Btn As New List(Of Button)

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


Visual Basic .NET

1

2

3

4

5

6

        Static Ind As Integer 'Статическая переменная-счетчик

        Dim _Btn As New Button With {.Top = Ind * 25, .Text = "Кнопка " & Ind}

        AddHandler _Btn.Click, AddressOf Btn_Click 'Привязываем кнопку к событию

        Me.Controls.Add(_Btn) 'Показываем кнопку

        Ind += 1 'Увеличиваем счетчик на единицу

        Btn.Add(_Btn) 'Добавляем кнопку в коллекцию

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


Visual Basic .NET

1

        RemoveHandler Btn(2).Click, AddressOf Btn_Click

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


Visual Basic .NET

1

2

        RemoveHandler Btn(2).Click, AddressOf Btn_Click

        AddHandler Btn(2).Click, AddressOf Other_Click

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

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

Показать

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


Visual Basic .NET

1

2

        Dim NewForm As New Form1

        NewForm.ShowDialog()

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

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


Visual Basic .NET

1

        Dim NewForm As New Form1

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

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

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

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

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

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


Visual Basic .NET

1

2

3

4

5

6

7

8

9

10

11

    Dim WithEvents MyEvents As New Button

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

        Dim Btn As New Button With {.Text = "Button"}

        MyEvents = Btn

        Me.Controls.Add(Btn)

    End Sub

    Sub MyNewButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyEvents.Click

        MsgBox("Hello, World!")

    End Sub

 

Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования