Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/104: Рейтинг темы: голосов - 104, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21

Выпадающий список в ячейках DataGridView

14.04.2014, 10:19. Показов 19470. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла такая проблема не знаю как правильно вставить ComboBox в ячейку DataGridView. Имеется база MySQL в ней две таблицы Подразделение(Subdivision) и Журнал(Journal), вообщем в DataGridView вывожу таблицу Журнал и посредством DataGridViewComboBoxColumn делаю список из подразделений добавляю в таблицу Журнал и все данные которые уже были введены по подразделениям смещаются на следующий столбец, как это исправить???

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
 
        MySqlConnection myConnection = new MySqlConnection();
        MySqlDataAdapter DateAdapter;
        DataSet myDataSet = new DataSet();
 
public void UpdateTable()
        {
           
            myConnection.ConnectionString = "Database=test;Data Source=localhost;User Id=root;Password=123";
            myConnection.Open();
            DateAdapter = new MySqlDataAdapter("SELECT journal.Id,journal.Date,journal.defect,subdivision.name,journal.mark,journal.iduser "+
                                                                        "FROM journal LEFT OUTER JOIN subdivision ON journal.idsubdivision = subdivision.Id", myConnection);
            DateAdapter.Fill(myDataSet);
            if (myDataSet.Tables.Count > 0)
             dataGridView1.DataSource = myDataSet.Tables[0];
             DataGridViewComboBoxColumn comboboxColumn;
             DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
             comboboxColumn = column;
             SetAlternateChoicesUsingDataSource(comboboxColumn);
             dataGridView1.Columns.Insert(3, comboboxColumn);
      myConnection.Close();
 
private void SetAlternateChoicesUsingDataSource(DataGridViewComboBoxColumn comboboxColumn)
        {
            {
                comboboxColumn.DataSource = RetrieveAlternativeTitles();
                comboboxColumn.ValueMember = ColumnName.Subdivision.ToString();
                comboboxColumn.DisplayMember = comboboxColumn.ValueMember;
            }
        }
 
        private DataTable RetrieveAlternativeTitles()
        {
            return Subdivision("SELECT subdivision.name FROM subdivision");
        }
 
        private DataTable Subdivision(string sqlCommand)
        {
 
            MySqlCommand command = new MySqlCommand(sqlCommand, myConnection);
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            adapter.SelectCommand = command;
 
            DataTable table = new DataTable();
            table.Locale = System.Globalization.CultureInfo.InvariantCulture;
            adapter.Fill(table);
 
            return table;
        }
 Комментарий модератора 
Заливайте вложения на форум
Миниатюры
Выпадающий список в ячейках DataGridView  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2014, 10:19
Ответы с готовыми решениями:

Формат чисел в ячейках DataGridView
Есть DataGridView, туда вносятся данные в формате double и нужно их красиво отобразить. Какое свойство используется для подобного...

Проверка на повторение содержимого в ячейках таблицы в DataGridView
Собственно из названия темы всё понятно, подскажите пожалуйста как реализовать такую функцию? Заранее признателен за помощь.

Выпадающий список
Всем привет! Помогите решить следующую проблемку.У меня в задании написано на всех формах для таблиц необходимо отобразить все поля кроме...

20
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.04.2014, 12:43
В чём проблема-то? Вставляется третьей, остальные сдвигаются вправо. Ты как заголовки колонкам назначаешь? Может там несоответствие номеров?

Вообще, насколько я знаю, при выборке в DataGrid набора более чем из 1 таблицы не возможно использовать стандартные средства DataGrid'а для записи изменений в БД .
Если хочешь выбирать в выпадающем списке подразделение в журнале, то надо делать не так. Сначала выбираешь Журнал и Подразделения в две таблицы внутри одного DataSet (каждую своим SELECT без JOIN). Затем назначаешь связи DataRelation. И затем добавляешь колонку в Журнал, указывая DataSource, DisplayMember и ValueMember по таблице Подразделений. После этого связь работает автоматически.
0
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
15.04.2014, 04:43  [ТС]
Заголовки колонок тут не причем, здесь проблема в том что мне нужно вставить в DataGrid список для выбора подразделения, но если у нас уже заполнены подразделения то они должны сразу быть выбраны а не сдвигаться вправо как это видно на картинке...

Попробовал сделать DataRelation, вот только не могу сообразить как вывести в один DataGrid при этом без ИД Подразделения а только с его Названием....
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.04.2014, 09:48
Лучший ответ Сообщение было отмечено loidxxx как решение

Решение

Привожу пример с использованием базы Access. Есть 2 таблицы: основная Books (сожержит внешний ключ bSeries) и связанная Series (sNumber - первичный ключ, sName - текстовое представление). Связь по Books.bSeries = Series.sNumber. Требуется вывести Books в DataGrid, но вместо кода bSeries отображать выпадающий список, содержащий значения sName. Отображение предыдущего выбора также реализуется.

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
            ds = new DataSet();
            db_connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=books.accdb");
            db_connection.Open();
 
            adapter_Books = new OleDbDataAdapter(new OleDbCommand("SELECT * FROM Books ORDER BY bNumber", db_connection));
            var cb_adapter_Books = new OleDbCommandBuilder(adapter_Books);
 
            adapter_Series = new OleDbDataAdapter(new OleDbCommand("SELECT * FROM Series ORDER BY sName", db_connection));
            var cb_Series = new OleDbCommandBuilder(adapter_Series);
 
            adapter_Books.Fill(ds, "Books"); // прочитать books
            adapter_Series.Fill(ds, "Series"); // прочитать series
 
            db_connection.Close();
 
            ds.Tables["Series"].Columns["sName"].Unique = true;
 
            // Установка связи таблиц Books.bSeries = Series.sNumber
            ds.Relations.Add(new DataRelation("rlSeriesBooks", ds.Tables["Series"].Columns["sNumber"], ds.Tables["Books"].Columns["bSeries"]));
 
            dataGridView1.DataSource = ds.Tables["Books"]; // Books - в DataGrid
 
            dataGridView1.Columns["bSeries"].Visible = false; // скрыть колонку с идентификатором
 
            var cbx_Series = new DataGridViewComboBoxColumn(); // добавить новую колонку
            cbx_Series.Name = "Серия";
            cbx_Series.DataSource = ds.Tables["Series"];
            cbx_Series.DisplayMember = "sName"; // Отображать из Series
            cbx_Series.ValueMember = "sNumber";
            cbx_Series.DataPropertyName = "bSeries"; // Для связи с Books
            cbx_Series.MaxDropDownItems = 10;
            cbx_Series.FlatStyle = FlatStyle.Flat;
            dataGridView1.Columns.Insert(5, cbx_Series);
            dataGridView1.Columns[5].Width = 200;
Добавлено через 8 минут
Чтобы это заработало, необходимо создание связи DataRelation и правильно заполнение полей DisplayMember, ValueMemeber и DataPropertyName при создании новой колонки. Колонка с внешним ключом просто делается невидимой, совсем удалять её нельзя.
4
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
15.04.2014, 09:57  [ТС]
Спасибо большое, это именно то что я искал
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.04.2014, 09:57
Забыл про типы:
C#
1
2
3
4
private OleDbConnection db_connection;
        private DataSet ds;
        private OleDbDataAdapter adapter_Books;
        private OleDbDataAdapter adapter_Series;
0
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
22.04.2014, 11:03  [ТС]
nmcf, может вы знаете как вставить в таблицу chekbox и чтобы checkbox заполнялся из базы???
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.04.2014, 11:23
Аналогично. Только добавляй DataGridViewCheckBoxColumn и устанавливай свойства DataPropertyName, TrueValue, FalseValue.
У тебя в БД поле соответствующее какой тип имеет?
0
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
22.04.2014, 11:26  [ТС]
В БД поле имеет тип tinyInt(1), его надо преобразовывать или как?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.04.2014, 16:30
Не надо. Только укажи через TrueValue, FalseValue что считать "да", а что "нет".
Просто обычно есть булевский тип (в Access называется логический) и он по-хорошему сразу должен быть checkbox'ом в DataGridView.
1
0 / 0 / 1
Регистрация: 03.09.2015
Сообщений: 19
03.09.2015, 10:31
Добрый день уважаемые форумчане. Нужна ваша помощь. Перелопатила кучу форумов но так решения и не нашла. Есть две таблицы. Тип ПС и Проект. Во второй таблице есть столбец Код_ОКП_типа_ПС, который является форен кеем из Типа ПС. Вывожу данные из таблицы Проект в DataGridView. Настроила все как выше, но при загрузке выпадает ошибка. "Исключение в DataGridView: Недопустимое значение DataGridViewComboBoxCell"
Кликните здесь для просмотра всего текста
con.Open(); // открываем подключение
proekt.Clear(); //очищаем набор данных
OleDbCommand command = new OleDbCommand
("SELECT * FROM Проект", con);// sql запрос
OleDbDataAdapter adp = new OleDbDataAdapter(command); // новый адаптер нужен для заполнения набора данных
OleDbCommand command1 = new OleDbCommand
("SELECT * FROM Тип_ПС", con);
OleDbDataAdapter adp1 = new OleDbDataAdapter(command1); // адаптер

adp.Fill(proekt, "Проект"); // заполняем набор данных данными, которые вернул запрос
adp1.Fill(proekt, "Тип_ПС"); // заполнение набора данных

con.Close(); //закрываем подключение

proekt.Tables["Тип_ПС"].Columns["Название"].Unique = true;

// Установка связи таблиц Тип_ПС.Код = Проект.Код_ОКП_типа_ПС
proekt.Relations.Add(new DataRelation("rlTipPSProekt", proekt.Tables["Тип_ПС"].Columns["Код"], proekt.Tables["Проект"].Columns["Код_ОКП_типа_ПС"]));

dataGridView3.DataSource = proekt.Tables["Проект"]; // Проект - в DataGrid
DataGridViewComboBoxColumn tip_ps = new DataGridViewComboBoxColumn(); // добавить новую колонку

tip_ps.Name = "Тип ПС";
tip_ps.DataSource = kkps.Tables["Тип_ПС"];
tip_ps.DisplayMember = "Название"; // Отображать из Тип_ПС
tip_ps.ValueMember = "Код";
tip_ps.DataPropertyName = "Код_ОКП_типа_ПС"; // Для связи с Проектом
tip_ps.FlatStyle = FlatStyle.Flat;
dataGridView3.Columns.Insert(9, tip_ps);
dataGridView3.Columns.Insert(9, tip_ps);
dataGridView3.Columns[9].Width = 200;
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.09.2015, 08:53
А зачем 2 раза Insert()?
В таблицах нет ошибок?
0
0 / 0 / 1
Регистрация: 03.09.2015
Сообщений: 19
04.09.2015, 21:18
Да это я уже удалила, но никак не повлияло. В принципе проблему я решила, оказывается надо датасет не глобально объявлять а внутри метода и плюс его еще очищать. Но мне интересно почему когда я ставлю в свойства датагрида AutoSizeRowsMode - allcels, то такая ошибка появляется сразу при загрузке и даже датагрид не может загрузиться.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.09.2015, 21:32
У меня как раз всё глобально сделано. Не знаю, почему у тебя локально вообще работает. Здесь надо проект видеть целиком.
0
0 / 0 / 1
Регистрация: 03.09.2015
Сообщений: 19
04.09.2015, 21:35
У меня был датасет до этого объявлен не в методе самом а глобально даже перед лоад форм. И ошибка эта вылазила постоянно. Теперь когда я перенесла объявление дата сета в сам метод по заполнению датагрида, все стало работать. А про AutoSizeRowsMode на многих форумах пишут, только я связи тут не вижу никакой.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.09.2015, 21:39
Проект большой? Просто интересно посмотреть.
0
0 / 0 / 1
Регистрация: 03.09.2015
Сообщений: 19
04.09.2015, 21:59
Да большой, ну и плюс авторские права
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.09.2015, 22:03
Авторские права на проект с двумя таблицами?
0
0 / 0 / 1
Регистрация: 03.09.2015
Сообщений: 19
04.09.2015, 22:17
Две таблицы-это всего лишь подключение справочников, и их уже больше за день стало!
0
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
06.11.2018, 19:50
Подскажите, как данные в базу сохранить обратно, то есть что бы что то выбрали в combobox сохранилось в базу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.11.2018, 19:50
Помогаю со студенческими работами здесь

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

C# выпадающий список
Доброго дня. Подскажите, пожалуйста, как организовать выпадающий список со значениями, взятыми из БД. Также необходимо чтобы из БД...

выпадающий список в ComboBox
Здравствуйте!!! У меня дипломная работа и пишу на C#, мне нужно сделать выпадающий список в ComboBox. т.е есть три Combobox (Republic,...

PropertyGrid - выпадающий список объектов
Я формирую список выпадающих значений в PropertyGrid программно. Я хочу чтобы пользователь выбирал в выпадающем списке один из моих...

Выпадающий список после точки
Как сделать, чтобы в RichTextBox/TextBox после ввода точки выпадал список по типу System.<список> , как в средах...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru