Проблема связи DataTable с Datagrid (wpf) - PullRequest
1 голос
/ 25 мая 2011

У меня проблема, которая сводит меня с ума.

Я создал DataSet с DataRelations и хочу, чтобы он отображался в родительском / дочернем порядке.

Для простоты у меня есть только 2 таблицы:

  1. тест с идентификатором (int) (PK), col1 (строка)
  2. 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)

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

У меня была такая же проблема, пока я не добавил AutoIncrement, AutoIncrementSeed и AutoIncrementStep в основные столбцы.

test.Columns["ID"].AutoIncrement = true;
test.Columns["ID"].AutoIncrementSeed = -1;
test.Columns["ID"].AutoIncrementStep = -1;

После добавления приведенного выше кода в обе таблицы (test и test1) дочерняя сетка будет обновляться с помощьюправильный идентификатор из основной сетки.

0 голосов
/ 26 мая 2011

Хорошо, действительно дурацкий обходной путь - подписаться на событие rowoted этого конкретного объекта данных, затем создать новую строку этого типа и скопировать в нее значения из строки, переданной событию. (Конечно, только когда событие было добавленным событием). После этого вы должны удалить текущую строку и вставить вновь созданную строку, вызвав AddRow () объекта данных.
Это, конечно, действительно раздражает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...