Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200

Присвоение действия динамически созданным элементам

30.10.2013, 16:39. Показов 1070. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые программисты и форумчане!
Долгое время бился над одной проблемой, требовалось программно пополнять меню программы (MenuStrip) следую иерархии заданной папки...
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
   Dim patch As String = Application.StartupPath
   Dim foundF = IO.Directory.GetDirectories(patch & "\Папка\")
        ListBox1.Items.AddRange(foundF)
        For Each item In ListBox1.Items
            ListBox3.Items.Add(item)
        Next
a1:     If ListBox1.Items.Count >= 1 Then
            ListBox1.SelectedIndex = 0
            ListBox2.Items.Add(ListBox1.Text.Replace(patch & "\Папка\", ""))
            ListBox1.Items.Remove(ListBox1.SelectedItem)
            GoTo a1
        End If
b1:     If ListBox2.Items.Count >= 1 Then
            ListBox2.SelectedIndex = 0
            Me.МатериалToolStripMenuItem.DropDownItems.Add(ListBox2.SelectedItem, Nothing)
                   ListBox2.Items.Remove(ListBox2.SelectedItem)
            GoTo b1
        End If
               For Each item In Me.МатериалToolStripMenuItem.DropDownItems
            Dim found = IO.Directory.GetDirectories(patch & "\Папка\" & item.text)
            ListBox1.Items.AddRange(found)
a2:         If ListBox1.Items.Count >= 1 Then
                ListBox1.SelectedIndex = 0
                ListBox2.Items.Add(ListBox1.Text.Replace(patch & "\Папка\" & item.text & "\", ""))
                ListBox1.Items.Remove(ListBox1.SelectedItem)
                GoTo a2
            End If
b2:         If ListBox2.Items.Count >= 1 Then
                ListBox2.SelectedIndex = 0
                item.DropDownItems.Add(ListBox2.SelectedItem)
                            ListBox2.Items.Remove(ListBox2.SelectedItem)
                GoTo b2
            End If
            For Each item1 In item.DropDownItems
                Dim found2 = IO.Directory.GetDirectories(patch & "\Папка\" & item.text & "\" & item1.text)
                ListBox1.Items.AddRange(found2)
a3:             If ListBox1.Items.Count >= 1 Then
                    ListBox1.SelectedIndex = 0
                    ListBox2.Items.Add(ListBox1.Text.Replace(patch & "\Папка\" & item.text & "\" & item1.text & "\", ""))
                    ListBox1.Items.Remove(ListBox1.SelectedItem)
                    GoTo a3
                End If
b3:             If ListBox2.Items.Count >= 1 Then
                    ListBox2.SelectedIndex = 0
                    item1.DropDownItems.Add(ListBox2.SelectedItem)
                    ListBox2.Items.Remove(ListBox2.SelectedItem)
                    GoTo b3
                End If
     Next
Next
Программа добавляет в меню элементы следую структуре папке "Папка"...
Листбоксы обрабатывают список папок..
Сам вопрос - как прикрутить действие к этим динамически созданным элементам меню?
P.S. знаю, код ужасен и не оптимизирован, но мне сейчас главное разобраться с этой проблемой...
Спасибо!

Добавлено через 19 часов 36 минут
Собратья знатоки, помогите!((
Пробовал через
VB.NET
1
addressof
программа выдаёт ошибку. Что-то об отсутствии или не принадлежности к типу делегата...

Добавлено через 21 час 32 минуты
Что же все такие неотзывчивые?((
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.10.2013, 16:39
Ответы с готовыми решениями:

Программный доступ к динамически созданным элементам
Доброе время суток! Очередная проблемка: Создаю динамически несколько кнопок: Dim Button As New Button Button.Name...

MenuStrip: обратиться к динамически созданным подменю
Доброго времени суток всем. Есть MenuStrip1 на форме. У него есть пункт Файл, а в нем пункт COMport. При задержке на нем курсора у...

Как рисовать на PictureBox'e, созданным программным способом (динамически)
Приветствую всех. При создании объекта PictureBox динамическим способом, почему-то на нем не отображаются элементы Graphics. Уже не знаю...

8
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
30.10.2013, 16:45
AddHandler
1
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
30.10.2013, 16:50  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
В том то и дело, что не работает ничего из этой области((
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
30.10.2013, 17:00
Покажи процедуру, которую ты хочешь сделать обработчиком клика меню
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
30.10.2013, 17:59  [ТС]
VB.NET
1
2
3
4
addhandler item.click, addressof ert
Sub ert(byval sender as system.object)
Msgbox(sender.text)
Nd sub
При этом студия подчёркивает click как ошибку
А если просто прописать
VB.NET
1
.Item.dropdownitems.add(listbox2.text, addressof ert)
Пишет что-то про делегат
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
01.11.2013, 00:33  [ТС]
кто-нибудь может потратить 5 минут, и переписать мне мой работающий код на код с приписанным действием?((
Кликните здесь для просмотра всего текста
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
 Dim patch As String = Application.StartupPath
   Dim foundF = IO.Directory.GetDirectories(patch & "\Папка\")
        ListBox1.Items.AddRange(foundF)
        For Each item In ListBox1.Items
            ListBox3.Items.Add(item)
        Next
a1:     If ListBox1.Items.Count >= 1 Then
            ListBox1.SelectedIndex = 0
            ListBox2.Items.Add(ListBox1.Text.Replace(patch & "\Папка\", ""))
            ListBox1.Items.Remove(ListBox1.SelectedItem)
            GoTo a1
        End If
b1:     If ListBox2.Items.Count >= 1 Then
            ListBox2.SelectedIndex = 0
            Me.МатериалToolStripMenuItem.DropDownItems.Add(ListBox2.SelectedItem, Nothing)
                   ListBox2.Items.Remove(ListBox2.SelectedItem)
            GoTo b1
        End If
               For Each item In Me.МатериалToolStripMenuItem.DropDownItems
            Dim found = IO.Directory.GetDirectories(patch & "\Папка\" & item.text)
            ListBox1.Items.AddRange(found)
a2:         If ListBox1.Items.Count >= 1 Then
                ListBox1.SelectedIndex = 0
                ListBox2.Items.Add(ListBox1.Text.Replace(patch & "\Папка\" & item.text & "\", ""))
                ListBox1.Items.Remove(ListBox1.SelectedItem)
                GoTo a2
            End If
b2:         If ListBox2.Items.Count >= 1 Then
                ListBox2.SelectedIndex = 0
                item.DropDownItems.Add(ListBox2.SelectedItem)
                            ListBox2.Items.Remove(ListBox2.SelectedItem)
                GoTo b2
            End If
            For Each item1 In item.DropDownItems
                Dim found2 = IO.Directory.GetDirectories(patch & "\Папка\" & item.text & "\" & item1.text)
                ListBox1.Items.AddRange(found2)
a3:             If ListBox1.Items.Count >= 1 Then
                    ListBox1.SelectedIndex = 0
                    ListBox2.Items.Add(ListBox1.Text.Replace(patch & "\Папка\" & item.text & "\" & item1.text & "\", ""))
                    ListBox1.Items.Remove(ListBox1.SelectedItem)
                    GoTo a3
                End If
b3:             If ListBox2.Items.Count >= 1 Then
                    ListBox2.SelectedIndex = 0
                    item1.DropDownItems.Add(ListBox2.SelectedItem)
                    ListBox2.Items.Remove(ListBox2.SelectedItem)
                    GoTo b3
                End If
     Next
Next
0
01.11.2013, 10:58

Не по теме:

Совет: Забуть о существование GoTo

0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
01.11.2013, 18:20
В общем всю эту "бороду" можно заменить рекурсией:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
    Private Sub CreateMenu(root As String, menu As ToolStripMenuItem)
        Dim di As DirectoryInfo = New DirectoryInfo(root)
        Dim ti As ToolStripMenuItem = menu
        For Each d As DirectoryInfo In di.GetDirectories()
            ti = menu.DropDownItems.Add(d.Name)
            For Each f As FileInfo In d.GetFiles()
                AddHandler ti.DropDownItems.Add(f.Name).Click, AddressOf ert
            Next
            If (Directory.GetDirectories(d.FullName).Length = 0) Then AddHandler ti.Click, AddressOf ert
            CreateMenu(d.FullName, ti)
        Next
    End Sub
Процедура клика такая:
VB.NET
1
2
3
4
Sub ert(sender As Object, e As EventArgs)
        Dim ti As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        MsgBox(ti.Text)
    End Sub
Может знатоки подскажут, как процедуру передать в качестве параметра, чтобы подставить в AddressOf?
1
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
01.11.2013, 18:34  [ТС]
ViterAlex, Огромное спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.11.2013, 18:34
Помогаю со студенческими работами здесь

Обращение к динамически созданным элементам WPF
Доброго времени суток! Разбираюсь с WPF... Создал сервис, который генерирует разметку XAML. Например такую: <Canvas...

Обращение к програмно(не в дизайнере) созданным элементам
Label TZtime = new Label();//Создаю новый элемент управления TZtime.Name = "Time"+i.ToString();//Задаю ему имя ...

Клик по созданным через Template элементам
По коллекции ObservableCollection создаются прямоугольники. Как по клику на прямоугольник определить какой именно был выбран и записать его...

Как обращаться к элементам созданным программно
Как обратиться к элементу, который добавлен кодом ? ComboBox comboBox4 = new ComboBox(); this.Controls.Add(comboBox4);

Обращение к динамически созданным объектам Qt
Доброго времени суток. У меня возникла необходимость в диалоговом окне по нажатию на кнопку создавать textedit'ы, в них пользователь пишет...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru