Связанные данные в DataGridView на основе DataSet
Программно формирую DataSet на основе загрузки двух DataTable из БД в "ручном" режиме (через некий класс-загрузчик из БД) и также вручную настраиваю связь между ними. Вот так:
public void FillDataSet(DataSet ds, string masterName, string detailsName)
{
if (ds == null) return;
ds.DataSetName = "Storage";
using (DataWorker dw = new DataWorker(server, database))
{
var masterTable = dw.LoadTable(masterName);
masterTable.TableName = "Master";
var detailsTable = dw.LoadTable(detailsName);
detailsTable.TableName = "Details";
ds.Tables.Add(masterTable);
ds.Tables.Add(detailsTable);
ds.Relations.Add("MasterDetails",
masterTable.Columns["Id"], detailsTable.Columns["MasterId"]);
}
}
Как я должен привязывать два DataGridView на форме к этому DataSet, чтобы они учитывали связь, и выбор строки в Master в первом DataGridView автоматически показывал только связанные строки во втором?
DataProcessor proc = new DataProcessor(server, database);
DataSet storage = new DataSet();
proc.FillDataSet(storage, masterName, detailsName);
gridMaster.DataSource = storage.Tables[0];
gridDetails.DataSource = storage.Tables[1]; // ???
Ответы (1 шт):
Так и не разобрался детально в особенностях работы DataAdapter и BuindingSource, с помощью настроек которых можно было бы решить проблему, но кейс, описанный в subj, решил через фильтры.
Важное примечание: я использую GridControl и DataGrid из набора компонент DevExpress (это влияет в примере не способ получения выбранной строки в п.2). В стандартном DataGridView фреймворка WindowsForms получение выбранной строки еще проще.
В DataSource обоих Grid-ов подкладываем непосредственно таблицы DataTable:
DataProcessor proc = new DataProcessor(server, database); storage = new DataSet(); proc.FillDataSet(storage, masterName, detailsName); gridMaster.DataSource = storage.Tables[0]; gridDetails.DataSource = storage.Tables[1];По событию SelectionChanged Grid-а Master накладываю фильтр на данные во второй таблице, на основании ключа:
private void viewMaster_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e) { int k = viewMaster.GetSelectedRows()[0]; int id = int.Parse(viewMaster.GetRowCellValue(k, "Id").ToString()); storage.Tables[1].DefaultView.RowFilter = string.Format("MasterId = '{0}'", id); }
Работает довольно быстро, хотя мне и не нравится мой способ получения id мастерской записи. Кто знает, как организовать нужный мне эффект при помощи DataAdapter и/или BuindingSource - напишите, пожалуйста. Напоминаю: исходные вводные заключаются в том, что я добавляю и заполняю две таблицы в DataSet "ручками", а не при помощи мастера подключений и создания встроенной БД приложения!