Как связать две таблицы с помощью DataGridViewComboBoxColumn?

118
23 декабря 2020, 19:40

У меня есть две таблицы Timetable и Services связанные по ID_Service. Timetable представлена как DataGrid. Мне нужно чтобы в Timetable появился новый столбец вида DataGridViewComboBoxColumn, который бы заполнялся значениями из столбца Name_service таблицы Services. Причем этот столбец должен согласовываться с ID_Service, т.е. в выпадающем комбобоксе я выбираю значение, и согласно этому значению в столбце ID_Service устанавливается айди. Я совсем новичок в этом, подскажите пожалуйста, как можно такое реализовать

Answer 1

Я сделал полный пример приложения. Его можно скопировать и запустить.

using System;
using System.Data;
using System.Windows.Forms;
namespace WinFormApp1
{
    public partial class Form1 : Form
    {
        DataGridView dataGridView;
        public Form1()
        {
            //InitializeComponent();            
            Width = 500;
            var timeTable = new DataTable("timeTable");
            timeTable.Columns.Add("ID_Timetable", typeof(int));
            timeTable.Columns.Add("Date", typeof(DateTime));
            timeTable.Columns.Add("ID_Service", typeof(int));
            timeTable.Rows.Add(6, new DateTime(2019, 05, 18));
            timeTable.Rows.Add(7, new DateTime(2019, 05, 17));
            timeTable.Rows.Add(8, new DateTime(2019, 05, 16));

            var services = new DataTable("services");
            services.Columns.Add("ID_Service", typeof(int));
            services.Columns.Add("Name_service", typeof(string));
            services.Rows.Add(1, "Foo");
            services.Rows.Add(2, "Bar");
            services.Rows.Add(3, "Baz");

            var bindingSourceTimeTable = new BindingSource();
            bindingSourceTimeTable.DataSource = timeTable;
            var bindingSourceServices = new BindingSource();
            bindingSourceServices.DataSource = services;

            var serviceNameColumn = new DataGridViewComboBoxColumn();
            serviceNameColumn.DataSource = bindingSourceServices;
            serviceNameColumn.DataPropertyName = "ID_Service"; // внешний ключ
            serviceNameColumn.DisplayMember = "Name_service";            
            serviceNameColumn.ValueMember = "ID_Service"; // первичный ключ

            dataGridView = new DataGridView { Parent = this, Dock = DockStyle.Top };
            dataGridView.DataSource = bindingSourceTimeTable;
            dataGridView.Columns.Add(serviceNameColumn);
        }
    }
}

В примере два DataTable заполняются вручную прямо в коде. У вас они должны заполняться из БД.

Создаются два BindingSource. Каждый привязывается к своей таблице. Один из них привязывается к DataGridView, второй - к столбцу DataGridViewComboBoxColumn.

Остаётся лишь правильно задать свойства DataPropertyName, DisplayMember, ValueMember - именно они важны для работы кода.

Более полный пример можно найти здесь.

Предвосхищая возможные вопросы о немгновенном обновлении данных в ячейках грида, смотрите здесь обработку событий DataGridView.CellValueChanged и BindingSource.BindingComplete.

READ ALSO
Сохранение и открытие данных в файл из dataGridView

Сохранение и открытие данных в файл из dataGridView

Всем здравствуйте, вопрос следующийК программе на с# подключена БД из Microsoft SQL Server, в DataGridView выводится таблица

111
Несколько условий для Mysql запроса

Несколько условий для Mysql запроса

Есть таблица, в ней есть колонка meta_key и meta_value Вот запр

133
Передача значений отмеченных checbox

Передача значений отмеченных checbox

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

110
Как сгруппировать данные при выводе из базы в html?

Как сгруппировать данные при выводе из базы в html?

подскажите как правильно организовать идею:

121