Here, I gave one example of in-memory DataTables master - detail relationship.
Now I will extend
that example with DataGridView.
First lets create master DataTable:
private DataTable CreateMasterDataTable()
{
DataTable dtMaster = new DataTable("Master");
dtMaster.Columns.Add("Id", typeof(int));
dtMaster.Columns.Add("SomeText", typeof(string));
dtMaster.PrimaryKey =
[
dtMaster.Columns["Id"]
];
return dtMaster;
}
Now detail DataTable:
private DataTable CreateDetailDataTable()
{
DataTable dtDetail = new DataTable("Detail");
dtDetail.Columns.Add("Id", typeof(int));
dtDetail.Columns.Add("MasterId", typeof(int));
dtDetail.Columns.Add("SomeText", typeof(string));
dtDetail.PrimaryKey =
[
dtDetail.Columns["Id"]
, dtDetail.Columns["MasterId"]
];
return dtDetail;
}
DataSet:
DataSet dsMasterDetail = new DataSet("MasterDetail");
dsMasterDetail.Tables.Add(CreateMasterDataTable());
dsMasterDetail.Tables.Add(CreateDetailDataTable());
Relation and add relation to DataSet:
DataRelation relMasterDetail = new DataRelation("MasterDetailRelation"
, dsMasterDetail.Tables["Master"].Columns["Id"]
, dsMasterDetail.Tables["Detail"].Columns["MasterId"]
);
dsMasterDetail.Relations.Add(relMasterDetail);
Now, lets create BindingSource and attach it to DataSource of DataGridView:
var dsMasterDetail = CreateMasterDetailDataSet();
BindingSource bsMaster = new BindingSource
{
DataSource = dsMasterDetail,
DataMember = "Master"
};
dgvMaster.DataSource = bsMaster;
BindingSource bsDetail = new BindingSource
{
DataSource = bsMaster,
DataMember = "MasterDetailRelation"
};
dgvDetail.DataSource = bsDetail;
Here notice that DataSource of detail BindingSource I have attached master BindingSource, as DataMember name of relation:
BindingSource bsDetail = new BindingSource
{
DataSource = bsMaster,
DataMember = "MasterDetailRelation"
};
Example download from
here.