Добрый день.
Периодически мучаю тему с созданием элементов управления динамически.
И все вполне годно получается, но есть одна большая проблема. А именно, как обработать события от этих контролов при этом не добавляя каждый раз ручками код обработчика событий допустим в форму-контейнер для этого динамического контрола.
Чувствую что надо чтото мудрить с классами и интерфейсами но в этом не очень силен. Может кто подскажет фаблон решения?
Вот код для создаваемого PictureBox
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
'Добавляем программмно в проект новый PictureBox
'Ползунок выбора значения
Public Sub CreateNewPictureBox(ByVal iName As String, _
ByVal ParentForm As Object, _
ByVal LocationX As Integer, _
ByVal LocationY As Integer, _
ByVal TBWidth As Integer, _
ByVal TBHeight As Integer, _
ByRef oPictureBox As PictureBox)
Dim iPictureBox As New PictureBox ' НОВЫЙ элемент DataGridView
oPictureBox = iPictureBox
If CreateControlWithName(ParentForm, iName) = False Then
AddHandler iPictureBox.SizeChanged, AddressOf ParentForm.iPictureBox_SizeChanged
AddHandler iPictureBox.Click, AddressOf ParentForm.iPictureBox_Click
AddHandler iPictureBox.MouseMove, AddressOf ParentForm.iPictureBox_MouseMove
AddHandler iPictureBox.MouseDown, AddressOf ParentForm.iPictureBox_MouseDown
AddHandler iPictureBox.MouseUp, AddressOf ParentForm.iPictureBox_MouseUp
ParentForm.Controls.Add(iPictureBox)
Else
End If
iPictureBox.Name = iName
iPictureBox.Location = New System.Drawing.Point(LocationX, LocationY)
iPictureBox.Size = New System.Drawing.Size(TBWidth, TBHeight)
End Sub
Для Form
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
'Добавляем программно в проект новую форму
Public Sub CreateNewFORM(ByVal Name As String, _
ByVal Text As String, _
ByVal Width As Integer, _
ByVal Height As Integer, _
ByVal Local_X As Integer, _
ByVal Local_Y As Integer, _
ByVal TextColor_R As Integer, _
ByVal TextColor_G As Integer, _
ByVal TextColor_B As Integer, _
ByVal BackColor_R As Integer, _
ByVal BackColor_G As Integer, _
ByVal BackColor_B As Integer, _
ByVal iMinimizeBox As Boolean, _
ByVal iMaximizeBox As Boolean, _
ByVal ParentForm As Form, _
ByRef oForm As Form)
Dim iForm As New System.Windows.Forms.Form
iForm.Name = String.Format("Form{0}", Name)
If ParentForm.IsMdiContainer Then iForm.MdiParent = ParentForm
iForm.Show()
oForm = iForm
'размеры формы
iForm.Size = New System.Drawing.Size(Width, Height)
'iForm.Width = Width
'iForm.Height = Height
'координаты расположения формы
iForm.Location = New System.Drawing.Point(Local_X, Local_Y)
'iForm.Top = Local_X
'iForm.Left = Local_Y
'озаглавливание текста
iForm.Text = Text
'убираем иконку формы
iForm.ShowIcon = False
'задаём цвет текста в форме при помощи компонентов RGB
iForm.ForeColor = Color.FromArgb(TextColor_R, TextColor_G, TextColor_B)
'задаём цвет формы при помощи компонентов RGB
iForm.BackColor = Color.FromArgb(BackColor_R, BackColor_G, BackColor_B)
'определяем наличие кнопки минимизации формы
iForm.MinimizeBox = iMinimizeBox
'определяем наличие кнопки минимизации формы
iForm.MaximizeBox = iMaximizeBox
'AddHandler iForm.Resize, AddressOf FormSDM_Resize
End Sub
Сначала создаётся Form а потом на неё добавляется PictureBox.
Раньше я добавлял текст кода обработчика событий в Form который создавал сам же руками.
В выше описанном случае я так сделать не могу.
Хочется чтобы весь код лежал в одном универсальном модуле или классе...
Вот код обработчика событий для PictureBox который я добавляю вручную.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#Region "События iPictureBox"
Public Sub iPictureBox_Click(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles oPictureBox.Click
End Sub
Public Sub iPictureBox_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) ' Handles MyBase.Resize
End Sub
Public Sub iPictureBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) ' Handles PictureBox1.MouseMove
End Sub
Public Sub iPictureBox_MouseDown(ByVal sender As Object, ByVal e As System.EventArgs) ' Handles PictureBox1.MouseDown
End Sub
Public Sub iPictureBox_MouseUp(ByVal sender As Object, ByVal e As System.EventArgs) ' Handles PictureBox1.MouseUp
End Sub
#End Region
Модератор: Тема перенесена из форума "Visual Basic".