Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
3 / 3 / 4
Регистрация: 27.07.2015
Сообщений: 28

Создание нескольких Combobox с событием SelectedIndexChanged

06.06.2018, 13:51. Показов 4270. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Столкнулся с такой проблемой, прошу поделится мудростью.
У меня есть контрол (flowLayoutPanel), в который я создаю динамически combobox + textbox (который не доступен) + button (кнопка удаления этих контролов). Созданные контролы связаны по tag-у и id названии. У combobox есть Item-ы, после выбора которых должен становится доступен textbox для ввода текста (если значение не выбрано, textbox не доступен). При выборе Item-а значение меняется во всех combobox-ах, давая доступ ко всем связанным textbox-ам (или не давая, на картинке другой способ).
Как сделать по уму, чтобы изменение выбранного значения combobox-а отвечало только за связанный ему textbox? Когда динамически создаю combobox работаю с событием: cmbBox.SelectedIndexChanged += (SelectedValueChange);
Пробовал через проверку фокуса контрола, что ошибочно, так как, проблема скорее всего в одинаковом событии у создаваемых combobox-ов. Но как сделать иначе, я что-то пока не догадался.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void SelectedValueChange(object sender, EventArgs e)
        {
            ComboBox cmb = (sender as ComboBox);
            if (cmb.Focused)
            {
                string id = cmb.Name;
                id = id.Replace("cmb", "");
 
                if (cmb.SelectedValue != "")
                {
                    //Ищем textbox
                    Control[] cntrls = flowLayoutPanel1.Controls.Find("txt" + id, false);
                    TextBox txt = cntrls[0] as TextBox;
                    if (txt.Tag == cmb.Tag) txt.Enabled = txt != null;
                }
            }
        }
Миниатюры
Создание нескольких Combobox с событием SelectedIndexChanged  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.06.2018, 13:51
Ответы с готовыми решениями:

ComboBox SelectedIndexChanged
Всем доброго дня. Есть три ComboBox, нужно после выбора в первом открыть второй. В Wpf нету SelectedIndexChanged. Но возможно...

Не срабатывает событие ComboBox.SelectedIndexChanged
Здравствуйте. Суть в следующем: нужно фильтровать данные по значениям комбобокса. У комбика установлен AutoCompleteMode, чтобы, когда...

Как привязать selectedindex к событию SelectedIndexChanged в ComboBox
Утро доброе! Имеется класс, наследуемый от GroupBox, в котором определен ComboBox и для него определено событие SelectedIndexChanged: ...

10
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
06.06.2018, 13:58
Цитата Сообщение от workerbro Посмотреть сообщение
Созданные контролы связаны по tag-у и id названии.
Вот Вам и ответ в Вашем же описании:

C#
1
2
3
4
if (cmb.Tag == "Некий тэг")
{
работаем с текстбоксом для этого тэга
}
1
3 / 3 / 4
Регистрация: 27.07.2015
Сообщений: 28
06.06.2018, 14:08  [ТС]
SeIZVeIZ, а ведь правда. Оказывается tag-и контролов сравниваются только через Equals (если не приводить их к String).
Но осталась другая проблема. При выборе Item-а в любом из combobox, значение выбираются во всех. Можете подсказать почему?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
06.06.2018, 14:15
workerbro, код покажите полный

Добавлено через 2 минуты
т.е момент создания комбобоксов и полный метод смены индексов как уже он вышел после тэгов
0
3 / 3 / 4
Регистрация: 27.07.2015
Сообщений: 28
06.06.2018, 14:22  [ТС]
SeIZVeIZ,

Кликните здесь для просмотра всего текста
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
 
        //Нумерация создаваемых контролов
        int A = 0;
        int B = 0;
        int C = 0;
        List<TextBox> textAdded = new List<TextBox>();
        private string[] str = { "", "Этап один", "Этап два", "Этап три" };
 
       //Создание combobox
        public ComboBox AddNewComboBox()
        {
            ComboBox cmbBox = new ComboBox
            {
                Parent = flowLayoutPanel1,
                Name = "cmb" + C,
                Tag = comboBox1.Text,
                Size = new Size(130, 23),
                Padding = new Padding(0, 6, 0, 0),
                DataSource = str
            };
            cmbBox.SelectedIndexChanged += (SelectedValueChange);
            C = C + 1;
            return cmbBox;
        }
 
        //Новый txtbox
        public TextBox AddNewTextBox(bool enabled)
        {
            TextBox text = new TextBox
            {
                Parent = flowLayoutPanel1,
                Name = "txt" + B,
                Size = new Size(345, 23),
                Tag = comboBox1.Text,
            };
            textAdded.Insert(B, text);
            if (!enabled) text.Enabled = false;
            B = B + 1;
            return text;
        }
        
        //Кнопка удаления
        public Button AddNewButton()
        {
            Button button = new Button
            {
                Parent = flowLayoutPanel1,
                Name = "btn" + A,
                Tag = comboBox1.Text,
                Size = new Size(75, 23),
                Text = @"Удалить",
                BackColor = Color.FromArgb(240,240,240)
            };
            button.Click += (DeleteButton);
            A = A + 1;
            return button;
        }
 
private void button1_Click(object sender, EventArgs e)
        {
                    AddNewComboBox();
                    AddNewTextBox(false);
                    AddNewButton();
        }
 
        private void SelectedValueChange(object sender, EventArgs e)
        {
            ComboBox cmb = (sender as ComboBox);
            if (cmb.Focused)
            {
                string id = cmb.Name;
                id = id.Replace("cmb", "");
 
                //Ищем textbox
                    Control[] cntrls = flowLayoutPanel1.Controls.Find("txt" + id, false);
                    TextBox txt = cntrls[0] as TextBox;
 
                if (cmb.SelectedValue != "")
                {
                    if (Equals(txt.Tag, cmb.Tag)) txt.Enabled = txt != null;
                }
                else txt.Enabled = false;
            }
        }
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
06.06.2018, 14:46
1) if (cmb.Focused) сравнивать Tag нужно вместо этого

2) судя по созданию у Вас в Tag всегда comboBox1.Text записывается, а там хоть меняется этот текст?
0
3 / 3 / 4
Регистрация: 27.07.2015
Сообщений: 28
06.06.2018, 14:56  [ТС]
SeIZVeIZ,
2) Да, там всегда разный текст.
1) По поводу этого момента. Если вы посмотрите по коду, я сравниваю это дальше:

C#
1
2
3
4
5
if (cmb.SelectedValue != "")
                {
                    if (Equals(txt.Tag, cmb.Tag)) txt.Enabled = txt != null;
                }
                else txt.Enabled = false;
Если я не использую Focused, то все textbox-ы при выборе item-а становятся активными (событие произошло для всех combobox-ов). А если использую, он помогает обратится только к тому combobox-у на который я нажал.
Сейчас получается проблема только в этом моменте: "При выборе Item-а в любом из combobox, значение выбираются во всех"
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
06.06.2018, 14:57
ах и да, код создания есть, вижу метод который это всё вызывает, но в каком месте это всё помещается на форму вашу?
0
3 / 3 / 4
Регистрация: 27.07.2015
Сообщений: 28
06.06.2018, 15:06  [ТС]
SeIZVeIZ, ммм, немного не понял. На форме лежит flowLayoutPanel, куда по нажатию button1_Click создается группа этих контролов
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
06.06.2018, 15:56
Лучший ответ Сообщение было отмечено workerbro как решение

Решение

workerbro, да я уже чуть позже заметил Parent, сейчас проверю точно скажу, суть Вашей проблемы в том что все созданные контролы связаны и при клике на 1 вызывается обработчик всех сразу, а этого быть не должно

Добавлено через 33 минуты
workerbro, Путём махинаций выяснилось что во всё виноват идентичный DataSource во всех комбобоксах, убрал из создания его + после добавил cmbBox.Items.AddRange(str); и всё, значения меняются только в том что выбрали и соответственно событие вызывается однажды итого Ваш метод как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ComboBox AddNewComboBox()
        {
            ComboBox cmbBox = new ComboBox
            {
                Parent = flowLayoutPanel1,
                Name = "cmb" + C,
                Tag = comboBox1.Text,
                Size = new Size(130, 23),
                Padding = new Padding(0, 6, 0, 0)
            };
            cmbBox.Items.AddRange(str);
            cmbBox.SelectedIndexChanged += SelectedValueChange;
            C++;
            return cmbBox;
        }
1
3 / 3 / 4
Регистрация: 27.07.2015
Сообщений: 28
07.06.2018, 06:38  [ТС]
SeIZVeIZ, спасибо! В DataSource и была проблема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2018, 06:38
Помогаю со студенческими работами здесь

Ассоциация нескольких элементов управления с одним событием
Ассоциация нескольких элементов управления с одним событием с помощью HANDLES! Для трех кнопок обработчик события нажатия кнопки,...

Динамическое создание массива кнопок с событием
Только начинаю копать C#, прошу сильно не пинать. Создаю массив кнопок с событием: Button btnDisk1; //////// ...

Создание нового элемента событием onclick
Добрый! В общем у меня есть элемент Div с кнопкой внизу. На при нажатии на кнопку (создается аналогичный Div с такой же кнопкой с теми же...

ListBox SelectedIndexChanged
У listBox autoPostBack=true. Поэтому когда происходит выделение, то происходит отправка формы. Несмотря на EnableViewState=true, выделение...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через 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-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru