过滤掉没有Parent的DataRows

时间:2017-11-01 22:54:58

标签: vb.net data-binding foreign-keys dataset parent-child

我在DataSet中有两个具有父子关系的表。 Parent是根据我无法控制的外部数据构建的,而Child是从我用于内部数据的数据库中获取的。这意味着我不能总是确定我的孩子会有父母。如果发生这种情况,我宁愿从DataGridView中过滤出通过BindingSource消耗数据的Children;我不想从数据库中删除行,因为设置更改(或我无法控制的其他事件)可能会重新引入先前存在和删除的行。

我以前不得不弄清楚如何采取相反的方式,通过以下方式为以前未遇到的父母创建儿童:

 dim newrows() as ParentRow = ParentTable.Select("Count(Child(MyRelation).ForeignKeyColumn) < 1")
 For Each row as ParentRow in newrows
      ChildRow.AddChildRow(row, otherData)
 Next

我以为我可以使用类似的方法:

 BindingSource.Filter = "PARENT(MyRelation).KeyColumn IS NOT NULL"

但这会过滤掉一切。调查,我发现正在运行

 ChildTable.Select("PARENT(MyRelation).KeyColumn IS NULL")(0).GetParentRow("MyRelation").Item("KeyColumn")

在一个表上,给定的结果有一个父成功并给出一个值,这似乎与Select语句相矛盾,所以Select语句显然会出现意外情况。

我不知所措。有没有办法通过BindingSource过滤掉(但保留在后端)没有父级的行?我在这里看不到什么?

1 个答案:

答案 0 :(得分:1)

答案

事实证明,使用计算Parent.Key IS NOT NULL的表达式创建一个布尔列,并且可以通过BindingSource过滤,而不会为已更改的行抛出标记。

可能的解释

结合原始方法仅在关闭约束时失败的观察结果,这让我认为这可能是微软的设计决定,因为当约束关闭时,无法保证孩子只有一个父母。因此,当约束关闭时,Parent列的过滤将失败,但是按Parent列计算的列进行过滤并不关心约束,所以没关系。我只需要做自己的工作,以确保只有一个父母;幸运的是,这是由我从中生成Parent的数据源保证的。

相关问题