Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
loidxxx
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
1

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

14.04.2014, 10:19. Просмотров 4963. Ответов 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;
        }
 Комментарий модератора 
Заливайте вложения на форум
0
Миниатюры
Выпадающий список в ячейках DataGridView  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2014, 10:19
Ответы с готовыми решениями:

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

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

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

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

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

20
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
14.04.2014, 12:43 2
В чём проблема-то? Вставляется третьей, остальные сдвигаются вправо. Ты как заголовки колонкам назначаешь? Может там несоответствие номеров?

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

Попробовал сделать DataRelation, вот только не могу сообразить как вывести в один DataGrid при этом без ИД Подразделения а только с его Названием....
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
15.04.2014, 09:48 4
Лучший ответ Сообщение было отмечено 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
loidxxx
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
15.04.2014, 09:57  [ТС] 5
Спасибо большое, это именно то что я искал
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
15.04.2014, 09:57 6
Забыл про типы:
C#
1
2
3
4
private OleDbConnection db_connection;
        private DataSet ds;
        private OleDbDataAdapter adapter_Books;
        private OleDbDataAdapter adapter_Series;
0
loidxxx
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
22.04.2014, 11:03  [ТС] 7
nmcf, может вы знаете как вставить в таблицу chekbox и чтобы checkbox заполнялся из базы???
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
22.04.2014, 11:23 8
Аналогично. Только добавляй DataGridViewCheckBoxColumn и устанавливай свойства DataPropertyName, TrueValue, FalseValue.
У тебя в БД поле соответствующее какой тип имеет?
0
loidxxx
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 21
22.04.2014, 11:26  [ТС] 9
В БД поле имеет тип tinyInt(1), его надо преобразовывать или как?
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
22.04.2014, 16:30 10
Не надо. Только укажи через TrueValue, FalseValue что считать "да", а что "нет".
Просто обычно есть булевский тип (в Access называется логический) и он по-хорошему сразу должен быть checkbox'ом в DataGridView.
1
Bisjaka
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 5
03.09.2015, 10:31 11
Добрый день уважаемые форумчане. Нужна ваша помощь. Перелопатила кучу форумов но так решения и не нашла. Есть две таблицы. Тип ПС и Проект. Во второй таблице есть столбец Код_ОКП_типа_ПС, который является форен кеем из Типа ПС. Вывожу данные из таблицы Проект в 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
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
04.09.2015, 08:53 12
А зачем 2 раза Insert()?
В таблицах нет ошибок?
0
Bisjaka
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 5
04.09.2015, 21:18 13
Да это я уже удалила, но никак не повлияло. В принципе проблему я решила, оказывается надо датасет не глобально объявлять а внутри метода и плюс его еще очищать. Но мне интересно почему когда я ставлю в свойства датагрида AutoSizeRowsMode - allcels, то такая ошибка появляется сразу при загрузке и даже датагрид не может загрузиться.
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
04.09.2015, 21:32 14
У меня как раз всё глобально сделано. Не знаю, почему у тебя локально вообще работает. Здесь надо проект видеть целиком.
0
Bisjaka
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 5
04.09.2015, 21:35 15
У меня был датасет до этого объявлен не в методе самом а глобально даже перед лоад форм. И ошибка эта вылазила постоянно. Теперь когда я перенесла объявление дата сета в сам метод по заполнению датагрида, все стало работать. А про AutoSizeRowsMode на многих форумах пишут, только я связи тут не вижу никакой.
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
04.09.2015, 21:39 16
Проект большой? Просто интересно посмотреть.
0
Bisjaka
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 5
04.09.2015, 21:59 17
Да большой, ну и плюс авторские права
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
04.09.2015, 22:03 18
Авторские права на проект с двумя таблицами?
0
Bisjaka
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 5
04.09.2015, 22:17 19
Две таблицы-это всего лишь подключение справочников, и их уже больше за день стало!
0
Max_D
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 5
06.11.2018, 19:50 20
Подскажите, как данные в базу сохранить обратно, то есть что бы что то выбрали в combobox сохранилось в базу?
0
06.11.2018, 19:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2018, 19:50

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

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

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


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

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

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