Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
1

Получение данных из программно созданных контролов

16.02.2017, 11:37. Показов 2466. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1. Получаю запросом из БД в дататейбл данные: "наименование", "тип контрола", "Значение"
2. В цикле для каждого значения программно создаю одину контрол панель, в ней вывожу лейблом "Наименование", создаю в зависимости от типа контрола (полученного запросом) нужный контрол (например текст бокс/чекбокс/комбобокс и т.д.) и вывожу в него "значение"

А вот теперь суть вопроса:

3. Существует кнопка "сохранить", при нажатии на которую необходимо получить "значения" каждого из созданного контрола, а затем подставить в запрос эти данные и сохранить обратно в БД.

-
Помогите с решением для получения данных из программно созданных контролов. Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2017, 11:37
Ответы с готовыми решениями:

Получение данных с программно созданных элементов
Использую следующий код для программного создания DataGridView. Вопрос: Как теперь получить доступ...

Получение данных с программно созданных элементов
Программно создаю DataGridView И загружаю в него данные из базы данных. Вопрос: Как теперь...

Получение данных от созданных кодом элементов
Здравствуйте. Имеется код. который создаёт checkBox-ы. Как получить результат, если пользователь...

Получение данных из динамически созданных edit ов
суть промблемы такая, создаю по нажатию кнопки этид поле, сколько нажму столько и создам, на поле...

26
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 12:40 2
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Public Class Form2
    Private txt As New TextBox
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        txt.Text = "Мой текст"
        txt.Location = New Point(250, 50)
        Me.Controls.Add(txt)
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        MsgBox(Me.txt.text)
    End Sub
End Class
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
16.02.2017, 12:59  [ТС] 3
проблема вся в том что контролы, значения которых необходимо получить создаются и объявляются в процедуре, а не глобально, поэтому и не знаю как до них добраться.
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 13:16 4
Лучший ответ Сообщение было отмечено laaagz как решение

Решение

VB.NET
1
2
3
4
5
6
7
For Each ctl As Control In Me.Controls
If TypeOf c Is TextBox Then
msgbox(ctl.text)
else
'Not TextBox
end if
Next
?

Добавлено через 4 минуты
если нужно урезать список тестбоксов то создавай их с уникальными именами. Например txtCreate1 и тогда..
VB.NET
1
2
3
4
5
6
7
For Each ctl As Control In Me.Controls
If ctl.text.contains("Create") Then
msgbox(ctl.text")
else
'Not TextBox
end if
Next
...Типа того.

Добавлено через 9 минут
Извини. Невнимательный. ctl.Name
1
69 / 59 / 15
Регистрация: 22.10.2012
Сообщений: 314
16.02.2017, 13:40 5
а еще лучше глобально объявить лист например
VB.NET
1
Dim ControlList as new List (Of Control)
потому что на форме могут присутствовать и другие контролы, созданные не программно
и при создании контрола добавлять его в лист а потом использовать как предложил Hell666
VB.NET
1
2
3
For Each c As Control In ControlList 
msgbox(c.type.name & "   " & c.text)
Next
1
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 13:58 6
вариантов много. Не обязателен ListBox. Часть контролов на форме, часть в панелях... имена разные. И тогда все зависит от фантазии.
VB.NET
1
2
3
4
5
6
For Each ctl As Control In Controls
For Each ctl As Control In Panel1.Controls
For Each ctl As Control In Panel2.Controls
.
.
.
Добавлено через 4 минуты
Creating Control Arrays in Visual Basic .NET and Visual C# .NET
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
16.02.2017, 14:12  [ТС] 7
Вариант Hell666 рабочий, единственное что меня смутило, так это количество результатов, слишком много раз прогоняется цикл.
т.е. поясню:

у меня в панели, где я ищу контролы, создались 2 контрола(панели), в каждой есть по 1 текстбоксу. И результатом работы предложенного алгоритма будет получение значений 3 раза (см. скриншот)

VB.NET
1
2
3
4
5
6
7
8
        For Each ctl_panel As Panel In Me.panel_generate_options.Controls '1. тут получаем программно созданные панели
            For Each ctl As Control In ctl_panel.Controls '2. тут получаем программно созданные текстбоксы в каждой программно созданной панели
                If TypeOf ctl Is TextBox Then ' тут получаем значение текстбокса в панели, которая находится
                    MsgBox(ctl.Text)
                Else
                End If
            Next
        Next
У меня есть предположение откуда у меня 3 результата: он прогоняет это для каждого контрола (2 лейбла и один текстбокс) в каждой панели.

Если есть другой вариант, то каждому текстбоксу во время создания в цикле присваивается имя
VB.NET
1
option_box.Name = "option_box_" & i
Миниатюры
Получение данных из программно созданных контролов  
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 14:21 8
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Module Module1
    Friend mytxt() As TextBox
    Friend Sub GetText()
        Dim Array_Size As Integer = 5
        ReDim mytxt(Array_Size)
        For i = 0 To Array_Size
            mytxt(i) = New TextBox
            mytxt(i).Text = "Text Box " + i.ToString
            mytxt(i).Top = 20 * i
            Form1.Controls.Add(mytxt(i))
        Next
    End Sub
End Module
VB.NET
1
2
3
4
5
6
7
8
9
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Module1.GetText()
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        MsgBox(Module1.mytxt(2).Text)
    End Sub
End Class
Миниатюры
Получение данных из программно созданных контролов  
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 14:35 9
Подозреваю что не надо столько for each. Достаточно одно и внутри условие.

Добавлено через 8 минут
VB.NET
1
2
3
4
5
6
For Each ctl As Controls In Me.panel_generate_options.Controls
                If TypeOf ctl Is TextBox Then ' тут получаем значение текстбокса в панели, которая находится
                    MsgBox(ctl.Text)
                Else
                end if
next
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
16.02.2017, 14:42  [ТС] 10
он не находит тексбоксы, т.к. там находятся панели, внутри которых он не ищет.
Отсюда и родился у меня второй For Each
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 14:54 11
так... Панели внутри панели? Или что? Обращайся напрямую... Панель1.Панель2.Панель3....Controls В чем не ищет?
Создай в модуле массив
VB.NET
1
Friend mytxt() As TextBox
и сами контролы и обращайся к ним из формы напрямую
VB.NET
1
MsgBox(Module1.mytxt(2).Text)
Добавлено через 9 минут
Создавай контролы в модуле как Friends а потом обращайся к ним по индексу как к массиву напрямую из формы.
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 15:00 12
VB.NET
1
2
3
For Each ctl As Control In Panel3.Controls
            MsgBox(ctl.Name)
        Next
панель3 в панели2 которая в панели1. Ничто не мешает получильть текстбокс3?
Миниатюры
Получение данных из программно созданных контролов  
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 15:19 13
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Module Module1
    Friend mytxt() As TextBox
    Friend mypanel() As Panel
Friend Sub GetText()
        Dim Array_Panel As Integer = 0
        ReDim mypanel(Array_Panel)
        For i = 0 To Array_Panel
            mypanel(i) = New Panel
            mypanel(i).Top = 20
            mypanel(i).BorderStyle = BorderStyle.FixedSingle
            Form1.Panel1.Controls.Add(mypanel(i))
        Next
        Dim Array_Size As Integer = 3
        ReDim mytxt(Array_Size)
        For i = 0 To 3
            mytxt(i) = New TextBox
            mytxt(i).Text = "Text Box " + i.ToString
            mytxt(i).Top = 20 * i
            mypanel(0).Controls.Add(mytxt(i))
        Next
End Sub
VB.NET
1
2
3
4
5
6
7
8
9
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Module1.GetText()
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        MsgBox(Module1.mytxt(2).Text)
    End Sub
End Class
Миниатюры
Получение данных из программно созданных контролов  
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 16:33 14
Получение тестбокса созданного программно в панели созданной программно.

Добавлено через 1 час 3 минуты
Panel(i) и TextBox(i) объявляются в модуле как Friend переменные и к ним можно обращаться напрямую избегая Panel(i).TextBox(i)
Module1.Panel(0)
Module1.TextBox(0)...
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
16.02.2017, 16:41  [ТС] 15
Пробую через модуль это все провернуть...пока ерроры и пустые значения, хотя дататебл заполнился.
Отпишусь как будет результат. Спасибо за подсказки.
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 16:43 16
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Module Module1
    Friend mytxt() As TextBox
    Friend mypanel() As Panel
    Friend Sub GetText()
        Dim Array_Panel As Integer = 1
        ReDim mypanel(Array_Panel)
        For i = 0 To Array_Panel
            mypanel(i) = New Panel
            mypanel(i).Top = 20 * i * 5
            mypanel(i).BorderStyle = BorderStyle.FixedSingle
            mypanel(i).Tag = "Абракадабра"
            Form1.Panel1.Controls.Add(mypanel(i))
        Next
 
        Dim Array_Size As Integer = 3
        ReDim mytxt(Array_Size)
        For i = 0 To 3
            mytxt(i) = New TextBox
            mytxt(i).Text = "Text Box " + i.ToString
            mytxt(i).Top = 20 * i
            mypanel(1).Controls.Add(mytxt(i))
        Next
    End Sub
VB.NET
1
2
3
4
5
6
7
8
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Module1.GetText()
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        MsgBox(mypanel(0).Tag)
    End Sub
Миниатюры
Получение данных из программно созданных контролов  
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 16:46 17
Через модуль удобнее всего. Если бы ты дал полный код создания контролов (что в чем и где) может лучше смог бы помочь. А так... Варианты.
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
16.02.2017, 16:54  [ТС] 18
Я создаю их так, мб и топорно, но так как сумел)
VB.NET
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
Private Sub load_options_from_type()
        Dim OleReader As OleDb.OleDbDataReader
        If LoginForm.Dbcon.State <> ConnectionState.Open Then LoginForm.Dbcon.Open()
        Dim load_dgv As New OleDb.OleDbCommand
        load_dgv = New OleDb.OleDbCommand("SELECT        dbo.sp_KE_options.id, dbo.sp_KE_options.option_name, dbo.sp_KE_option_type.data_number,id_ke_option_type
                                            FROM            dbo.sp_KE_options INNER JOIN
                                                                     dbo.sp_KE_option_type ON dbo.sp_KE_options.id_ke_option_type = dbo.sp_KE_option_type.id
                                            WHERE        (dbo.sp_KE_options.activ = 1) AND (dbo.sp_KE_options.id_ke_type  =" & cb_type.SelectedValue & ")", LoginForm.Dbcon)
        load_dgv.CommandType = CommandType.Text
        load_dgv.CommandTimeout = 9999
        Try
            options_dt.Clear()
            OleReader = load_dgv.ExecuteReader
            options_dt.Load(OleReader)
            '========================
            panel_generate_options.Controls.Clear()
            For i = 0 To options_dt.Rows.Count - 1
                Dim option_panel As New System.Windows.Forms.Panel
                option_panel.Parent = panel_generate_options
                option_panel.BorderStyle = BorderStyle.FixedSingle
                option_panel.Size = New Size(540, 29)
                option_panel.BackColor = Color.FromArgb(62, 62, 62)
                option_panel.Name = "options_panel_" & i
 
                Dim option_label_id As New System.Windows.Forms.Label
                option_label_id.Parent = option_panel
                option_label_id.Size = New Size(40, 26)
                option_label_id.Top = 6
                option_label_id.Anchor = AnchorStyles.Left
                option_label_id.Font = New Font("Microsoft Sans Serif", 7.25)
                option_label_id.ForeColor = Color.FromArgb(182, 182, 182)
                option_label_id.BackColor = Color.FromArgb(62, 62, 62)
                option_label_id.Name = "options_label_id_" & i
                option_label_id.Text = options_dt.Rows.Item(i).Item(0).ToString
 
                Dim option_label_name As New System.Windows.Forms.Label
                option_label_name.Parent = option_panel
                option_label_name.Left = 42
                option_label_name.Top = 6
                option_label_name.Size = New Size(180, 26)
                option_label_name.Anchor = AnchorStyles.Left
                option_label_name.Font = New Font("Microsoft Sans Serif", 7.25)
                option_label_name.ForeColor = Color.FromArgb(182, 182, 182)
                option_label_name.BackColor = Color.FromArgb(62, 62, 62)
                option_label_name.Name = "options_label_name_" & i
                option_label_name.Text = options_dt.Rows.Item(i).Item(1).ToString
 
                '-- Какой контрол создать для параметра:
                '-- неизвестно - ничего
                'id options_type_name
                '1   SDT - дейттаймпикер
                '2   varchar - текстбокс
                '3   int - маскедтекстбокс
                '4   bit - чекбокс
                '5   numeric - маскедтекстбокс
                '6   varbinary - опенфайлдиалог
                '7   id - комбобокс
 
                If IsDBNull(options_dt.Rows.Item(i).Item(3)) Then
                    MessageBox.Show("Невозможно определить тип данных для параметра «" & options_dt.Rows.Item(i).Item(1).ToString & "»", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Else
                    If options_dt.Rows.Item(i).Item(3) = 1 Then
                        Dim option_box As New System.Windows.Forms.DateTimePicker
                        option_box.Parent = option_panel
                        option_box.Size = New Size(300, 26)
                        option_box.Top = 3
                        option_box.Left = 224
                        option_box.Format = DateTimePickerFormat.Custom
                        option_box.CustomFormat = "dd.MM.yyyy"
                        option_box.Name = "options_box_" & i
 
                    ElseIf options_dt.Rows.Item(i).Item(3) = 2 Then
                        Dim option_box As New System.Windows.Forms.TextBox
                        option_box.Parent = option_panel
                        option_box.Size = New Size(300, 26)
                        option_box.Top = 4
                        option_box.Left = 224
                        option_box.Text = ""
                        option_box.Font = New Font("Microsoft Sans Serif", 7.25)
                        'option_box.ForeColor = Color.FromArgb(182, 182, 182)
                        'option_box.BackColor = Color.FromArgb(62, 62, 62)
                        option_box.Name = "options_box_" & i
 
                    ElseIf options_dt.Rows.Item(i).Item(3) = 3 Then
                        Dim option_box As New System.Windows.Forms.MaskedTextBox
                        option_box.Parent = option_panel
                        option_box.Size = New Size(300, 26)
                        option_box.Top = 4
                        option_box.Left = 224
                        option_box.Mask = "0000000000"
                        option_box.Text = ""
                        option_box.Font = New Font("Microsoft Sans Serif", 7.25)
                        option_box.Name = "options_box_" & i
 
                    ElseIf options_dt.Rows.Item(i).Item(3) = 4 Then
                        Dim option_box As New System.Windows.Forms.CheckBox
                        option_box.Parent = option_panel
                        option_box.Size = New Size(300, 26)
                        option_box.Top = 1
                        option_box.Left = 224
                        option_box.Checked = False
                        option_box.Name = "options_box_" & i
 
                    ElseIf options_dt.Rows.Item(i).Item(3) = 5 Then
                        Dim option_box As New System.Windows.Forms.MaskedTextBox
                        option_box.Parent = option_panel
                        option_box.Size = New Size(300, 26)
                        option_box.Top = 4
                        option_box.Left = 224
                        option_box.Mask = "0000000000,00"
                        option_box.Text = ""
                        option_box.Font = New Font("Microsoft Sans Serif", 7.25)
                        option_box.Name = "options_box_" & i
 
                    ElseIf options_dt.Rows.Item(i).Item(3) = 6 Then
                        Dim option_box As New System.Windows.Forms.Button
                        option_box.Parent = option_panel
                        option_box.Size = New Size(300, 26)
                        option_box.Top = 3
                        option_box.Left = 224
                        option_box.Text = "Загрузить"
                        option_box.Font = New Font("Microsoft Sans Serif", 7.25)
                        option_box.Name = "options_box_" & i
 
                    ElseIf options_dt.Rows.Item(i).Item(3) = 7 Then
                        Dim option_box As New System.Windows.Forms.ComboBox
                        option_box.Parent = option_panel
                        option_box.Size = New Size(300, 26)
                        option_box.Top = 3
                        option_box.Left = 224
                        option_box.SelectedIndex = -1
                        option_box.Font = New Font("Microsoft Sans Serif", 7.25)
                        option_box.Name = "options_box_" & i
 
                    Else
                        MessageBox.Show("Невозможно определить тип данных для параметра «" & options_dt.Rows.Item(i).Item(1).ToString & "»", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End If
 
                End If
           Next i
            panel_generate_options.Visible = True
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
        If LoginForm.Dbcon.State <> ConnectionState.Closed Then LoginForm.Dbcon.Close()
        load_dgv = Nothing
        OleReader = Nothing
    End Sub
0
128 / 53 / 9
Регистрация: 11.02.2017
Сообщений: 265
16.02.2017, 17:03 19
Извини. Я вижу где они объявляются, а где добавляются и во что?
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
16.02.2017, 17:08  [ТС] 20
Например тут:
VB.NET
1
2
Dim option_panel As New System.Windows.Forms.Panel
                option_panel.Parent = panel_generate_options
создаю.
привязываю через Parent к панеле panel_generate_options созданной в дезигнере. она постоянна
дальше с другими контролами по аналогии.


ну и как результат все создается и отображается так как мне надо, скриншот выше был.
т.е. на форме есть панель с названием panel_generate_options. По событию вызываю функцию load_options_from_type() из поста выше.
функция генерирует и отрисовывает контролы
0
16.02.2017, 17:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2017, 17:08
Помогаю со студенческими работами здесь

Изменение программно созданных TextBox по событию программно созданного CheckBox
Помогите пожалуйста! мне нужно разрешить изменение полей всех TextBox и разрешить нажимать на...

Удаление динамически созданных контролов
Доброго времени суток. Мне нужно удалить из папки картинку, на которую ссылается один из дочерних...

Можно ли обеспечить взаимодействие программно созданных объектов и объектов, созданных мастером
Здравствуйте. Изучаю C# и ADO.NET и столкнулся с одной серьезной проблемой, которая мешает...

Некорректное отображение контролов созданных в редакторе ресурсов
Привет знатокам, может кто сталкивался. Проблема следующая. В редакторе ресурсов Resource editor...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru