Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90

Удалить с flowLayoutPanel

19.12.2023, 19:40. Показов 2665. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как удалить с flowLayoutPanel элементы не с конца...



По нажатию на кнопку на flowLayoutPanel добавляется вот такая строка с компонентами включая кнопку с крестиком, которая по моей задумке должна удалить именно эту строчку. Удалить последнюю строчку получается, но вот как сделать чтоб удалялась нужная строка?

C#
1
2
3
4
5
6
7
8
  button.Click += new System.EventHandler((object sender, EventArgs e) =>
  {
      for (int i = 0; i < 4; i++)
      {
          flowLayoutPanel1.Controls.RemoveAt(flowLayoutPanel1.Controls.Count-1);
      }
      buket.RemoveAt(buket.Count - 1);
  });
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2023, 19:40
Ответы с готовыми решениями:

FlowLayoutPanel
Привет Всем! у меня FlowLayoutPanel ведет себя странным образом. Я создаю в режиме runtime 3 кнопки, а панель показывает 6, и их...

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

FlowLayoutPanel - авторазмер
Добрый день, уважаемый коллеги. Прошу помочь. Есть UserControl, в котором закреплен FlowLayoutPanel, в котором находятся кнопки ...

26
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
19.12.2023, 20:45
При добавлении элементов в flowLayoutPanel надо где-то запомнить индекс строки. Например, в свойстве button.Tag. Ну, а при удалении элементов операться на него.
0
fly
 Аватар для I can
4951 / 4635 / 844
Регистрация: 13.04.2015
Сообщений: 9,820
19.12.2023, 21:00
Цитата Сообщение от Diom Посмотреть сообщение
вот как сделать чтоб удалялась нужная строка?
Вот здесь так и напрашивается собственный UserControl.
0
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
20.12.2023, 11:15  [ТС]
Uswer, ваш совет работает, но что-то я не догоняю его до конца. Добавляю несколько строк, и получаю такую работу:
1. Удаление нижней строки всегда дает исключение "Индекс вне допустимого диапазона".
2. Если первой удалить предпоследнюю строку(удаляется без исключений), то остальные (кроме нижней) удаляются без проблем.
3. Если сначала удалить любую строку кроме двух нижних, то эти нижние выдают то же исключение.

Видимо или я туплю с индексами или flowLayoutPanel при удалении с себя компонентов перезадает индексы оставшимся. И что-то я пока не врубаюсь в схему))
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
flowLayoutPanel1.Controls.Add(Get_btnDelete());
int x = flowLayoutPanel1.Controls.Count;
flowLayoutPanel1.Controls[x-1].Tag = x-1;
 
Button Get_btnDelete()
 {
     Button button = new Button();
     button.Text = "X";   
     button.Size = new System.Drawing.Size(23, 23);
     button.Click += new System.EventHandler((object sender, EventArgs e) =>
     {               
             for (int i = 0; i < 4; i++)
             {
                 flowLayoutPanel1.Controls.RemoveAt(Convert.ToInt16(button.Tag)-3);                       
             }
             buket.RemoveAt(buket.Count - 1);             
     });    
     return button;
 }
0
Эксперт .NET
 Аватар для Rius
13158 / 7716 / 1679
Регистрация: 25.05.2015
Сообщений: 23,512
Записей в блоге: 14
20.12.2023, 11:21
Здесь напрашивается не UserControl, а DataGridView.
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
20.12.2023, 11:48
Лучший ответ Сообщение было отмечено Diom как решение

Решение

Цитата Сообщение от Diom Посмотреть сообщение
но что-то я не догоняю его до конца.
1. Прислушайтесь к другим участникам темы, они дело говорят. Будет в разы проще управлять элементами UI с UserControl. Либо измените сам элемент UI, например на DataGridView.
2. Если удаляются какие-то элементы из flowLayoutPanel, то индексы всех других (особенно тех, что идут после удалённого) надо корректировать. При вставке элементов тоже самое. Короче проще сделать по п.1.
1
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
20.12.2023, 11:55  [ТС]
Uswer, понял. Спасибо.
0
fly
 Аватар для I can
4951 / 4635 / 844
Регистрация: 13.04.2015
Сообщений: 9,820
20.12.2023, 13:47
Цитата Сообщение от Diom Посмотреть сообщение
понял
Смотри пример с UserControl-ом, набросал за пару минут.. Кода можно сказать вообще никакого нет, пара строчек.
Миниатюры
Удалить с flowLayoutPanel  
Вложения
Тип файла: rar WindowsFormsApplication1.rar (43.7 Кб, 6 просмотров)
1
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
20.12.2023, 14:17  [ТС]
I can, Спасибо. Только что сам такое же почти воспроизвел) Действительно хорошая штука. Для меня новое открытие. Но уже понимаю как облегчить себе задачу.

Добавлено через 22 минуты
I can, И еще вопрос возник. Я смотрел урок и там у автора элемент UserControl появился в панели элементов, при этом он ничего не делал для этого. У меня так не происходит. Что сделать?
0
fly
 Аватар для I can
4951 / 4635 / 844
Регистрация: 13.04.2015
Сообщений: 9,820
20.12.2023, 14:27
Цитата Сообщение от Diom Посмотреть сообщение
UserControl появился в панели элементов, при этом он ничего не делал для этого
Ну как минимум надо собрать решение.

А потом перетащить элемент на форму, так же, например, как кнопку.
Миниатюры
Удалить с flowLayoutPanel  
1
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
20.12.2023, 19:10  [ТС]
I can, Все, появился. Сразу почему-то не появился. Спасибо.

Добавлено через 4 часа 39 минут
Подскажите еще, нормальная ли это реализация изъятия информации из компонентов на UserControl, или есть более грамотный способ?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 cena_buketa = 0;
 buket.Clear();
 int x = flowLayoutPanel1.Controls.Count;
 for (int i = 1, z = 0; z < x; i++, z++)
 {
     cvetok = new Cvety();
     cvetok.vid = flowLayoutPanel1.Controls[x - i].Controls[4].Text;
     cvetok.name = flowLayoutPanel1.Controls[x - i].Controls[3].Text;
     cvetok.colichestvo = Convert.ToInt32(flowLayoutPanel1.Controls[x - i].Controls[2].Text);
     cvetok.cena = Convert.ToInt32(flowLayoutPanel1.Controls[x - i].Controls[0].Text);
     buket.Add(cvetok);
 }
 
 foreach (CVT cVT in buket) 
 {
     cena_buketa += cVT.colichestvo * cVT.cena;
 }
0
Эксперт .NET
 Аватар для Rius
13158 / 7716 / 1679
Регистрация: 25.05.2015
Сообщений: 23,512
Записей в блоге: 14
20.12.2023, 19:11
DataGridView есть. Но это для ищущих короткий и простой путь.
0
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
20.12.2023, 19:23  [ТС]
Rius, Я и с ним потом попробую. Я не работу работаю, учусь. Так что мне не принципиально.
0
fly
 Аватар для I can
4951 / 4635 / 844
Регистрация: 13.04.2015
Сообщений: 9,820
20.12.2023, 19:32
Цитата Сообщение от Diom Посмотреть сообщение
попробую

А для UserControl-а посмотри еще пример
Вложения
Тип файла: rar WindowsFormsApplication1.rar (51.3 Кб, 6 просмотров)
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
20.12.2023, 19:48
Цитата Сообщение от Diom Посмотреть сообщение
нормальная ли это реализация изъятия информации из компонентов на UserControl
Плохая.
Пример от I can в WindowsFormsApplication1.rar тоже не очень.
Студию заводить лень, поэтому словами:
должно быть типа того - у UserControl-а должно быть свойство или конструктор (это если использовать DI) принимающее объект, свойства этого элемента отображаются во внутренних элементах управления UserControl-а. Любые изменения значений внутри UserControl влияют на объект, всякие проверки и валидации, всё это должно быть имплементировано в UserControl. Управление самими UserControl-ми должно производится извне, т.е. создание, помещение в контейнеры или коллекции, удаление и т.п. Чтобы UserControl мог нормально взаимодействовать с внешним кодом он должен информировать его путём генерации событий. Ну, а код извне должен обрабатывать эти события.

Не по теме:

Если будет время, то может набросаю примерчик, но не обещаю. Мож кто-то опередит!

0
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
20.12.2023, 20:03  [ТС]
Uswer, т.е. если я правильно понял, нужно объект идентичный моему cvetok создавать для каждого нового юзерКонтрола прям внутри него, и организовать его изменение в зависимости от изменений элементов ЮзерКонтрола, а потом каким-то образом вытаскивать его? Если так, то изначально я так пытался, но у меня не получилось наладить зависимость объекта от изменений, т.е. я всегда получал объект с полями по умолчанию и он не менялся никак.
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
20.12.2023, 20:19
Нет не так. Набросаю пример на скорую руку.
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
20.12.2023, 21:21
Получите распишитесь.
Вложения
Тип файла: zip UserControlAndObjModelDemo.zip (16.1 Кб, 15 просмотров)
0
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
22.12.2023, 13:23  [ТС]
Uswer, а можете объяснить каким образом обновляются данные в buketList если меняются значения цены?

Если у меня не просто массив из пары цветков, а база с множеством видов и сортов (например розы - 20 сортов, тюльпаны - 15 сортов и хризантем 5 сортов), которая периодически меняется, мне получается нужно создать из этой базы список из 40 объектов класса "Цветок" и каждый передать в юзер контрол чтоб заполнить выпадающий список комбобоксов??

Добавлено через 57 минут
Нет, так не работает. В комбобокс появляется только одна позиция.
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
23.12.2023, 12:50
Diom, в представленном примере каждому UserControl соответствует экземпляр класса buket, изменения значений, например цены, происходят через механизм привязки данных:
C#
1
BuketPriceTextBox.DataBindings.Add("Text", _buket, "Price");
То что в моём проекте это только пример работы с данными использую UserControl и не более. Поймите одно - у вас должны быть данные и элементы управления работающие с ними.
Цитата Сообщение от Diom Посмотреть сообщение
мне получается нужно создать из этой базы список из 40 объектов класса "Цветок"
Можно и так, тут всё зависит от вашего видения работы с данными. Я бы сделал несколько иначе. Допустим так: весь перечень цветов поместил в комбобокс, а рядом с ним кнопку "добавить". По нажатию кнопки создаётся экземпляр цветка, тип которого выбран в комбобоксе, и добавляется UserControl на панель с этим цветком. В UserControl-ах меняется состав букета, количество и, возможно, цена цветов. В саму панель можно добавлять другие UserControl-ы, например для обёртки букетов. Если все объекты букета будут иметь общий базовый класс или интерфейс, который сделает свойства Price и Count обязательными, то подсчёт суммы букета не составит проблемы. Ну, а удаление цветка из букета в принципе показано в моём примере.

Добавлено через 1 минуту
У меня в примере создан класс Buket, а, как я понял, для вашей задачи скорее нужен класс Flower. Но это никак не меняет сам подход, просто код станет более читаемым под задачу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2023, 12:50
Помогаю со студенческими работами здесь

Работа с flowlayoutpanel
У меня на флоулайоутпанели есть 64 пикчербокса, их имена, как в шахматах, a1-a8...h1-h8. Как по нажатию на определенный пикчербокс записать...

Авто-размер у FlowLayoutPanel
Добрый день! Имеется следующая вложенность контейнеров Form &gt; TableLayoutPanel &gt; FlowLayoutPanel FlowLayoutPanel заполняется...

Работа со списком в FlowLayoutPanel
Добры день! Помогите разобраться с проектом. Есть UserControl. Заполняется из списка ФИО из списка List For x As Integer =...

FlowLayoutPanel выбрасывает win32exception
При добавлении в flowlayoutpanel большого количества контролов выбрасывается win32exception. Как боротся с таковым недугом, если в нужно,...

Не могу разобраться с flowLayoutPanel
Добрый вечер, форумчане! Хотел бы попросить помощи с flowLayoutPanel. Есть генератор чекбоксов, который размещает их на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru