Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
1

Динамическое создание и удаление кнопок текстбоксов и прочего

13.08.2019, 11:30. Просмотров 1896. Ответов 30
Метки нет (Все метки)

Собственно есть код, добавляет нормально, удаляет тоже но только если удалять с последней строки и вверх, а если удалять с середины потом добавить и что нить удалить то получается какая то каша.
https://i.ibb.co/SPdH5jS/image.jpg
Собственно вопрос как сделать нормальное удаление или может при добавление что то не то ? Сам код:
C#
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
private void btnAdd_Click(object sender, EventArgs e)
        {
            int count = panel1.Controls.OfType<TextBox>().ToList().Count;
 
            Label lService = new Label();
            lService.Location = new Point(-3, 14 * count);
            lService.Size = new Size(46, 13);
            lService.Name = "lService_" + (count + 1);
            lService.Text = "Услуга:";
            panel1.Controls.Add(lService);
 
            Label lPrice = new Label();
            lPrice.Location = new Point(274, 14 * count);
            lPrice.Size = new Size(40, 13);
            lPrice.Name = "lPrice_" + (count + 1);
            lPrice.Text = "Цена:";
            panel1.Controls.Add(lPrice);
 
            Label lCurrency = new Label();
            lCurrency.Location = new Point(397, 14 * count);
            lCurrency.Size = new Size(48, 13);
            lCurrency.Name = "lCurrency_" + (count + 1);
            lCurrency.Text = "Валюта:";
            panel1.Controls.Add(lCurrency);
 
            Label lDesc = new Label();
            lDesc.Location = new Point(518, 14 * count);
            lDesc.Size = new Size(65, 13);
            lDesc.Name = "lDesc_" + (count + 1);
            lDesc.Text = "Описание:";
            panel1.Controls.Add(lDesc);
 
            ComboBox cbxService = new ComboBox();
            cbxService.Location = new Point(49, 14 * count);
            cbxService.Size = new Size(219, 20);
            cbxService.Name = "cbxService_" + (count + 1);
            panel1.Controls.Add(cbxService);
 
            ComboBox cbxCurrency = new ComboBox();
            cbxCurrency.Location = new Point(451, 14 * count);
            cbxCurrency.Size = new Size(61, 20);
            cbxCurrency.Name = "cbxCurrency_" + (count + 1);
            panel1.Controls.Add(cbxCurrency);
 
            TextBox txbPrice = new TextBox();
            txbPrice.Location = new System.Drawing.Point(316, 14 * count);
            txbPrice.Size = new System.Drawing.Size(75, 20);
            txbPrice.Name = "txbPrice_" + (count + 1);
            panel1.Controls.Add(txbPrice);
 
            //Create the dynamic TextBox.
            TextBox txbDesc = new TextBox();
            txbDesc.Location = new System.Drawing.Point(584, 14 * count);
            txbDesc.Size = new System.Drawing.Size(196, 20);
            txbDesc.Name = "txbDesc_" + (count + 1);
            panel1.Controls.Add(txbDesc);
 
            //Create the dynamic Button to remove the TextBox.
            Button btnDelete = new Button();
            btnDelete.Location = new System.Drawing.Point(786, 14 * count);
            btnDelete.Size = new System.Drawing.Size(27, 22);
            btnDelete.Name = "btnDelete_" + (count + 1);
            btnDelete.Text = "X";
            btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
            panel1.Controls.Add(btnDelete);
        }
 
       
 
 
        private void btnDelete_Click(object sender, EventArgs e)
        {
            //Reference the Button which was clicked.
            Button button = (sender as Button);
 
            //Determine the Index of the Button.
            int index = int.Parse(button.Name.Split('_')[1]);
 
            //Find the TextBox using Index and remove it.
            panel1.Controls.Remove(panel1.Controls.Find("lService_" + index, true)[0]);
            panel1.Controls.Remove(panel1.Controls.Find("lPrice_" + index, true)[0]);
            panel1.Controls.Remove(panel1.Controls.Find("lCurrency_" + index, true)[0]);
            panel1.Controls.Remove(panel1.Controls.Find("lDesc_" + index, true)[0]);
            panel1.Controls.Remove(panel1.Controls.Find("cbxService_" + index, true)[0]);
            panel1.Controls.Remove(panel1.Controls.Find("cbxCurrency_" + index, true)[0]);
            panel1.Controls.Remove(panel1.Controls.Find("txbPrice_" + index, true)[0]);
            panel1.Controls.Remove(panel1.Controls.Find("txbDesc_" + index, true)[0]);
            
            //Remove the Button.
            panel1.Controls.Remove(button);
 
            //Rearranging the Location controls.
            foreach (Button btn in panel1.Controls.OfType<Button>())
            {
                int controlIndex = int.Parse(btn.Name.Split('_')[1]);
                if (controlIndex > index)
                {
                    Label lService = (Label)panel1.Controls.Find("lService_" + controlIndex, true)[0];
                    Label lPrice = (Label)panel1.Controls.Find("lPrice_" + controlIndex, true)[0];
                    Label lCurrency = (Label)panel1.Controls.Find("lCurrency_" + controlIndex, true)[0];
                    Label lDesc = (Label)panel1.Controls.Find("lDesc_" + controlIndex, true)[0];
                    ComboBox cbxService = (ComboBox)panel1.Controls.Find("cbxService_" + controlIndex, true)[0];
                    ComboBox cbxCurrency = (ComboBox)panel1.Controls.Find("cbxCurrency_" + controlIndex, true)[0];
                    TextBox txbPrice = (TextBox)panel1.Controls.Find("txbPrice_" + controlIndex, true)[0];
                    TextBox txbDesc = (TextBox)panel1.Controls.Find("txbDesc_" + controlIndex, true)[0];
                    lService.Top = lService.Top - 28;
                    lPrice.Top = lPrice.Top - 28;
                    lCurrency.Top = lCurrency.Top - 28;
                    lDesc.Top = lDesc.Top - 28;
                    cbxService.Top = cbxService.Top - 28;
                    cbxCurrency.Top = cbxCurrency.Top - 28;                    
                    txbPrice.Top = txbPrice.Top - 28;
                    txbDesc.Top = txbDesc.Top - 28;
                    btn.Top = btn.Top - 28;
 
                }
            }
        }
