以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  再请教:如何复制表的当前显示内容到临时表  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=82078)

--  作者:lake163
--  发布时间:2016/3/11 9:39:00
--  再请教:如何复制表的当前显示内容到临时表
   当前表A,经过筛选等操作后,只显示部分行、部分列,希望将这些显示的行、列内容复制到另一个表B中。

   目前的做法(也是论坛里老师教的):
   是将表B作为一个固定表,其结构自表A复制过来,然后复制数据,代码如下。
Dim nma1,nmb1 As new List(Of String )    \'集合
For Each c As Col In Tables("A" ).cols   \'获得当前显示的列
    If c.Visible Then             
        nma1.add(c.Name)
        nmb1.add(c.Name)
    End If
Next
Dim nma  =nma1 .ToArray()   \'数组
Dim nmb  =nmb1 .ToArray()

\'复制所有行到B中
With Tables ("A")
    For i As Integer = 0 To .rows. Count-1      \'所有行
        CurrentTable.Position = i
        Dim dr As DataRow = DataTables("B" ).AddNew
        For j As Integer = 0 To nma. Length - 1
            dr(nmb(j)) = .current (nma( j))
        Next
    Next
End With

  问题是:(1)当表A的结构变化后,表B的结构不会自动变化,当复制的列中有表B中不存在的列,就会出错。
             (2)表B中仍然有一些多余的列。
  如果能够根据当前显示的列,自动生成一个临时表B,然后再复制相关行的数据到表B中,就能解决上述问题。

  还请各位老师继续指点。



  

--  作者:大红袍
--  发布时间:2016/3/11 12:41:00
--  

生成临时表,参考

 

Dim dtb As New DataTableBuilder("统计")
Dim ary() As String = Tables("表a").GetColVisibleWidth.split("|")
For i As Integer = 0 To ary.Length - 1 Step 2
    dtb.AddDef(ary(i), Gettype(String))
Next
dtb.Build()
MainTable= Tables("统计")


--  作者:lake163
--  发布时间:2016/3/11 16:08:00
--  
谢谢超版!
这样做,存在一个致命的问题:数据的格式全是字符型,且长度是固定的。
这就导致:一是超长的内容无法复制,二是日期型等变成了字符型。
查了帮助,搜了论坛,采用狐狸爸爸提供的通用代码:

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=9428&replyID=68995&skin=1

好像能够解决问题,但该做法,又需要重新打开项目。

有没有更好的办法呢?


--  作者:大红袍
--  发布时间:2016/3/11 17:46:00
--  

一样,参考代码

 

Dim dtb As New DataTableBuilder("统计")
Dim tbl As Table = Tables("表a")
Dim ary() As String = tbl.GetColVisibleWidth.split("|")
For i As Integer = 0 To ary.Length - 1 Step 2
    Dim dc As DataCol = tbl.cols(ary(i)).DataCol
    msgbox(dc.DataType.tostring.replace("System.", ""))
    Select Case dc.DataType.tostring.replace("System.", "")
        Case "String"
            dtb.AddDef(dc.name, Gettype(String), dc.MaxLength)
        Case "DateTime"
            dtb.AddDef(ary(i), Gettype(Date))
        Case "Int32"
            dtb.AddDef(ary(i), Gettype(Integer))
    End Select
Next
dtb.Build()
MainTable= Tables("统计")


--  作者:lake163
--  发布时间:2016/3/12 9:45:00
--  
谢谢!
通过上述方法,在将列类型判断添加完整,再使用GetColVisibleWidth和SetColVisibleWidth,基本上能获得与当前表视图基本一致的临时表视图。

但对日期列,仍然有一个小问题:
日期列我们一般都使用YY-mm格式,在原有的表中都是通过DrawCell事件来实现的。
但在临时表中如何实现呢?
尝试使用全局DrawCell事件(事件开关已打开),发现正常情况下无法生效,只有在开发状态下先打开全局表的DrawCell事件,然后才会起作用。

请问如何处理?
[此贴子已经被作者于2016/3/12 9:45:38编辑过]

--  作者:Hyphen
--  发布时间:2016/3/12 10:19:00
--  
4楼代码后面加上一句
......
dtb.Build()
MainTable= Tables("统计")
DataTables("统计").GlobalHandler.DrawCell = True

--  作者:lake163
--  发布时间:2016/3/12 11:42:00
--  
太好了,谢谢各位!