У меня есть две таблицы Timetable и Services связанные по ID_Service. Timetable представлена как DataGrid. Мне нужно чтобы в Timetable появился новый столбец вида DataGridViewComboBoxColumn, который бы заполнялся значениями из столбца Name_service таблицы Services. Причем этот столбец должен согласовываться с ID_Service, т.е. в выпадающем комбобоксе я выбираю значение, и согласно этому значению в столбце ID_Service устанавливается айди. Я совсем новичок в этом, подскажите пожалуйста, как можно такое реализовать
Я сделал полный пример приложения. Его можно скопировать и запустить.
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
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Всем здравствуйте, вопрос следующийК программе на с# подключена БД из Microsoft SQL Server, в DataGridView выводится таблица
Есть таблица, в ней есть колонка meta_key и meta_value Вот запр
У меня есть сайт с несколькими страницами с checbox, мне нужно сначала с одной страницы запомнить значения выбранных потом со следующей, передать...