DataGridView - связь между родительской и дочерней базами данных - обновление дочерних данных DataGridView - PullRequest
0 голосов
/ 19 мая 2011

Может ли кто-нибудь помочь мне со следующим?У меня есть два объекта DataGridView, каждый из которых отображает DataTable, где две таблицы данных связаны со следующим кодом:

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";

Обе DataTables на самом деле 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.

Я вижу, что таблицы должны быть связаны через источник привязки;однако я не верю, что здесь есть истинный источник привязки.

Может кто-нибудь, пожалуйста, направить меня в правильном направлении?Спасибо.

1 Ответ

1 голос
/ 20 мая 2011

В статье MSDN показано, что вы хотите сделать:

Как: создать основную / подробную форму с помощью двух элементов управления Windows Forms DataGridView

Вот как это может работать для вас:

Либо через конструктор, либо через код добавьте два BindingSource в ваш проект: 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...