Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 筛选出没有父级的数据行_Vb.net_Data Binding_Foreign Keys_Dataset_Parent Child - Fatal编程技术网

Vb.net 筛选出没有父级的数据行

Vb.net 筛选出没有父级的数据行,vb.net,data-binding,foreign-keys,dataset,parent-child,Vb.net,Data Binding,Foreign Keys,Dataset,Parent Child,我在一个数据集中有两个具有父子关系的表。父级是从我无法控制的外部数据构建的,而子级是从我用于内部数据的数据库中获取的。这意味着我不能总是确定我的孩子会有父母。如果发生这种情况,我更愿意从DataGridView中筛选出通过BindingSource消费数据的子项;我不想从数据库中删除行,因为设置更改或其他我无法控制的事件可能会重新引入以前存在并删除的行 我以前不得不想办法走相反的路,通过以下途径为以前没有竞争对手的父母创造孩子: dim newrows() as ParentRow = Par

我在一个数据集中有两个具有父子关系的表。父级是从我无法控制的外部数据构建的,而子级是从我用于内部数据的数据库中获取的。这意味着我不能总是确定我的孩子会有父母。如果发生这种情况,我更愿意从DataGridView中筛选出通过BindingSource消费数据的子项;我不想从数据库中删除行,因为设置更改或其他我无法控制的事件可能会重新引入以前存在并删除的行

我以前不得不想办法走相反的路,通过以下途径为以前没有竞争对手的父母创造孩子:

 dim newrows() as ParentRow = ParentTable.Select("Count(Child(MyRelation).ForeignKeyColumn) < 1")
 For Each row as ParentRow in newrows
      ChildRow.AddChildRow(row, otherData)
 Next
但这会过滤掉一切。调查之后,我发现

 ChildTable.Select("PARENT(MyRelation).KeyColumn IS NULL")(0).GetParentRow("MyRelation").Item("KeyColumn")
在一个表上,给定的结果有一个父项,并给出一个值,这似乎与Select语句相矛盾,因此很明显Select语句发生了意外的情况

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

回答 事实证明,使用计算Parent.Key的表达式生成布尔列是有效的,并且BindingSource可以过滤该列,而不会为已更改的行抛出标志

可能的解释
再加上观察到原始方法只有在关闭约束时才会失败,这让我认为这可能是微软的设计决策,因为当约束关闭时,无法保证一个子系统只有一个父系统。因此,当约束处于禁用状态时,按父列进行过滤将失败,但按父列计算的列进行过滤并不关心约束,因此是可以的。我只需要做我自己的工作,以确保只有一个父母;幸运的是,我从中生成父项的数据源保证了这一点。

当然,它只是沿着childBindingSource的思路。Filter=ForeignKeyColumn不为NULL。@jmcilhinney,ForeignKeyColumn除外。它将有一个引用外部列的值,而无论出于何种原因,该列目前不可用。如果它是空的,那就违反了在它稍后返回范围时能够重新连接到它的需要。啊,我明白了。因此,子记录在数据库中确实有父记录,但在数据集中没有父记录。我想您可以生成现有父ID的列表,并在筛选器中使用IN子句,但这不是非常动态的。好吧,如果我重新启用约束,那么我的筛选器确实可以工作。但是,如果数据集中不存在父记录,这显然会引发一个错误,让我处于类似的位置。您能否在子表中添加一个布尔列,指示父记录是否存在,并执行循环以填写“是/否”,然后对其进行筛选?
 ChildTable.Select("PARENT(MyRelation).KeyColumn IS NULL")(0).GetParentRow("MyRelation").Item("KeyColumn")