数据网格视图 - 父数据库与子数据库的关系 - 更新子数据网格视图数据

本文关键字:数据 数据库 数据网 网格 视图 更新 关系 | 更新日期: 2023-09-27 17:56:53

有人可以帮我做以下事情吗? 我有两个 DataGridView 对象,每个对象都显示一个数据表,其中两个数据表与以下代码相关:

DataSet dSet = new DataSet();
DataTable ParentList = ListToDataTable(_listOfAllAlbumObjects);
DataTable ChildList = ListToDataTable(_listOfAllTrackObjects);
dSet.Tables.AddRange(new DataTable[]{ParentList, ChildList});
DataColumn parentRelationColumn = ParentList.Columns["AlbumId"];
DataColumn childRelationColumn = ChildList.Columns["AlbumId"];
dSet.Relations.Add("ParentToChild", parentRelationColumn, childRelationColumn);
ParentDataGridView.DataSource = dSet;
ParentDataGridView.DataMember = "ParentList";
ChildDataGridView.DataSource = ???;
ChildDataGridView.DataMember = "ParentToChild";

这两个数据表实际上是List<>转换为DataTables

,如下所示:
    public static DataTable ListToDataTable<T>( IList<T> data)
    {
              var props = TypeDescriptor.GetProperties(typeof(T));
              var table = new DataTable();
              for (var i = 0; i < props.Count; i++)
              {
                  PropertyDescriptor prop = props[i];
                  table.Columns.Add(prop.Name, prop.PropertyType);
              }
              var values = new object[props.Count];
              foreach (T item in data)
              {
                  for (int i = 0; i < values.Length; i++) 
                  { values[i] = props[i].GetValue(item); }
                  table.Rows.Add(values);
              }
              return table;
          }

最初,每个 DataGridView 似乎都相应地显示数据;但是,子 DataGridView 不会随着父 DataGridView 中的任何记录更改而更新。

我看到表需要通过绑定源互连;但是我不相信这里有真正的绑定源。

有人可以引导我朝着正确的方向前进吗? 谢谢。

数据网格视图 - 父数据库与子数据库的关系 - 更新子数据网格视图数据

有一篇 MSDN 文章显示了您要执行的操作:

如何:使用两个 Windows 窗体创建大纲/详细信息窗体 DataGridView 控件

以下是这可能为您工作的方式:

通过设计器或通过代码将两个 BindingSources 添加到项目中:parentBindingSource 和 childBindingSource。 然后尝试用这个代替你拥有的代码。

// Associate your BSs with your DGVs.
ParentDataGridView.DataSource = parentBindingSource;
ChildDataGridView.DataSource = childBindingSource;
// (Most of) your code here:
DataSet dSet = new DataSet();
DataTable ParentList = ListToDataTable(_listOfAllAlbumObjects);
DataTable ChildList = ListToDataTable(_listOfAllTrackObjects);
dSet.Tables.AddRange(new DataTable[]{ParentList, ChildList});
DataColumn parentRelationColumn = ParentList.Columns["AlbumId"];
DataColumn childRelationColumn = ChildList.Columns["AlbumId"];
dSet.Relations.Add("ParentToChild", parentRelationColumn, childRelationColumn);
// Let's name this DT to make clear what we're referencing later on.
ParentList.TableName = "ParentListDT";
// Rather than set the data properties on your DGVs, set them in your BindingSources.
parentBindingSource.DataSource = dSet;
parentBindingSource.DataMember = "ParentListDT";
childBindingSource.DataSource = parentBindingSource;
childBindingSource.DataMember = "ParentToChild";