Добавлено через 2 часа 31 минуту
Вот тут немного неправильно было
C#
1
int count = panel1.Controls.OfType<TextBox>().ToList().Count;
сделал так
C#
1
int count = panel1.Controls.OfType<Button>().ToList().Count;
теперь прибавляет по 1, но все равно это проблему не решило...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2019, 11:30
Ответы с готовыми решениями:

Динамическое создание кнопок
Кнопка start создает 5 label и button. Подскажите пожалуйста, как сделать так, чтобы при нажатии bt...

Динамическое создание кнопок
TextBox tbI = new TextBox; Button btU = new Button; Int n=5; for (int i = 0; i &lt; n; i++) { ...

Динамическое создание кнопок
Всем доброго времени суток! Передо мною стала серьезная проблема! Имеется файл &quot;test.txt&quot;, его...

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

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

30
Рядовой
671 / 418 / 195
Регистрация: 17.05.2015
Сообщений: 1,654
Завершенные тесты: 1
13.08.2019, 11:57 2
SCAR101, а зачем это делать динамически?
0
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 12:13  [ТС] 3
Рядовой, что значит зачем ? в начале есть одна строка, по нажатию на кнопку + добавляется другая, по нажатию на кнопку - удаляется, и все сдвигается вверх, суть в том что не известно сколько строк понадобится
0
Рядовой
671 / 418 / 195
Регистрация: 17.05.2015
Сообщений: 1,654
Завершенные тесты: 1
13.08.2019, 12:19 4
SCAR101, а почему не использовать многострочный текстбокс? А потом его разложить на строки
0
13.08.2019, 12:19
Kazbek17
https://vk.com/a.tsarev83
295 / 185 / 85
Регистрация: 06.02.2012
Сообщений: 660
13.08.2019, 12:19 5
SCAR101, Создайте UserControl со всеми визуальными элементами. После добавляйте в панель.
Создайте обработчик событий на X и удаляйте по объекту а не по индексу.
0
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 12:28  [ТС] 6
Рядовой, зачем мне многострочный текст бокс ? не пойму вас если честно )

Добавлено через 1 минуту
Kazbek17, я новичок по этому все это сложновато для меня, посмотрел я щас про UserControl и нифига не понял )
0
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
13.08.2019, 12:53 7
У вас получается каша, потому что вы все пытаетесь сделать в одном обработчике события.

Раз вы хотите такого гибкого поведения, то нужно делать модель.
Массив объектов, каждый из которых представляет из себя строчку нужных вам контролов.
В этой модели должны быть методы добавления объекта (все, что в вашем обработчике на добавление) и удаления любого по индексу. То есть надо реализовать какой то пул свободных индексов, куда будет добавляться новая строка, если такие индексы есть. Проведение этой модели можно усложнять и далее. Но по сути до user control'a здесь рукой подать.

Иначе код вашей формы обрастает ифами,, флагами состояний и непонятными массивами-буфферами. И вы сами с ней не сможете работать

Добавлено через 1 минуту
Если вы новичок, то это как раз повод изучить создание пользовательских элементов управления, потому что по сути это задача по наследованию от базового библиотечного класса своего собственного. Это вы должны 100% уметь, если не хотите новичком оставаться
1
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 13:00  [ТС] 8
Toros1992, вот теперь я вообще ни чего не понял )) ладно видимо просто так эту задачку не решить )
0
Kazbek17
https://vk.com/a.tsarev83
295 / 185 / 85
Регистрация: 06.02.2012
Сообщений: 660
13.08.2019, 13:17 9
Лучший ответ Сообщение было отмечено SCAR101 как решение

Решение

SCAR101, Вот. Дальше сами там разбирайтесь что куда.
1
Вложения
Тип файла: rar Dynamically_Create_and_delete.rar (171.9 Кб, 4 просмотров)
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 14:50  [ТС] 10
Kazbek17, оооооо спасибо большое))) все оказалось гораздо проще )) вот так сразу понятно что к чему, а то начал читать про это и как то там все запутанно )

Добавлено через 5 минут
Kazbek17, ток я вот чего не пойму, а как мне присваивать элементам разные имена если контрол один ??

Добавлено через 47 минут
Kazbek17, вот например я задаю имя текст боксу
C#
1
control.TextBoxName = "txbPrice_" + i++;
, как мне теперь допустим запихать в переменную то что написано в txbPrice_2 ? И вообще как понять что я присваиваю имя только тому текстбоксу в контроле который я добавляю сейчас, а не всем предыдущим тоже ?
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
13.08.2019, 14:54 11
SCAR101, к чему вообще весь этот ужас? зачем создавать кучу текстбоксов?
0
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 14:55  [ТС] 12
AndreyVorobey, того требует задача
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
13.08.2019, 14:58 13
SCAR101, задача от кого? это ни разу не юзерфрендли интерфейс - огромное множество кнопок, полей ввода и тд.
0
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 15:02  [ТС] 14
AndreyVorobey, ок предложите другой вариант, есть клиенты, у клиентов есть услуги, которые я им предоставляю грубо говоря, их может быть много. Я лично не вижу более удобного способа добавлять эти услуги, ну и все остальное соответсвенно. Можно сделать через датагридвью но это не так удобно.
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
13.08.2019, 15:16 15
SCAR101, у тебя сейчас логика такая, как у разработчиков BK 2010-го, когда сообщения не были сгруппированы в диалоги, а болтались в одном окне. причем тут датагрид тоже не понятно. я бы предложил другой вариант, но ТЗ пока не особо понятно.
0
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 15:23  [ТС] 16
AndreyVorobey, ну если дословно то так https://i.ibb.co/R9PmqxD/image.jpg есть человек, у этого человека есть машина, у этой машины есть услуги, то есть допустим "поменять мотор" или "чип тюнинг", вот как для пользователя программы будет удобнее добавлять эти услуги ?
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
13.08.2019, 15:30 17
Лучший ответ Сообщение было отмечено SCAR101 как решение

Решение

SCAR101, относительно конкретного пункта отвечу:
Цитата Сообщение от SCAR101 Посмотреть сообщение
вот как для пользователя программы будет удобнее добавлять эти услуги
предоставлять полный перечень услуг в combobox, и по его выбору добавлять новую услугу дальше.
к чему 4 одинаковые строки тут ?
https://i.ibb.co/SPdH5jS/image.jpg
1
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
13.08.2019, 15:30 18
Можно иметь список услуг (изначально пустой) и форму по добавлению\редактированию услуг. Таким образом контролы будут только в одном экземпляре - на форме добавления\редактирования
1
SCAR101
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 101
13.08.2019, 16:00  [ТС] 19
AndreyVorobey, ааааа точняк ) и вправду так будет удобнее ))) но я теперь все равно хочу разобраться с этим юзер контролом, вот как допустим выдернуть значение вот этого текст бокса с ценой ? https://i.ibb.co/J5LFG3p/1.jpg

Добавлено через 11 минут
Toros1992, ну это я уже понял ))

Добавлено через 10 минут
AndreyVorobey, блин не все равно как то не очень получается, пользователь должен видеть список услуг прикрепленных к данной машине, а не весь список. Вот как их отобразить с возможностью редактирования чтобы не городить кучу форм? У меня на уме только датагридвтю ) но он не красивый)
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
13.08.2019, 17:11 20
SCAR101, но тот функционал с добавлением новых строк так же не решает проблемы -
Цитата Сообщение от SCAR101 Посмотреть сообщение
пользователь должен видеть список услуг прикрепленных к данной машине
ты ведь работаешь с базой? вот и формируй список согласно surname клиента.
0
13.08.2019, 17:11
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2019, 17:11

Динамическое создание 5ти кнопок
Всем доброго времени суток! Передо мною стоит такая задача: В папке d:test есть 5 папок...

Динамическое создание заданного количества кнопок
Здравствуйте,мне нужно создать программу которая по нажатию на Button в произвольном месте будет...

Динамическое создание кнопок и добавление функционала
Здравствуйте. Предыстория: пишу дипломпо автоматизации небольших заведений, кафе и т.п(терминал...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru