У меня проблема, которая сводит меня с ума.
Я создал DataSet с DataRelations и хочу, чтобы он отображался в родительском / дочернем порядке.
Для простоты у меня есть только 2 таблицы:
- тест с идентификатором (int) (PK), col1 (строка)
- test1 с идентификатором (int) (PK) (FK -> test> id), col1 (строка)
Я создал связь между test и test2 следующим образом:
DataRelation rel = new DataRelation("testRel",
new DataColumn[] { database1DataSet.test.IDColumn },
new DataColumn[] { database1DataSet.test1.idColumn });
Я установил для DataContext таблицы, содержащей мои два элемента данных, значение
<Grid DataContext="{Binding Source={StaticResource database1DataSet}, Path=test}">
тогда я создал две DataGrids. Первый:
<DataGrid IsSynchronizedWithCurrentItem="True" Name="dataGrid1" ItemsSource="{Binding}">
Второй:
<DataGrid IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=testRel}" Name="dataGrid2">
Столбцы, конечно, связаны с правильными идентификаторами столбцов.
Вы можете переходить к родительской сетке, и элементы дочерних сеток меняются, как я и хотел.
Когда вы добавляете новую строку в дочернюю сетку (через NewItemPlaceholder), она автоматически завершает значение отношения, в этом случае значение id в test1 берется из выбранной родительской строки (id столбца test), как вы Я ожидал, что это сработает.
Теперь, если вы добавите новую строку в сетку MASTER, заполнив держатель NewItemPlace и отправив его, нажав «Enter», элемент будет создан в основной сетке и также будет добавлен в базу данных. Но если вы попытаетесь добавить дочернюю строку для этой новой добавленной главной строки, произойдет странное поведение.
Вы щелкаете на держателе NewItemPlace в дочерней сетке данных. Первое, на что нужно обратить внимание, это то, что не будет автоматического завершения значения id, как при выполнении этого для уже существующих строк. Второй заключается в том, что строка исчезает сразу после нажатия кнопки ввода со второй сетки. Вы даже не можете сделать его снова видимым, перебирая родительскую сетку. (Хотя строка в наборе данных). Если вы перезапустите приложение, новые добавленные строки появятся и будут работать так, как задумано.
Если вы добавляете новую строку программно с помощью
database1DataSet.test.AddtestRow(4, "asd");
поведение не будет иметь места.
Вопрос в том, почему добавление новой строки в таблицу данных через сетку данных отличается от выполнения ее программным путем и как я могу это исправить / создать хороший обходной путь?
Заранее спасибо
P.S. если вам нужен код, вы можете скачать его по адресу
https://rapidshare.com/files/2456035623/WpfApplication1.zip (решение VS2010)