194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
1

Как обратиться к ComboBox'у если его нет на форме, он создается програмно

28.02.2012, 18:28. Показов 1813. Ответов 14
Метки нет (Все метки)

Всем привет.

Вот встала такая проблема. В результате выполнения программы создаются 10 комбобоксов, им присваиваются имена комбобокс1,2,3 и т.д. Вот как считать информацию с этих боксов из другой процедуры ?

К примеру есть две кнопки, по нажатию на первую создается програмно 1 комбобокс, туда вводятся данные, а при нажатии на вторую кнопку текст из комбобокса к примеру копируется в текстбокс.

Вот кусок кода над которым можно изголяться:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Class Form1
  
    Dim comboboxes() As ComboBox = New ComboBox(10) {}
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                                        Handles MyBase.Load
        For i = 0 To 10
            comboboxes(i) = New ComboBox()
            comboboxes(i).Location = New Point(250, 30 * i + 200)
            comboboxes(i).Name = "combobox" & (i)
            Me.Controls.Add(comboboxes(i))
        Next
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                                         Handles Button1.Click
         'а вот здесь к примеру так 
                 TextBox1.text = ComboBox1.text
         'только вот проблема, комбобокса еще нету а мы в другой процедуре...
    End Sub
End Class
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2012, 18:28
Ответы с готовыми решениями:

Как програмно встанет label под бутон цветка на второй форме, если изменились эти свойства
Здравствуйте, не знаю, как точно объяснить, так что скажу, что должно быть: В проекте две формы,...

Если открыть файл на другом компе, на форме пропадает listview, т.к. изначально его нет в additional controls
Есть готовый файл экселя с формами и компонентами на ней. При разработке был использован элемент...

Как обратиться к элементу формы, если его имя содержит квадратные скобки?
Если есть форма, в которой присутствуют такие элементы: Как мне к ним обратиться при нажатии на...

Как обратиться к значению элемента массива по номеру в массиве и проверить его на четность, если я чайник?)
Здравствуйте, форумчане! Палками не кидайтесь! Есть задача: Дан массив, состоящий из целых...

14
Почетный модератор
21367 / 9101 / 1082
Регистрация: 11.04.2010
Сообщений: 11,014
28.02.2012, 18:46 2
kOS_77, принцип можно понять на примере отсюда:
https://www.cyberforum.ru/post1973341.html
1
194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
28.02.2012, 19:01  [ТС] 3
Цитата Сообщение от Памирыч Посмотреть сообщение
kOS_77, принцип можно понять на примере отсюда:
https://www.cyberforum.ru/post1973341.html
Все работает, только не пойму как
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
 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
' MyNewButton с потолка взялась или ... ?
        MsgBox("Hello, World!")
    End Sub
0
Почетный модератор
21367 / 9101 / 1082
Регистрация: 11.04.2010
Сообщений: 11,014
28.02.2012, 19:32 4
kOS_77, если говорить проще, то первой строкой мы и "учим" кнопку что-то делать.
Какую - пока неизвестно, но в строчке
VB.NET
1
MyEvents = Btn
Мы определяем, что это наша динамически созданная кнопка.
VB.NET
1
MyNewButton_Click
Это придумано от балды, но так будет правильнее, чтобы было видно, что это за процедура.
Соль в
VB.NET
1
Handles MyEvents.Click
Поскольку мы уже писали
VB.NET
1
MyEvents = Btn
То это и будет одно из событий кнопки.
Мы объявили MyEvents как New Button
И получили события именно кнопки. Объявили бы как текстбокс - были бы события текстбокса, но у нас создается кнопка, поэтому так.

Сигнатура
VB.NET
1
ByVal sender As System.Object, ByVal e As System.EventArgs
Должна быть такой же, как в событии клика.
Будь событие Драг-дроп, подпись была бы другая
VB.NET
1
ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs
Ну и после Handles - тоже другое. Но нам нужен клик, поэтому опять же, все так как есть.
1
194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
28.02.2012, 19:35  [ТС] 5
А в варианте с 5 созданными кнопками как мне обратиться к примеру к 3ей ?
0
465 / 179 / 15
Регистрация: 25.02.2012
Сообщений: 416
Записей в блоге: 2
28.02.2012, 19:44 6
Можно по разному:
VB.NET
1
2
comboboxes(3).Text
Me.Controls("combobox" & 3).Text
1
194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
28.02.2012, 19:46  [ТС] 7
Всем спасибо огромное !
0
Почетный модератор
21367 / 9101 / 1082
Регистрация: 11.04.2010
Сообщений: 11,014
28.02.2012, 19:54 8
Цитата Сообщение от kOS_77 Посмотреть сообщение
как мне обратиться к примеру к 3ей
за это отвечает sender. Это и есть кнопка. Если ты при создании давал кнопкам разные имена (что и должно быть) то написав
sender.Name
Это и будет имя кнопки.

VB.NET
1
sender.BackColor = Color.Red
Закрасит нажатую кнопку в красный цвет
В FAQ это тоже расписано
1
194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
29.02.2012, 01:22  [ТС] 9
Блин, уже всю голову сломал... не могу понять где что не так...


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
       
    Sub CheckedListBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles CheckedListBox1.LostFocus
        Dim lab() As Label = New Label(CheckedListBox1.CheckedItems.Count) {}
        For i = 0 To CheckedListBox1.CheckedItems.Count - 1
            lab(i) = New Label()
            lab(i).Location = New Point(217, 30 * i + 230)
            lab(i).Name = CheckedListBox1.CheckedItems(i)
            lab(i).Text = CheckedListBox1.CheckedItems(i)
            Me.TabPage5.Controls.Add(lab(i))
        Next
        Dim CBox() As ComboBox = New ComboBox(CheckedListBox1.CheckedItems.Count) {}
        For i = 0 To CheckedListBox1.CheckedItems.Count - 1
            CBox(i) = New ComboBox()
            CBox(i).Width = (500)
            CBox(i).Location = New Point(368, 30 * i + 230)
            Dim Ячейка As Integer = 1
            Do Until Exc.Range("F" & Ячейка).Value Is Nothing
                CBox(i).Items.Add(Exc.Range("F" & Ячейка).Value)
                Ячейка += 1
            Loop     'до тех пор пока следующая ячейка не будет пустой
            CBox(i).Name = "CBox" & (i)
            Me.TabPage5.Controls.Add(CBox(i))
        Next
    End Sub
 
    
    Public Sub Кнопка_Создать_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Кнопка_Создать.Click
        For i As Integer = 1 To CheckedListBox1.CheckedItems.Count
            Dim ИмяЛиста As String = CheckedListBox1.CheckedItems(i - 1)
            With Exc
                .sheets(ИмяЛиста).activate()
                .range("AV12").value = (Format(DateTimePicker3.Value, "d" & "." & "MM" & "." & "yyyy")) ' дата составления документов
                .range("C28").value = DateTimePicker1.Value.Day 'Командировка с "Число"
                .range("G28").value = (Format(DateTimePicker1.Value, "dd MMMM").Remove(0, 3)) 'Командировка с "Месяц"
                .range("U28").value = (Format(DateTimePicker1.Value, "yy")) 'Командировка с "год"
                .range("AD28").value = DateTimePicker2.Value.Day 'Командировка по "Число"
                .range("AH28").value = (Format(DateTimePicker2.Value, "dd MMMM").Remove(0, 3)) 'Командировка по "Месяц"
                .range("AV28").value = (Format(DateTimePicker2.Value, "yy")) 'Командировка по "год"
                .range("C26").value = TextBox1.Text 'Количество суток
                For s As Integer = 1 To CheckedListBox1.CheckedItems.Count
                   .range("D23").value = sender.cbox(s).text '!!! ВОТ ТУТ ВСЕ ИЗ ЗА ЭТОЙ СТРОЧКИ !!!
                Next
            End With
        Next
    End Sub
0
465 / 179 / 15
Регистрация: 25.02.2012
Сообщений: 416
Записей в блоге: 2
29.02.2012, 06:51 10
Какие проблемы?
0
194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
29.02.2012, 19:58  [ТС] 11
Вот рассмотрим простой вариант - форма, на ней кнопка, которая при нажатии создает еще 5 кнопок, им присваиваются имена - btn1 - btn5. Локальная переменная Кнопка не массив, и использовать как массив не дает. После создания кнопок, эта переменная хранит в себе информацию только о последней созданной кнопке. Обработчик события реагирует на нажатии последней кнопки. Если сделать одну кнопку то все превосходно работает.

Вот как мне обратиться к 3 кнопке, если ее имя - btn3 -я это знаю, а обратиться к ней не могу так как ее нет на форме. Переменная Кнопка знает только Btn5...

Вот простой код:
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
Public Class Form1
    Dim WithEvents Кнопка As New Button
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        For i As Integer = 1 To 5
            Dim Btn As Button = New Button
            Кнопка = Btn
            Btn.Location = New Point(50, 50 * i + 100)
            Btn.Name = "Btn" & (i)
            Btn.Text = Btn.Name
            Me.Controls.Add(Btn)
        Next
    End Sub
 
    Sub Создание_Кнопки(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Кнопка.HandleCreated
        MsgBox("Я создалась ! Меня зовут -    " & Кнопка.Name)
    End Sub
 
    Sub MyNewButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Кнопка.Click
        MsgBox("Меня зовут  -   " & sender.Name)
    End Sub
 
End Class
0
465 / 179 / 15
Регистрация: 25.02.2012
Сообщений: 416
Записей в блоге: 2
01.03.2012, 17:25 12
А если так:
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
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        For i As Integer = 1 To 5
            Dim Btn As Button = New Button
            Btn.Location = New Point(50, 50 * i + 100)
            Btn.Name = "Btn" & (i)
            Btn.Text = Btn.Name
            AddHandler Btn.Click, MyNewButton_Click
            AddHandler Btn.HandleCreated, Создание_Кнопки
            Me.Controls.Add(Btn)
        Next
    End Sub
 
    Sub Создание_Кнопки(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MsgBox("Я создалась ! Меня зовут -    " & sender.Name)
    End Sub
 
    Sub MyNewButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MsgBox("Меня зовут  -   " & sender.Name)
    End Sub
 
End Class
1
194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
01.03.2012, 18:13  [ТС] 13
Цитата Сообщение от coderxx Посмотреть сообщение
А если так:
Да, супер все работает, только вот один вопрос. Я создаю еще одну кнопку на форме, и хочу чтобы при нажатии на эту кнопку к примеру у btn3 менялся текст на кнопке с "btn3" на... к примеру "я кнопка". Как мне обратиться именно к одной btn3 ?
0
465 / 179 / 15
Регистрация: 25.02.2012
Сообщений: 416
Записей в блоге: 2
01.03.2012, 19:12 14
Так:
VB.NET
1
Me.Controls("btn3").Text = "я кнопка"
1
194 / 186 / 9
Регистрация: 14.06.2011
Сообщений: 495
01.03.2012, 19:41  [ТС] 15
Супер, спасибо огромное, очень помог !
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2012, 19:41
Помогаю со студенческими работами здесь

Как создать проект MFC если его нет в студии? Как расширить студию?
Парни, надо напрогать в проекте MFC окно, клац в свою студию - а у меня только винапи и с/с++/с# ?...

Как изучить работу с ком-портом, если его нет
Добрый вечер, уважаемые. Поступило задание от руководства: научиться работать с ком-портом. Можно...

Как проверить существует ли некое правило? Если нет, то добавить его
ДОбрый вечер. У меня создаются правила с помощью assert() И каждый раз программа создает одни и...

Как можно растягивать окно и его элементы, если нет бордюра
Собственно как можно растягивать окно и его элементы, если нету границы. Также нужно сделать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru