如何在wpf datagrid中显示数据集中的相关数据

时间:2012-04-12 15:19:17

标签: wpf datagrid dataset master detail

我有一个包含两个表的数据集,一个简单的一对多父子关系正在进行中。例如;

Parent Table
ParentId (int)
Name     (string)

Child Table
ChildId (int)
ParentId (int)
Name     (string)

在此数据集中,我在父ID字段的父级和子级之间建立了关系(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"] ;
        }
    }

我还在windows构造函数中将窗口的datacontext设置为自身,例如;

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 个答案:

答案 0 :(得分:1)

当您返回DataView时它正在工作但显示全部。

在这里,您将返回DataRelation

ItemsSource="{Binding Path=ParentChildRelation}" 

您需要返回DataView

使用该关系生成DataView

DataRowView.CreateChildView方法(DataRelation)

答案 1 :(得分:1)

我无法找出接受的答案。我的情况与此处描述的情况相同: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解决方案,并避免编写更新子视图的事件处理程序。我曾尝试过使用DataContext,但却无处可去,有关如何利用数据集和关系来利用这种结构的文档非常简单(让我想知道我是否走上了正确的道路)。