Foxtable(狐表)用户栏目专家坐堂 → 再请教:如何复制表的当前显示内容到临时表


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

主题:再请教:如何复制表的当前显示内容到临时表

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


加好友 发短信
等级:童狐 帖子:276 积分:2971 威望:0 精华:0 注册:2010/9/20 11:21:00
再请教:如何复制表的当前显示内容到临时表  发帖心情 Post By: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中,就能解决上述问题。

  还请各位老师继续指点。



  

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:276 积分:2971 威望:0 精华:0 注册:2010/9/20 11:21:00
  发帖心情 Post By:2016/3/11 16:08:00 [只看该作者]

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

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

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

有没有更好的办法呢?


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:276 积分:2971 威望:0 精华:0 注册:2010/9/20 11:21:00
  发帖心情 Post By:2016/3/12 9:45:00 [只看该作者]

谢谢!
通过上述方法,在将列类型判断添加完整,再使用GetColVisibleWidth和SetColVisibleWidth,基本上能获得与当前表视图基本一致的临时表视图。

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

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

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


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/3/12 10:19:00 [只看该作者]

4楼代码后面加上一句
......
dtb.Build()
MainTable= Tables("统计")
DataTables("统计").GlobalHandler.DrawCell = True

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


加好友 发短信
等级:童狐 帖子:276 积分:2971 威望:0 精华:0 注册:2010/9/20 11:21:00
  发帖心情 Post By:2016/3/12 11:42:00 [只看该作者]

太好了,谢谢各位!

 回到顶部