Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860

Заполнить combobox2 значениями из таблицы базы данных в соответствии со списком id из другой таблицы

26.06.2024, 23:55. Показов 1013. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется таблица 1. У меня отфильтровывается таблица БД в соответствии с выбранным пунктом в combobox1.
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
                using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Executive_Documentation.Properties.Settings.Database001ConnectionString"].ConnectionString))
                {
                    //Create the SqlDataAdapter instance by specifying the command text and connection object
                    SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT Id, id_Category_organizations, id_OPF_organizations FROM Table12_Category_OPF_organizations", connection);
 
                    //Creating DataTable Object
                    DataTable EmployeeDataTable = new DataTable();
 
                    //Filling the DataTable using the Fill Method of SqlDataAdapter object
                    dataAdapter.Fill(EmployeeDataTable);
 
                    //Creating DataView instance using DefaultView property of Data Table
                    DataView dataView1 = EmployeeDataTable.DefaultView;
 
                    //Applying Single Filter
                    int i = comboBox1.SelectedIndex + 1;
                    dataView1.RowFilter = "id_Category_organizations = " + i;
                    Console.WriteLine($"i = {i}");
                    Console.WriteLine($"Выбранная категория = {dataView1.RowFilter}");
                    foreach (DataRowView rowView in dataView1)
                    {
                        DataRow row = rowView.Row;
                        Console.WriteLine($"Id: {row["Id"]}, id_Category_organizations: {row["id_Category_organizations"]}, id_OPF_organizations: {row["id_OPF_organizations"]}");
                    }
                }
Как извлечь данные из таблицы 2 и заполнить ими combobox2 по id-ишникам отфильтрованным из таблицы 1?
Миниатюры
Заполнить combobox2 значениями из таблицы базы данных в соответствии со списком id из другой таблицы  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2024, 23:55
Ответы с готовыми решениями:

Создать таблицы базы данных. Соединить их соответствующими связями. Заполнить таблицы записями (по 10 шт.)
Помогите пожалуйста, может образец какой-то есть у кого, на самообучение дали Access. И задачки... а я понять не могу. Вот задачка. ...

UPDATE данных таблицы из другой таблицы другой базы данных
Добрый день! Прочитал на форму много на похожие темы, но у меня пока не выходит "каменный цветок". Суть в следующем:...

Выбрать данные из таблицы и заменить один столбец с id значениями из другой таблицы
Есть таблица A: A.ID | A.B_ID и таблица B: B.ID | B.TEXT где A.B_ID -> B.ID является указателем на соответствующую строку в...

8
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
27.06.2024, 00:27
Лучший ответ Сообщение было отмечено xamelione25 как решение

Решение

xamelione25, это можно сделать запросом вида
T-SQL
1
2
3
SELECT *
FROM table2
WHERE id IN (SLECT id FROM table1 WHERE ...)
Добавлено через 44 секунды
Цитата Сообщение от xamelione25 Посмотреть сообщение
Table12_Category_OPF_organizations
Интересное название таблицы. Что означает 12?
1
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
27.06.2024, 00:30  [ТС]
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Интересное название таблицы. Что означает 12?
Миниатюры
Заполнить combobox2 значениями из таблицы базы данных в соответствии со списком id из другой таблицы  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
27.06.2024, 01:22
xamelione25, то есть это просто сквозная нумерация. В этом нет смысла. Как и в префиксе Table_.
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
27.06.2024, 15:48  [ТС]
OwenGlendower, это я для себя, до удобства
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
07.07.2024, 23:58  [ТС]
OwenGlendower, получилось у меня так сделать:

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
        public void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex > -1)
            {
                comboBox2.Enabled = true;
                comboBox2.BackColor = Color.FromArgb(0xff, 0xff, 0xff);
 
                using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Executive_Documentation.Properties.Settings.Database001ConnectionString"].ConnectionString))
                {
                    //ComboBox1
                    //Создайте экземпляр SqlDataAdapter, указав текст команды и объект подключения
                    SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT Id, id_Category_organizations, id_OPF_organizations FROM Table12_Category_OPF_organizations", connection);
                    //Создание объекта с данными
                    DataTable EmployeeDataTable = new DataTable();
                    //Заполнение таблицы данных с использованием метода Fill объекта SqlDataAdapter
                    dataAdapter.Fill(EmployeeDataTable);
                    //Создание экземпляра представления данных с использованием свойства DefaultView таблицы данных
                    DataView dataView = EmployeeDataTable.DefaultView;
 
                    //Применение первого фильтра
                    int i = comboBox1.SelectedIndex + 1;
                    dataView.RowFilter = "id_Category_organizations = " + i;
 
                    //Применение второго фильтра
                    SqlDataAdapter dataAdapter1 = new SqlDataAdapter($"SELECT a.Id, a.Name_OPF_organizations FROM Table11_OPF_organizations a JOIN Table12_Category_OPF_organizations b ON b.id_OPF_organizations = a.Id", connection);
                    DataTable EmployeeDataTable1 = new DataTable();
                    dataAdapter1.Fill(EmployeeDataTable1);
                    comboBox2.DataSource = EmployeeDataTable1;
                    comboBox2.DisplayMember = "name_OPF_organizations";
                    comboBox2.ValueMember = "Id";
 
                    foreach (Control controlTextBox in this.Controls) // пробегаемся по элементом формы
                    {
                        if (controlTextBox is TextBox)
                        {
                            controlTextBox.Enabled = false;
                            controlTextBox.BackColor = Color.FromArgb(0xC0, 0xC0, 0xC0);
                        }
                    }
                    comboBox2.SelectedItem = null;
                    dateTimePicker1.Enabled = false;
                    dateTimePicker1.BackColor = Color.FromArgb(0xC0, 0xC0, 0xC0);
                    checkBox1.Checked = false;
                    checkBox2.Checked = false;
                    checkBox3.Checked = false;
                    checkBox1.Enabled = false;
                    checkBox2.Enabled = false;
                    checkBox3.Enabled = false;
 
                }
            }
        }

Не по теме:

Но теперь мне нужно подрегулировать ширину выпадающего списка combobox2, а она сильно узкая.
Пытаюсь вот так сделать после

C#
1
checkBox3.Enabled = false;
C#
1
2
3
4
5
6
                    const int CB_SETDROPPEDWIDTH = 0x0160;
                    const int CB_GETDROPPEDWIDTH = 0x015f;
                    internal static extern int SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
                    SendMessage(comboBox2.Handle, CB_SETDROPPEDWIDTH, 200, 0);
                    int retval = SendMessage(comboBox2.Handle, CB_GETDROPPEDWIDTH, 0, 0);
                    this.Text = retval.ToString();
Выскакивает на 3 строке компонент статические локальные функции недоступен в c# 7.3 используйте версию языка 8.0 или выше

Миниатюры
Заполнить combobox2 значениями из таблицы базы данных в соответствии со списком id из другой таблицы  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
08.07.2024, 00:43
Цитата Сообщение от xamelione25 Посмотреть сообщение
Но теперь мне нужно подрегулировать ширину выпадающего списка combobox2, а она сильно узкая.
Окей. Свойство DropDownWidth не работает что-ли раз вы за Windows API взялись?

Цитата Сообщение от xamelione25 Посмотреть сообщение
Выскакивает на 3 строке компонент статические локальные функции недоступен в c# 7.3 используйте версию языка 8.0 или выше
Перенесите объявление на уровень класса и добавьте атрибут DllImport.
C#
1
2
[DllImport("user32.dll")]
internal static extern int SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
А еще лучше в таком случае сделать метод расширения для comboBox чтобы спрятать детали реализации.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class Extensions
{
    public static int GetDroppedWidth(this ComboBox comboBox)
    {
        return SendMessage(comboBox.Handle, CB_GETDROPPEDWIDTH, IntPtr.Zero, IntPtr.Zero);
    }
 
    public static void SetDroppedWidth(this ComboBox comboBox, int width)
    {
        SendMessage(comboBox.Handle, CB_SETDROPPEDWIDTH, new IntPtr(width), IntPtr.Zero);
    }
 
    const int CB_SETDROPPEDWIDTH = 0x0160;
    const int CB_GETDROPPEDWIDTH = 0x015f;
 
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);
}
Использование
C#
1
2
comboBox2.SetDroppedWidth(200);
this.Text = comboBox2.GetDroppedWidth();
1
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
08.07.2024, 21:59  [ТС]
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Окей. Свойство DropDownWidth не работает что-ли раз вы за Windows API взялись?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private int DropDownWidth(ComboBox myCombo) // выравнивание combobox под ширину максимального пункта
        {
            int maxWidth = 0, temp = 0;
            foreach (var obj in myCombo.Items)
            {
                temp = TextRenderer.MeasureText(myCombo.GetItemText(obj), myCombo.Font).Width;
                if (temp > maxWidth)
                {
                    maxWidth = temp;
                }
            }
            return maxWidth + SystemInformation.VerticalScrollBarWidth;
        }
Вроде получилось ... ширина работает ... но у меня теперь ...
В combobox2 вылетает список из суммы списков всех вариантов выбора (к примеру "бвгдбвгдбвгдабвгд")
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
        public void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex > -1)
            {
                comboBox2.Enabled = true;
                comboBox2.BackColor = Color.FromArgb(0xff, 0xff, 0xff);
 
                using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Executive_Documentation.Properties.Settings.Database001ConnectionString"].ConnectionString))
                {
                    //ComboBox1
                    //Создайте экземпляр SqlDataAdapter, указав текст команды и объект подключения
                    SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT Id, id_Category_organizations, id_OPF_organizations FROM Table12_Category_OPF_organizations", connection);
                    //Создание объекта с данными
                    DataTable EmployeeDataTable = new DataTable();
                    //Заполнение таблицы данных с использованием метода Fill объекта SqlDataAdapter
                    dataAdapter.Fill(EmployeeDataTable);
                    //Создание экземпляра представления данных с использованием свойства DefaultView таблицы данных
                    DataView dataView = EmployeeDataTable.DefaultView;
 
                    //Применение первого фильтра
                    int i = comboBox1.SelectedIndex + 1;
                    dataView.RowFilter = "id_Category_organizations = " + i;
 
                    //Применение второго фильтра
                    SqlDataAdapter dataAdapter1 = new SqlDataAdapter($"SELECT a.Id, a.Name_OPF_organizations FROM Table11_OPF_organizations a JOIN Table12_Category_OPF_organizations b ON b.id_OPF_organizations = a.Id", connection);
                    DataTable EmployeeDataTable1 = new DataTable();
                    dataAdapter1.Fill(EmployeeDataTable1);
                    comboBox2.DataSource = EmployeeDataTable1;
                    comboBox2.DisplayMember = "Name_OPF_organizations";
                    comboBox2.ValueMember = "Id";
 
                    foreach (Control controlTextBox in this.Controls) // пробегаемся по элементом формы
                    {
                        if (controlTextBox is TextBox)
                        {
                            controlTextBox.Enabled = false;
                            controlTextBox.BackColor = Color.FromArgb(0xC0, 0xC0, 0xC0);
                        }
                    }
                    comboBox2.SelectedItem = null;
                    dateTimePicker1.Enabled = false;
                    dateTimePicker1.BackColor = Color.FromArgb(0xC0, 0xC0, 0xC0);
                    checkBox1.Checked = false;
                    checkBox2.Checked = false;
                    checkBox3.Checked = false;
                    checkBox1.Enabled = false;
                    checkBox2.Enabled = false;
                    checkBox3.Enabled = false;
                    comboBox2.DropDownWidth = DropDownWidth(comboBox2);
                }
            }
        }
 
        private void ComboBox2_SelectedIndexChanged(object sender, EventArgs e)
        { 
            if (comboBox2.SelectedIndex > -1)
            {
                foreach (Control controlTextBox in this.Controls) // пробегаемся по элементом формы
                {
                    if (controlTextBox is TextBox)
                    {
                        controlTextBox.Enabled = true;
                        controlTextBox.BackColor = Color.FromArgb(0xff, 0xff, 0xff);
                    }
                }
                textBox20.Enabled = false;
                textBox21.Enabled = false;
                textBox24.Enabled = false;
                dateTimePicker1.Enabled = true;
                dateTimePicker1.BackColor = Color.FromArgb(0xff, 0xff, 0xff);
                checkBox1.Enabled = true;
                checkBox2.Enabled = true;
                checkBox3.Enabled = true;
            }
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
14.07.2024, 19:13
xamelione25, наверное вы уже сами решили, но все равно напишу ответ.

Цитата Сообщение от xamelione25 Посмотреть сообщение
В combobox2 вылетает список из суммы списков всех вариантов выбора (к примеру "бвгдбвгдбвгдабвгд")
В коде ошибок не вижу. Похоже что выводится то что возвращает запрос.

Цитата Сообщение от xamelione25 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
                    foreach (Control controlTextBox in this.Controls) // пробегаемся по элементом формы
                    {
                        if (controlTextBox is TextBox)
                        {
                            controlTextBox.Enabled = false;
                            controlTextBox.BackColor = Color.FromArgb(0xC0, 0xC0, 0xC0);
                        }
                    }
Данный код можно упростить если добавить OfType. Блок if тогда не понадобится.
C#
1
2
3
4
5
                    foreach (Control controlTextBox in this.Controls.OfType<TextBox>()) // пробегаемся по элементом формы
                    {
                        controlTextBox.Enabled = false;
                        controlTextBox.BackColor = Color.FromArgb(0xC0, 0xC0, 0xC0);
                    }
И раз вы это делаете в двух местах, то код стоит вынести в отдельный метод
C#
1
2
3
4
5
6
7
8
private void SetTextBoxProperties(bool enabled, Color backColor)
{
    foreach (Control controlTextBox in this.Controls.OfType<TextBox>())
    {
        controlTextBox.Enabled = enabled;
        controlTextBox.BackColor = backColor;
    }
}
Использование:
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
        public void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex > -1)
            {
                ...
 
                using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Executive_Documentation.Properties.Settings.Database001ConnectionString"].ConnectionString))
                {
                    ...
                    
                    SetTextBoxProperties(false, Color.FromArgb(0xC0, 0xC0, 0xC0));
 
                    ...
                }
            }
        }
 
        private void ComboBox2_SelectedIndexChanged(object sender, EventArgs e)
        { 
            if (comboBox2.SelectedIndex > -1)
            {
                SetTextBoxProperties(true, Color.FromArgb(0xff, 0xff, 0xff));
                ...
            }
        }

Цитата Сообщение от xamelione25 Посмотреть сообщение
C#
10
11
12
13
14
15
16
17
18
                    //ComboBox1
                    //Создайте экземпляр SqlDataAdapter, указав текст команды и объект подключения
                    SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT Id, id_Category_organizations, id_OPF_organizations FROM Table12_Category_OPF_organizations", connection);
                    //Создание объекта с данными
                    DataTable EmployeeDataTable = new DataTable();
                    //Заполнение таблицы данных с использованием метода Fill объекта SqlDataAdapter
                    dataAdapter.Fill(EmployeeDataTable);
                    //Создание экземпляра представления данных с использованием свойства DefaultView таблицы данных
                    DataView dataView = EmployeeDataTable.DefaultView;
Зачем вам этот код если результат запроса не используется? И почему DataTable называется EmployeeDataTable (таблица сотрудников) хотя у вас совсем не сотрудники? Такое ощущение что вы бездумно скопировали чужой пример.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.07.2024, 19:13
Помогаю со студенческими работами здесь

Ограничить значение поля таблицы значениями полей другой таблицы
У меня в БД есть две таблицы: 1) Дома. Поля: id, дата постройки, дата сноса; 2) Жильцы. Поля: id, id_дом, дата заселения. Как в БД...

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

Выборка из таблицы на значениях между значениями другой таблицы
Добрый день! Туплю с запросом select t1.* From t1, t2 Where (t1.a1 between t2.a3 and t2.a8) Access просто повисает без признаков...

[MasterSCADA 4D] Заполнение выпадающего списка значениями из поля таблицы базы данных
Здравствуйте! Есть ли возможность заполнить объект выпадающего списка значениями из поля таблицы базы данных? И как примерно это...

Заполнить комбобокс из таблицы базы данных
Создал тестовое приложение, сделал DataModule, положил туда TableAdapter, который вытаскивает список баз данных сделал форму fLogin, на...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
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