Foxtable(狐表)用户栏目专家坐堂 → 想用父表出发子表的表达式列的DataColChanged事件


  共有2722人关注过本帖树形打印复制链接

主题:想用父表出发子表的表达式列的DataColChanged事件

帅哥哟,离线,有人找我吗?
guning007
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:89 积分:720 威望:0 精华:0 注册:2015/4/28 10:09:00
想用父表出发子表的表达式列的DataColChanged事件  发帖心情 Post By:2015/6/18 11:57:00 [只看该作者]

父表(订单BC)有一个逻辑列(采购),子表(订单明细BC)有一个表达式列(采购)=父表的(采购)列,两个表通过(编码)列关联。

我想通过父表(采购)列的选中触发子表中对应行的DataColChanged事件,我看帮助自己弄出来的代码如下,但是不能正常工作,请帮忙修改一下。

另外,第三行的DataRows()的括号里面应该写什么?第五行不知道是不是只能用于判断数值或者字符列的,能否用于判断逻辑列?

谢谢!

If e.DataCol.Name = "采购" Then
    Dim crs As List(Of DataRow) 
    crs = DataTables("订单BC").DataRows().GetChildRows("订单明细BC") '找出"订单明细BC"表对应的子行
    For Each cr As DataRow In crs
        If cr IsNot Nothing Then
            DataTables("订单明细BC").DataCols("采购").RaiseDataColChanged(cr)  '通知系统这些子行的采购列的选中状态发生了改变,触发DataColChanged事件
        End If
    Next
End If

 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/6/18 11:57:00 [只看该作者]

表达式列是没有DataColChanged事件的.无法触发

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/6/18 12:01:00 [只看该作者]

红色代码改成数据列,不能用表达式列
 
If e.DataCol.Name = "采购" Then
    Dim crs As List(Of DataRow) 
    crs = DataTables("订单BC").DataRows().GetChildRows("订单明细BC") '找出"订单明细BC"表对应的子行
    For Each cr As DataRow In crs
            DataTables("订单明细BC").DataCols("某列").RaiseDataColChanged(cr)  '通知系统这些子行的采购列的选中状态发生了改变,触发DataColChanged事件
    Next
End If

 回到顶部
帅哥哟,离线,有人找我吗?
guning007
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:89 积分:720 威望:0 精华:0 注册:2015/4/28 10:09:00
  发帖心情 Post By:2015/6/18 12:07:00 [只看该作者]

Bin版,帮助文件中说可以通过子表出发父表事件,就是针对表达式列的。


通过子表触发父表事件

还有一个特殊情况,表达式列并非由本表的列计算得出,而是由子表数据计算得出。
例如假定订单表有个数量列,是表达式列,用于累计订单明细表的数量,其表达式为:
Sum(Child.数量)。
再假定订单表的DataColChanged事件设置了如下代码:

If e.Col.name = "数量" Then
  '相关计算代码 
End If

当我们在订单明细表输入数量时,订单表的数量会自动更新,但是上面的代码永远不会执行,因为数量是一个表达式列,不会触发事件。
我们需要在订单明细表的
DataColChanged事件加上代码:

If e.Col.name = "数量" Then
    Dim
pr As DataRow = e.DataRow.GetParentRow("订单") '找出对应的父行
    If
pr IsNot Nothing Then
        DataTables(
"订单").DataCols("数量").RaiseDataColChanged(pr'通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If
End If


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/6/18 12:18:00 [只看该作者]

 

[此贴子已经被作者于2015/6/18 12:18:15编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/6/18 12:20:00 [只看该作者]

 帮助文档有问题。

 

 但子表的数量列不是表达式列啊,父表的才是表达式列啊。

 

 如果你子表的采购列是表达式列,引用父表的数据,你那段代码根本就不需要写。


 回到顶部
帅哥哟,离线,有人找我吗?
guning007
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:89 积分:720 威望:0 精华:0 注册:2015/4/28 10:09:00
  发帖心情 Post By:2015/6/18 12:31:00 [只看该作者]

红版,子表是表达式列,引用父表的采购逻辑列,父表选中然后子表就选中。

如果这种办法行不通的话,那我就把子表的采购列改回数据列,然后通过您之前给的办法2,取得父表行的方法来实现父表选中子表也选中的目的,这样就能实现DataColChanged事件了吧?

您当时给我的代码是

Dim pr As DataRow = e.Row.DataRow.GetParentrow("订单表")
If pr("审核") Then e.Cancel = True

请问这段代码我要写在哪里?子表 “订单明细BC” 的DataColChanged事件中吗?但是父表 ”订单明细BC“ 的采购逻辑列选中时并不会出发子表的事件呀?

Dim pr As DataRow = e.Row.DataRow.GetParentrow("订单BC")
If pr("采购") = True Then
e.DataRow("采购") = True
Else
e.DataRow("采购") = False
End If
 

 回到顶部
帅哥哟,离线,有人找我吗?
guning007
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:89 积分:720 威望:0 精华:0 注册:2015/4/28 10:09:00
  发帖心情 Post By:2015/6/18 12:38:00 [只看该作者]

红版,我把我想实现的逻辑再理一下。

在主表选中“采购”列,然后子表的“采购”列也自动选中,接下来出发子表的DataColChanged事件,把子表的行复制到另一张表去(复制行的代码我已经测试过了,可以正常工作)。

我之前是采用子表”采购“列用表达式列引用父表的“采购”列,但是这样子表的DataColChanged事件不会被触发。

解决的方向有两个

1. 在主表选中“采购”列时,不但自动让子表的“采购”列们选中,同时要出发这些行的DataColChanged事件。

2. 如果第一个方向行不通,那么就要用代码来实现主表子表同时选中“采购”列的功能。

请红版指点

 回到顶部
帅哥哟,离线,有人找我吗?
guning007
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:89 积分:720 威望:0 精华:0 注册:2015/4/28 10:09:00
  发帖心情 Post By:2015/6/18 14:14:00 [只看该作者]

红版,我自己琢磨出来了。

我选了第二个方向。

在主表“订单BC”的DataColChanged事件里面加上了如下代码

If e.DataCol.Name = "采购" AndAlso e.DataRow("采购") = True Then
Dim drs As List(Of DataRow)
drs = e.DataRow.GetChildRows("订单明细BC")
For Each dr As DataRow In drs
    dr("采购") = True
Next
End If

然后,我在主表的某行选中“采购”列,然后子表的关联行的“采购”列也都被选中了,而且子表的DataColChanged事件也成功被触发了。

多谢红版的启发,引用Bin版的一句经典的话:“实践出真知啊!”

 回到顶部