以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  自动复制子表各行  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=41152)

--  作者:tj-pacer
--  发布时间:2013/10/12 14:19:00
--  自动复制子表各行

自动复制行

假定表A有个逻辑列,希望在某行选中此逻辑列时,自动将此行复制到表B。

为此可以将表A的DataColChanged事件代码设置为:

If e.DataCol.Name = "逻辑列名" AndAlso e.DataRow("逻辑列名") = True Then
     Dim dr As DataRow = DataTables("表B").AddNew
    
For Each dc As DataCol In DataTables("B").DataCols
         dr(dc.Name) = e.DataRow(dc.Name)
    
Next
End
If

上面的代码假定表A和表B的结构相同,且列名相同。

如果列名不同,或者只需复制部分列,可以参考下面的代码:

If e.DataCol.Name = "逻辑列名" AndAlso e.DataRow("逻辑列名") = True Then
    Dim nma() As String = {"A1","A2","A3","A4"}
\'A表数据来源列
    Dim nmb() As String = {"B1"
,"B2","B3","B4"} \'B表数据接收列
    Dim dr As DataRow = DataTables("表B"
).AddNew
   
For i As Integer = 0 To nma.Length - 1
        dr(nmb(i)) = e.DataRow(nma(i))
   
Next
End
If

 

问题:如果选中表A的逻辑列某行,不需要将该行复制到表B,而是要将表A子表该行关联的所有行复制到表B,代码如何写?

 


--  作者:Bin
--  发布时间:2013/10/12 14:23:00
--  
利用 GetChildRows   http://www.foxtable.com/help/topics/0431.htm  获得所有子表关联行即可.
--  作者:tj-pacer
--  发布时间:2013/10/12 15:13:00
--  

我比较愚钝,还是搞不出来。

 

我是用下面的代码:

If e.DataCol.Name = "逻辑列名" AndAlso e.DataRow("逻辑列名") = True Then
    Dim nma() As String = {"A1","A2","A3","A4"}
\'A表数据来源列
    Dim nmb() As String = {"B1"
,"B2","B3","B4"} \'B表数据接收列
    Dim dr As DataRow = DataTables("表B"
).AddNew
   
For i As Integer = 0 To nma.Length - 1
        dr(nmb(i)) = e.DataRow(nma(i))
   
Next
End
If

 

完成表A列复制到表B的,现在想不复制表A的行到表B,只是利用表A的逻辑列选中的行,复制表A的子表(表A.C)各行到表B. 不知道如何利用GetChildRows. 能帮我写好吗?谢谢!

 


--  作者:Bin
--  发布时间:2013/10/12 15:22:00
--  
If e.DataCol.Name = "逻辑列名" AndAlso e.DataRow("逻辑列名") = True Then
    Dim nma() As String = {"A1","A2","A3","A4"
\'A表数据来源列
    Dim nmb() As String = {"B1"
,"B2","B3","B4"} \'B表数据接收列
    Dim drs As List(Of Datarow)
   drs = 
e.DataRow.GetChildRows("子表")
   For Each 
dr2 As DataRow In drs
    
Dim dr As DataRow = DataTables("表B").AddNew
    
For i As Integer = 0 To nma.Length - 1
        dr(nmb(i)) = dr2(nma(i))
    
Next
   Next

    

End
 If

--  作者:tj-pacer
--  发布时间:2013/10/12 17:31:00
--  
以下是引用Bin在2013-10-12 15:22:00的发言:
If e.DataCol.Name = "逻辑列名" AndAlso e.DataRow("逻辑列名") = True Then
    Dim nma() As String = {"A1","A2","A3","A4"
\'A表数据来源列
    Dim nmb() As String = {"B1"
,"B2","B3","B4"} \'B表数据接收列
    Dim drs As List(Of Datarow)
   drs = 
e.DataRow.GetChildRows("子表")
   For Each 
dr2 As DataRow In drs
    
Dim dr As DataRow = DataTables("表B").AddNew
    
For i As Integer = 0 To nma.Length - 1
        dr(nmb(i)) = dr2(nma(i))
    
Next
   Next

    

End
 If

试做了,但是报错显示列“A”,"B","C"不属于“子表”。


--  作者:Bin
--  发布时间:2013/10/12 17:35:00
--  
说明没有这些列,你自己调整一下即可. 没什么难度的,你不花心思去理解,怎么会懂呢?
--  作者:tj-pacer
--  发布时间:2013/10/12 17:48:00
--  

OK, 我用另一种方法解决了。谢谢!


--  作者:tj-pacer
--  发布时间:2013/10/14 22:21:00
--  
以下是引用Bin在2013-10-12 15:22:00的发言:
If e.DataCol.Name = "逻辑列名" AndAlso e.DataRow("逻辑列名") = True Then
    Dim nma() As String = {"A1","A2","A3","A4"
\'A表数据来源列
    Dim nmb() As String = {"B1"
,"B2","B3","B4"} \'B表数据接收列
    Dim drs As List(Of Datarow)
   drs = 
e.DataRow.GetChildRows("子表")
   For Each 
dr2 As DataRow In drs
    
Dim dr As DataRow = DataTables("表B").AddNew
    
For i As Integer = 0 To nma.Length - 1
        dr(nmb(i)) = dr2(nma(i))
    
Next
   Next

    

End
 If

现在表A的某行子表各行都可以复制到表B了,但是表A的这行的一个值(例如工单号)要同时复制到表B的该列的新复制的各行中,如何实现那?


--  作者:有点甜
--  发布时间:2013/10/14 22:32:00
--  
 回复8楼,直接写代码不就行了?

 dr("工单号") = e.datarow("工单号")

--  作者:tj-pacer
--  发布时间:2013/10/14 22:42:00
--  
谢谢了,问题终于解决了。