Как отобразить связанные данные из набора данных в сетке данных wpf
У меня есть набор данных с двумя таблицами, между которыми происходят простые отношения между родителями и детьми. например;
Parent Table
ParentId (int)
Name (string)
Child Table
ChildId (int)
ParentId (int)
Name (string)
В этом наборе данных у меня установлена связь (ParentChildRelation) между родителем и потомком в поле родительского идентификатора. И если я программно выполняю вызов Parent.getChildRows(), я вижу правильные связанные дочерние записи, поэтому я знаю, что отношения хорошие.
Мне нужно отобразить сетку данных со списком родительских строк и иметь другую отдельную сетку данных, отображающую список дочерних записей для выбранного родителя.
Пока на моем окне в коде позади, у меня есть
private DataSet _parentChildDataSet;
public DataSet ParentChildDataSet
{
get
{
return _parentChildDataSet;
}
set
{
_parentChildDataSet = value;
}
public DataView ParentView
{
get
{
return this.ParentChildDataSet.Tables["Parent"].DefaultView;
}
}
public DataRelation ParentChildRelation
{
get
{
return this.ParentChildDataSet.Relations["Parent_Child"] ;
}
}
Я также установил datacontext для окна в конструктор windows, например;
this.DataContext = this;
и в моем xaml
<Grid>
<DataGrid ItemsSource="{Binding Path=ParentView}" AutoGenerateColumns="True" Name="dataGrid1">
</DataGrid>
<DataGrid ItemsSource="{Binding Path=ParentChildRelation}" Name="dataGrid2" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" />
</DataGrid.Columns>
</DataGrid>
</Grid>
Однако я не могу получить какие-либо дочерние записи для отображения в dataGrid2.
Я связываю эту сетку с именем datarelation это правильно?
если я связываюсь с другим свойством в моем окне;
public DataView ChildrenView
{
get
{
return this.ParentChildDataSet.Tables["Child"].DefaultView;
}
}
тогда я вижу все записи независимо от родителя, как вы ожидаете.
Спасибо за любые подсказки, которые каждый может дать мне.
2 ответа
Когда вы возвращаете DataView, он работает, но отображает все.
Здесь вы возвращаете DataRelation
ItemsSource="{Binding Path=ParentChildRelation}"
Вам нужно вернуть DataView
Используйте отношение для создания DataView
Метод DataRowView.CreateChildView (DataRelation)
Я не могу выработать принятый ответ. Моя ситуация идентична описанной здесь: 2 таблицы, отношения, 2 датагрид.
Я изучил метод CreateChildView, но мне не хватает ключевой точки где-то. Мой текущий код для получения дочернего вида:
public DataView ChildView {
get {
return ParentChildRelation.ParentTable.DefaultView[0].CreateChildView("regels")
}
}
Проблема двоякая, во-первых, у меня, очевидно, фиксированный индекс, то есть я всегда получаю дочернее представление первой строки родительской таблицы. Во-вторых, я с треском проваливаюсь при получении нового дочернего представления, когда в родительском представлении выбирается новая строка (ChildView вызывается только при инициализации).
Мой XAML:
<Grid>
<DataGrid
ItemsSource="{Binding Path=ParentView}"
AutoGenerateColumns="True"
Name="dataGrid1"
/>
<DataGrid
ItemsSource="{Binding Path=ChildView}"
AutoGenerateColumns="True"
Name="dataGrid2"
/>
</Grid>
Я хотел бы сделать это решением XAML и избегать написания обработчиков событий, обновляющих childview. Я пытался поиграться с DataContext, но нигде не нашел, документация о том, как использовать эту структуру с наборами данных и связями, очень скудна (заставляет задуматься, иду ли я по правильному пути).