本人在开发过程中发现了这个规律,特此分享一下,希望能对一些狐友有帮助。
在设置关联表的时候,我们通常都会勾选“同步更新关联列”这一项,因此,在主表修改关联列数据时,子表关联的数据也随之自动更新
在主表修改关联列到子表自动更新关联列结束这个过程中,两表共触发了4个事件,分别是主表的DataColChanging事件、DataColChanged事件和子表的DataColChanging事件、DataColChanged事件,虽然从数据表中眼睛看到的数据同步更新只是一瞬间的事情,但是实际上却经过了4个事件。
我测试的方法是这样的,我在这4个事件上分别写上一句代码:
主表
DataColChanging事件:MessageBox.Show("主表changing")
DataColChanged事件:MessageBox.Show("主表changed")
子表
DataColChanging事件:MessageBox.Show("子表changing")
DataColChanged事件:MessageBox.Show("子表changed")
写好了代码之后,再修改主表的关联列进行测试,结果分别弹出4个窗口,其顺序是:
主表changing-->子表changing-->子表changed-->主表changed
注意事项:
举个例子,当我们需要做这样一个功能,把子表的关联列设置成一个项目列表,当选择不同的列表项时,根据不同的关联列数据从主表中获取对应的其它数据更新到子表上(子表上有主表除关联列之外的数据列,非表达式列),这样我们通常就会在子表的DataColChanged事件里写上更新的代码,如:
If e.DataCol.Name = "关联列" Then
Dim dr As DataRow = e.DataRow.GetParentRow("主表") '获取主表上对应的行
'如果主表上对应有数据,则更新到子表上
If dr IsNot Nothing Then
e.DataRow("列1") = dr("列1")
e.DataRow("列2") = dr("列2")
Else
e.DataRow("列1") = Nothing
e.DataRow("列2") = Nothing
End If
End If
这种情况下,当子表关联项修改时,就能完成更新子表上的其它数据。
但是,当我们修改主表上关联列的数据时,会发现子表上对应的关联列确实更新了,但是对应主表的其它列数据就变成了空(Nothing),原因就出现在上面所说的4个触发事件的顺序上了,子表的DataColChanged事件在主表的DataColChanged事件之前就执行了,也就是说,主表上的关联列数据在正在修改但是还没修改结束的情况下子表就进行更新,这样的话,子表事件里就获取不了主表上对应的关联行,导致数据更新失败。
我的解决方法是这样的:
在主表的DataColChanged事件里补上这样的代码:
If e.DataCol.Name = "关联列" Then
For Each dr As DataRow In e.DataRow.GetChildRows("子表")
dr("列1") = e.DataRow("列1")
dr("列2") = e.DataRow("列2")
Next
End If
这样,在最后触发的事件里就可以实现更新了,不过这个方法有个缺点,就是如果修改主表上的关联列时,子表上的DataColChanged事件里代码也会执行,但是却毫无意义!子表上的代码只针对于在主动修改关联列时有效,而通过主表修改关联列而同步更新子表关联列的时候就变得多余。
不知道狐友们有没有更好的解决方法,有得话拿出来分享下。。。