Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для Temiks
7 / 7 / 5
Регистрация: 18.11.2014
Сообщений: 64

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

25.11.2014, 16:25. Показов 896. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня снова проблема с динамически создаваемые блоками.
В общем задача такова: есть на форме два комбобокса(выпадающих списка) назавем его А и В.
На форму так же подключается датагрид из БД акцесс.
--
Далее пользователь выбирает одно значение из комбобокса А и ему динамически создаются элементы из БД в виде пикчербокса и на него накладывается лейбл с текстом, который подтягивается из бд.
Выглядит это все вот так(вложение 1)
--
Если выводит больше 6(шесть) эл то создается кнопка далее, если мы кликаем на нее, предыдущие картинки(6штук) удаляются, а вместо них создаются новые изображения т.е картинки 6-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
26
Dim X = 45 'начальная точка по Х
        Dim Y = 20 'начальная точка пo Y
        For i = 1 To DataGridView1.Rows.Count - 2
            Dim Pb(i) As PictureBox
            Pb(i) = New PictureBox
            Pb(i).Name = "Image" + CStr(i)
            Pb(i).Size() = New Size(254, 142)
            Pb(i).Padding = New Padding(5)
            Pb(i).Location = New Point(X, Y)
            Pb(i).Visible = True
            Pb(i).SizeMode = PictureBoxSizeMode.StretchImage
            Pb(i).Image = Image.FromFile(Application.StartupPath & DataGridView1.Rows(i - 1).Cells(7).Value.ToString())
            Pb(i).Tag = Application.StartupPath & DataGridView1.Rows(i - 1).Cells(7).Value.ToString()
            Pb(i).BackColor = Color.White
            Panel1.Controls.Add(Pb(i))
            AddHandler Pb(i).Click, AddressOf Pb_Click
 
 
            If (i Mod 3) = 0 Then 'каждый 4й - вывод с новой строки
                X = 45
                Y += 180 'высота по Y + 36 (для промежутка)
            Else
                X += 300 'ширина по X + 46
            End If
 
        Next
--
Код динамически создаваемых лейблов:
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
For j = 1 To DataGridView1.Rows.Count - 2
            Dim L(j) As Label
            L(j) = New Label
            L(j).Name = "LabelName" + CStr(j)
            ' L(i).Size() = New Size(254, 142)
            ' L(i).Padding = New Padding(5)
            L(j).Location = New Point(XL, YL)
            L(j).Visible = True
            L(j).AutoSize = True
 
            L(j).Text = DataGridView1.Rows(j - 1).Cells(1).Value.ToString()
            L(j).BackColor = Color.White
            Panel1.Controls.Add(L(j))
 
            If (j Mod 3) = 0 Then 'каждый 4й - вывод с новой строки
                
 
                XL = 45
                YL += 180 'высота по Y + 36 (для промежутка)
            Else
                XL += 300 'ширина по X + 46
            End If
        Next
--
Код удаления элементов с формы:
VB.NET
1
2
3
4
5
6
7
8
9
For i = 1 To Panel1.Controls.Count
            'If Panel1.Controls.Find("Image") Then
            Panel1.Controls("Image" & i).Dispose()
            'End If
 
        Next
        For j = 1 To Panel1.Controls.Count
            Panel1.Controls("LabelName" & j).Dispose()
        Next
--
Проблема в следующем:
1. С данным кодом i цикл идет через один, т.е 3,5,7, и т.к. Записей в бд 30, а он выдает 58, не совсем понятно почему
2. Возникает ошибка при выборе другого значения из комбобокса
3. Лейбл подкладывается под изображение, а не над изображением
Если это все можно реализовать более правильно и компактно, буду очень признателен
Миниатюры
Динамически создаваемые блоки с возможностью их прокрутки   Динамически создаваемые блоки с возможностью их прокрутки  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2014, 16:25
Ответы с готовыми решениями:

Связать динамически создаваемые блоки линиями
Добрый вечер, у меня задача сделать редактор для создания блок-схем или ER диаграмм. я уже сделал динамическое создание и перемещение...

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

C# и создаваемые динамически объекты
Вообщем задали написать курсовую программу на языке C# Мало того что никто язык этот не знает в группе, так нас ему ещё не учат (говорят...

10
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
25.11.2014, 18:10
Цитата Сообщение от Temiks Посмотреть сообщение
VB.NET
1
2
3
For i = 1 To DataGridView1.Rows.Count - 2
  Dim Pb(i) As PictureBox
  Pb(i) = New PictureBox
VB.NET
1
2
3
For j = 1 To DataGridView1.Rows.Count - 2
  Dim L(j) As Label
  L(j) = New Label
Пора понять, что это бред.
0
 Аватар для Temiks
7 / 7 / 5
Регистрация: 18.11.2014
Сообщений: 64
25.11.2014, 18:33  [ТС]
а как вы предлагает поступить?
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
25.11.2014, 18:55
Цитата Сообщение от Temiks Посмотреть сообщение
а как вы предлагает поступить?
Ты понимаешь, что делает этот код?
На каждой итерации цикла создаётся новый массив, размером на единицу больше номера итерации. Все элементы этого массива имеют значение Nothing. Следующей строчкой в последний элемент массива помещается свежесозданный контрол. Далее с этим контролом что-то делается, причём к другим элементам массива (которые имеют значение Nothing) обращений нет. В конце итерации ссылок на массив больше нет и через некоторое время его собирает сборщик мусора.

Теперь вопрос: а зачем вообще тут нужен массив?
Надо просто объявлять переменную (одну) и с ней работать. Либо выносить массив выше цикла, тогда к элементам в нём можно будет как-то обратиться, но не похоже, что тебе это требуется.

А ещё, в VB есть удобная конструкция With, чтобы не писать постоянно имя переменной. А если Panel1.Controls.Add(Smth) заменить на Smth.Parent = Panel1, то можно обойтись одной конструкцией With без явного объявления переменной.

Добавлено через 8 минут
Цитата Сообщение от Temiks Посмотреть сообщение
Код удаления элементов с формы:
... неправильный.
Сразу по нескольким причинам, не считая того, что с динамическими контролами у меня обращение по имени почему-то не работало.

Чем вообще не устраивает
VB.NET
1
Panel1.Controls.Clear()
хотя да, Dispose тут не вызовется...
0
 Аватар для Temiks
7 / 7 / 5
Регистрация: 18.11.2014
Сообщений: 64
25.11.2014, 18:57  [ТС]
я по другому понимал, как аботает этот код, спасибо за разъеснения, только вот можете на примере показать
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
25.11.2014, 20:21
Что именно непонятно?
0
 Аватар для Temiks
7 / 7 / 5
Регистрация: 18.11.2014
Сообщений: 64
25.11.2014, 20:29  [ТС]
Qwertiy,
шаг первый - объявляю переменную pb как integer?
шаг второй - создаю цикл с pb = 1 до DataGridView1.Rows.Count - 2
шаг третий - нужно сделать переменную picturebox, но не понятно теперь как это сделать
--
Правильно делаю?
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
25.11.2014, 20:39
Цитата Сообщение от Temiks Посмотреть сообщение
шаг первый - объявляю переменную pb как integer?
Зачем?

Цитата Сообщение от Temiks Посмотреть сообщение
шаг второй - создаю цикл с pb = 1 до DataGridView1.Rows.Count - 2
Почему не от 0, как должно быть? И почему последние строки не нужны?

Цитата Сообщение от Temiks Посмотреть сообщение
шаг третий - нужно сделать переменную picturebox, но не понятно теперь как это сделать
Так же как и любую другую.
Dim Pb As New PictureBox
Хотя я бы сделал без объявления переменной:
With New PictureBox
0
 Аватар для Temiks
7 / 7 / 5
Регистрация: 18.11.2014
Сообщений: 64
25.11.2014, 21:12  [ТС]
Qwertiy, мне же нужно создавать эти блоки динамически с БД, их количество я знать не могу, тогда какого типа создавать переменную? думал целочисленного
2. 1 - потому что мне нужно далее в условие их расставлять по 3 штуки в ряд условием
VB.NET
1
2
3
4
5
6
If (i Mod 3) = 0 Then 'каждый 4й - вывод с новой строки
                X = 45
                Y += 180 'высота по Y + 36 (для промежутка)
            Else
                X += 300 'ширина по X + 46
            End If
А -2 это не последние строки, это мы не берем в учет название поля(которое идет в начале), и последняя запись в бд всегда пустая(идет в самом конце)

Добавлено через 5 минут
Цитата Сообщение от Qwertiy Посмотреть сообщение
Так же как и любую другую.
Dim Pb As New PictureBox
если делать без i элемента, то к чему присваивать изображения из грида?
VB.NET
1
Pb(i).Image = Image.FromFile(Application.StartupPath & DataGridView1.Rows(i - 1).Cells(7).Value.ToString())
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
25.11.2014, 22:35
Цитата Сообщение от Temiks Посмотреть сообщение
мне нужно далее в условие их расставлять по 3 штуки в ряд условием
Я бы на формулу переписал. Но можно и так. Это вообще не важно.

Цитата Сообщение от Temiks Посмотреть сообщение
если делать без i элемента, то к чему присваивать изображения из грида?
Почему без I? I e тебя есть - это счётчик цикла. Но Pb(I) тебе не нужно.
1
 Аватар для Temiks
7 / 7 / 5
Регистрация: 18.11.2014
Сообщений: 64
25.11.2014, 22:37  [ТС]
Qwertiy, понял, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2014, 22:37
Помогаю со студенческими работами здесь

Динамически создаваемые индексы
Доброго времени суток! В рамках моей задачи необходимо с помощью динамики создавать новые таблицы на основе уже имеющихся. Возникла...

Динамически создаваемые контролы. События
Проблема такая. есть динамически создаваемые кнопки. Кнопки должны создаваться с возможностью последующего перетаскивания. На события...

Валидатор на динамически создаваемые TextBox
Есть несколько динамически создаваемых TextBox. При попытке ввода в них, например текста: <html> - выдаёт сбой. Как внести к...

Удалить динамически создаваемые объекты
Доброго времени суток. В общем-то объекты создаются. Их данные (координаты, название и т.д.) записываются в ini-файл. Из этого файла...

Динамически создаваемые TabSheet и RichEdit
Всем доброго вечера. Очередной вопрос. В программе, по мере открытия текстовых файлов, динамически создаются вкладки TabSheet и в них...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru