Datagrid的数据表关系问题(wpf)

时间:2011-05-25 19:22:50

标签: c# wpf

我遇到了一个让我疯狂的问题。

我使用DataRelations创建了一个DataSet,我希望它以父/子方式显示。

为了方便起见,我只有2张桌子:

  1. 使用id(int)(PK),col1(string)
  2. 进行测试
  3. test1 with id(int)(PK)(FK - > test> id),col1(string)
  4. 我在test和test2之间创建了一个关系:

    DataRelation rel = new DataRelation("testRel",  
    new DataColumn[] { database1DataSet.test.IDColumn },  
    new DataColumn[] { database1DataSet.test1.idColumn });
    

    我将包含我的两个Datagrids的Grid的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">  
    

    列当然绑定到正确的ColumnID。

    您可以循环到父网格,子网格元素也会发生变化,就像我想要的那样。

    当你向子网格添加一个新行时(通过NewItemPlaceholder),它会自动完成关系值,在这种情况下,test1中的id值取自选定的父行(test的列id),就像你一样期待它的运作。

    现在,如果通过填写NewItemPlaceholder并通过按“Enter”提交它来向MASTER网格添加新行,则该项目将在主网格中创建,并且也会提交到数据库。但是,如果您尝试为此添加子行,则新添加的主行会发生奇怪的行为。

    单击子数据网格中的NewItemPlaceholder。首先要注意的是,对于已存在的行,不会像执行此操作那样自动完成id值。第二个是,在从第二个网格按下输入后,该行立即消失。您甚至无法通过在父网格中循环来再次显示它。 (尽管数据集中的行)。如果您重新运行该应用程序,则会显示新添加的行并按预期工作。

    如果使用

    以编程方式添加新行
    database1DataSet.test.AddtestRow(4, "asd");  
    

    不会发生这种行为。

    问题是:为什么通过数据网格向数据表添加一个新行,而不是以编程方式进行,我该如何修复它/构建一个很好的解决方法?

    提前致谢

    P.S。如果您需要代码,可以下载 https://rapidshare.com/files/2456035623/WpfApplication1.zip(VS2010解决方案)

2 个答案:

答案 0 :(得分:1)

我自己也遇到了同样的问题,直到我在主列上添加了AutoIncrement,AutoIncrementSeed和AutoIncrementStep。

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

在两个表(test和test1)上添加上面的代码后,子网格将使用主网格中的正确ID进行更新。

答案 1 :(得分:0)

确定一个非常糟糕的解决方法是订阅该特定数据表的rowchanged事件,然后创建该类型的新行并将传递给该事件的行中的值复制到其中。 (当然只有当事件是添加事件时)。之后,您必须通过调用数据表的AddRow()来删除当前行并插入新创建的行 当然,这真的很烦人