事件中的父表和子表
父表和子表之间的数据和操作,有时是相互依存的,某一方进行的操作,经常需要在另一方进行条件判断。
在子表的事件中,我们可以通过GetParentRow获得父行,在父表的事件中,可以通过GetChildRows获得全部子行。
示例一
假定订单和订单明细表已经建立关联,订单表有个客户等级列,订单明细表有个折扣列,要求只有客户等级为VIP的时候,才允许折扣超过10%。
为此可以在订单明细表的DataColChanging事件中设置代码:
If
e.DataCol.Name
= "折扣" Then
If e.NewValue
> 0.1 Then
Dim
pr As
DataRow = e.DataRow.GetParentRow("订单")
If pr
IsNot Nothing
Then
If
pr("客户等级")
<> "VIP" Then
MessageBox.show("非VIP客户的折扣不能超过10%",
"提示",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
e.Cancel
= True
End
If
End If
End
If
End
If
示例二
假定希望锁定某订单时,能同时锁定其对应的全部订单明细,反之亦然。
要实现此目的,只需将订单表的DataRowLockedChanged事件代码设置为:
For
Each dr
As DataRow
In e.DataRow.GetChildRows("订单明细")
dr.Locked =
e.DataRow.Locked
Next
示例三
假定订单和订单明细表都有一个名为“审核”的列,逻辑型,要求某订单的所有订单明细全部审核通过后,才能审核订单。
为此可以将订单表的PrepareEdit事件代码设置为:
If
e.Col.name
= "审核" Then
For Each
dr As
DataRow In
e.Row.DataRow.GetChildRows("订单明细")
If dr("审核")
= False Then
e.Cancel
= True
Exit
For
End If
Next
End
If
示例四
假定订单和订单明细表都有一个名为“审核”的列,逻辑型。
当某个订单的所有订单明细全部通过审核后,此订单也自动审核通过,当某订单的任何一个订单明细取消审核后,此订单也自动取消审核。
为此可以将订单明细表的DataColChanged事件代码设置为:
If
e.DataCol.name
= "审核" Then
Dim pr
As DataRow =
e.DataRow.GetParentRow("订单")
If pr
IsNot Nothing
Then
Dim crs
As List(of
DataRow) = pr.GetChildRows("订单明细")
Dim
cnt As
Integer
For Each
cr As
DataRow In
crs
If
cr("审核") =
True
cnt =
cnt + 1
End
If
Next
pr("审核")
= (crs.Count =
cnt)
End
If
End
If