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

Как связать несколько ComboBox

30.05.2019, 21:06. Показов 9734. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возник вопрос: как связать между собой три comboBox`а: Отдел, Подразделение и Сотрудник? В БД(phpmyadmin) имеются три отдела, в которых по одному подразделению, но в некоторых подразделения имеется по два сотрудника. В данный момент при запуске формы в comboBox`ах Отдел и Подразделение присутствуют по пять записей в каждом (повторяются те названия отделов/подразделений, где работают по два сотрудника). Например: выбираю номер отдела и отображаются номера подразделений только этого отдела. Буду рад любому совету.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2019, 21:06
Ответы с готовыми решениями:

Связать несколько comboBox-ов
Доброго времени суток! Есть две таблицы БД связанные между собой внешним ключом, отображаются они на форме в comboBox, надо сделать так...

Как связать TextBox с Combobox?
Добрый день! Сразу оговорюсь, что в теме пытаюсь разобраться практически с нуля, так что извините, если какие-то вопросы покажутся совсем...

Как связать comboBox и dateTimePicker ?
Доброго времени суток! Прошу вас помощи в моем приложении: нужно связать два поля для получения перечня и общего числа свободных и...

10
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
31.05.2019, 12:06
Лучший ответ Сообщение было отмечено Jestky как решение

Решение

Цитата Сообщение от Jestky Посмотреть сообщение
выбираю номер отдела и отображаются номера подразделений только этого отдела
рабочий пример: Нужно сделать 2 combobox и чтобы они были связаны с таблицами
1
0 / 0 / 0
Регистрация: 30.05.2019
Сообщений: 29
31.05.2019, 18:31  [ТС]
Решил пока не заморачиваться с тремя комбоБоксами, остановился на двух (отдел/подразделение). С выводом отделов проблем нет, но как вывести во второй комбоБокс зависимые от отдела подразделения вообще не соображаю.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MySqlConnection connection = new MySqlConnection("Datasource=localhost;port=3306;username=root;password=;Database=proverka;");
private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM unit ORDER BY name", connection);
                DataTable dt = new DataTable();
                da.Fill(dt);
                comboBox1.DataSource = dt;
                comboBox1.DisplayMember = "unit";
                comboBox1.ValueMember = "name";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
01.06.2019, 09:15
Лучший ответ Сообщение было отмечено Jestky как решение

Решение

Цитата Сообщение от Jestky Посмотреть сообщение
как вывести во второй комбоБокс зависимые от отдела подразделения вообще не соображаю.
Очевидно, при смене значения в первом комбобоксе нужно выполнять запрос, в который подставлять выбранное значение
1
0 / 0 / 0
Регистрация: 30.05.2019
Сообщений: 29
01.06.2019, 16:41  [ТС]
Попробовал после смены значения в первом комбоБоксе выполнять запрос, итог: второй комбоБокс пустой. Я думаю, что я ввёл неправильный запрос.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                MySqlDataAdapter da1 = new MySqlDataAdapter("SELECT s.namek FROM subdivision s WHERE s.unitregistrationnumber = ' " + comboBox1.SelectedItem.ToString() + " ' ", connection);
                DataTable dt1 = new DataTable();
                da1.Fill(dt1);
                comboBox2.DataSource = dt1;
                comboBox2.DisplayMember = "subdivision";
                comboBox2.ValueMember = "namek";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Также я пробовал решить мою задачу с помощью Вашего примера. Но при создании отношения между таблицами появляется сообщение "Аргумент "column" не может быть пустым.". Хотя все таблицы полностью заполнены.
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
MySqlConnection connection;
        MySqlDataAdapter adapterOtdel;
        MySqlDataAdapter adapterPodrazdel;
        DataSet dataSet;
        BindingSource bindingSourceOtdel;
        BindingSource bindingSourcePodrazdel;
        ComboBox comboOtdel;
        ComboBox comboPodrazdel;
        public Form1()
        {
            InitializeComponent();
            connection = new MySqlConnection("Datasource=localhost;port=3306;username=root;password=;Database=proverka;");
            adapterOtdel = new MySqlDataAdapter("SELECT name FROM unit;", connection);
            adapterPodrazdel = new MySqlDataAdapter("SELECT namek FROM subdivision", connection);
            dataSet = new DataSet();
            adapterOtdel.Fill(dataSet, "unit");
            adapterPodrazdel.Fill(dataSet, "subdivision");
            dataSet.Relations.Add("otdel-podrazdel",
                dataSet.Tables["unit"].Columns["registrationnumber"],//первичный главки
                dataSet.Tables["subdivision"].Columns["unitregistrationnumber"]);//внешка дочерней
            bindingSourceOtdel = new BindingSource(dataSet, "unit");
            bindingSourcePodrazdel = new BindingSource(bindingSourceOtdel, "otdel-podrazdel");
        }
private void Form1_Load(object sender, EventArgs e)
        {
            bindingSourceOtdel = new BindingSource();
            bindingSourcePodrazdel = new BindingSource();
            bindingSourceOtdel.DataSource = dataSet.Tables["unit"];
            bindingSourcePodrazdel.DataSource = bindingSourceOtdel;
            bindingSourcePodrazdel.DataMember = "otdel-podrazdel";
            comboBox1.DataSource = bindingSourceOtdel;
            comboBox1.ValueMember = "registrationnumber";
            comboBox1.DisplayMember = "name";
            
        }
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
01.06.2019, 17:32
Лучший ответ Сообщение было отмечено Jestky как решение

Решение

Цитата Сообщение от Jestky Посмотреть сообщение
итог: второй комбоБокс пустой. Я думаю, что я ввёл неправильный запрос
Посмотрите что у Вас в comboBox1.SelectedItem. Скорее всего там не unitregistrationnumber.
Цитата Сообщение от Jestky Посмотреть сообщение
Но при создании отношения между таблицами появляется сообщение "Аргумент "column" не может быть пустым.". Хотя все таблицы полностью заполнены.
Тут не могу сказать в чем дело... С виду, вроде, все правильно...
1
0 / 0 / 0
Регистрация: 30.05.2019
Сообщений: 29
01.06.2019, 18:02  [ТС]
Имеете ввиду, что в comboBox1.SelectedItem вставить первичный ключ из главной таблицы (comboBox1.SelectedItem = "registrationnumber"; ), а уже при смене значения в нём прописать запрос, где будет связь внешнего ключа и первичного ("SELECT s.namek FROM subdivision s WHERE s.unitregistrationnumber = ' " + comboBox1.SelectedItem.ToString() + " ' ", connection); ) ? Мои мысли двигаются в правильном направлении?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM unit ORDER BY name", connection);
                DataTable dt = new DataTable();
                da.Fill(dt);
                comboBox1.DataSource = dt;
                comboBox1.SelectedItem = "registrationnumber"; // первичный ключ главной таблицы "unit"
                comboBox1.DisplayMember = "unit";
                comboBox1.ValueMember = "name";
 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
// собственно, связь unit.registrationnumber = s.unitregistrationnumber
                MySqlDataAdapter da1 = new MySqlDataAdapter("SELECT s.namek FROM subdivision s WHERE s.unitregistrationnumber = ' " + comboBox1.SelectedItem.ToString() + " ' ", connection); 
                DataTable dt1 = new DataTable();
                da1.Fill(dt1);
                comboBox2.DataSource = dt1;
                comboBox2.DisplayMember = "subdivision";
                comboBox2.ValueMember = "namek";
            }
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
01.06.2019, 18:08
Лучший ответ Сообщение было отмечено Jestky как решение

Решение

Цитата Сообщение от Jestky Посмотреть сообщение
Имеете ввиду, что в comboBox1.SelectedItem вставить первичный ключ из главной таблицы
Нет, в comboBox1.SelectedItem ничего вставлять не нужно! Просто в SelectedItem, скорее всего, содержится строка таблицы. Разумеется, если Вы всю строку вставите в запрос, то он ничего не найдет. Попробуйте использовать не SelectedItem, а SelectedValue. Либо извлеките из SelectedItem столбец с unitregistrationnumber (ну или по чему там выборку нужно делать)
1
0 / 0 / 0
Регистрация: 30.05.2019
Сообщений: 29
01.06.2019, 19:30  [ТС]
В comboBox1.SelectedItem по проверке выводит "Selected Item Text: System.Data.DataRowView". Получается в comboBox1.SelectedItem лежит System.Data.DataRowView.
C#
1
2
3
4
5
6
public object SelectedItem { get; set; }
 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Object selectedItem = comboBox1.SelectedItem;
            MessageBox.Show("Selected Item Text: " + selectedItem.ToString());
        }
Добавлено через 53 минуты
Теперь, как Вы и сказали, мне нужно из SelectedItem вытащить столбец (unitregistrationnumber), являющийся внешним ключом для таблицы unit. Попробую, после отпишу в тему.
0
0 / 0 / 0
Регистрация: 30.05.2019
Сообщений: 29
01.06.2019, 20:49  [ТС]
Попробовал использовать SelectedValue как Вы и сказали. Итог: при выборе номера отдела в первом комбоБоксе, второй комбоБокс отображает подразделения (а точнее их количество), которые находятся в выбранном отделе.
Кликните здесь для просмотра всего текста

Я уже пробовал менять код так, чтобы мне первый комбоБокс отображал названия отделов, а второй названия подразделений, которые входят в этот отдел, но всё четно. Может Вы подскажите мне как изменить его правильно.
Вот сам код:
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
private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                MySqlConnection("Datasource=localhost;port=3306;username=root;password=;Database=proverka;");
                MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM unit ORDER BY name", connection);
                DataTable dt = new DataTable();
                da.Fill(dt);
                comboBox1.DataSource = dt; 
                comboBox1.DisplayMember = "unit";
                comboBox1.ValueMember = "registrationnumber";
               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                MySqlDataAdapter da1 = new MySqlDataAdapter("SELECT * FROM subdivision s WHERE s.unitregistrationnumber = ' " + comboBox1.SelectedValue + " ' ", connection);
                DataTable dt1 = new DataTable();
                da1.Fill(dt1);
                comboBox2.DataSource = dt1;
                comboBox2.DisplayMember = "subdivision";
                comboBox2.ValueMember = "unitregistrationnumber";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
0
0 / 0 / 0
Регистрация: 30.05.2019
Сообщений: 29
01.06.2019, 22:04  [ТС]
Всё получилось, добавил дополнительный comboBox1.ValueMember ="название нужного столбца" и comboBox1.ValueMember ="название нужного столбца".
C#
1
2
3
4
5
6
7
8
comboBox1.DataSource = dt; 
                comboBox1.DisplayMember = "unit";
                comboBox1.ValueMember = "name"; // тот самый дополнительный ValueMember
                comboBox1.ValueMember = "registrationnumber";
comboBox2.DataSource = dt1;
                comboBox2.DisplayMember = "subdivision";
                comboBox2.ValueMember = "namek"; //тот самый дополнительный ValueMember
                comboBox2.ValueMember = "unitregistrationnumber";
Добавлено через 1 минуту
asn31337, спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2019, 22:04
Помогаю со студенческими работами здесь

Как связать Combobox и ObservableCollection в проекте WF?
Собственно сабж

Как связать combobox c Report (отчётом)?
Помогите пожалуйста. Создаю базу данных на C#, таблицы беру с SQL. Нужно создать отчёт с запросом, т.е. я хочу выбрать код услуги и все...

Как связать несколько форм в одну?
Как связать несколько форм в одну? Где можно найти уроки или прочитать об этом? Допустим, есть несколько с горем пополам созданных...

Как связать Combobox со строкой в MS SQL Server? (система авторизации)
В общем, на форме есть combobox, textbox и кнопка "Войти". Необходимо связать эти обьекты с БД на MS SQL Server. ЭТО ВХОД ДЛЯ...

Как связать два combobox так, что бы они зависили друг от друга, через базу данных?
Доброго времени суток. Я начинающий программист. Решил написать программу, для удобства работы. Но столкнулся с непреодолимой для меня...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru