Foxtable(狐表)用户栏目专家坐堂 → [求助]行的前移后移在筛选状态下如何进行?


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

主题:[求助]行的前移后移在筛选状态下如何进行?

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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
[求助]行的前移后移在筛选状态下如何进行?  发帖心情 Post By:2015/1/7 9:24:00 [显示全部帖子]

狐爸,

表中的行上移和下移在筛选状态时,处理起来是不是比较麻烦?我用下面的代码,处理下移会出错,执行后当前行被移到最后,并没有按sort字段排序,

同样的代码,在上移中(少 DESC)却是可以正常执行。

Dim tb As Table = Tables("w_set_table")
If  tb.Position<tb.Rows.Count-1 Then

    tb.Sort=""
    'tb.current.move(tbl.Position + 1) '向下移动一行
    tb.current("II0")=tb.current("II0")+1
    tb.Sort="II0,id DESC"
End If

 

Dim tb As Table = Tables("w_set_table")
tb.Sort=""
If  tb.Position>=0 Then
    'tb.current.move(tb.Position - 1) '向上移动一行
    tb.current("II0")=tb.current("II0")-1
    tb.Sort="II0,id"
End If

 

为什么会这样呢?怎么处理才好。

谢谢!

[此贴子已经被作者于2015-1-7 9:33:43编辑过]

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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 9:38:00 [显示全部帖子]

需求很简单啊,就是让表里的某一行上移一行或下移一行,前提是这个表是有排序的。所以要用tb.current.move(tbl.Position + 1) '向下移动一行,在有排序的时候,这命令好像不能用。

我先取消排序,然后给排序的字段赋值,再恢复排序。

除此之外,还有什么更好的办法?


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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 9:47:00 [显示全部帖子]

这还要传例子吗?这么简单的东西,在一个有筛选的表里,你怎么移动表里的行?

这种表的记录一般不多,所以不用考虑性能浪费的问题。


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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 9:50:00 [显示全部帖子]

我用的筛选字段ii0下移,就是+1后,就和下一条的ii0一样,这样两个ii0一样的,排序时不见得刚才移动的行会排到后面去,如果排前面,那么刚才要移动的行,实际上是没动。

我加了一个ID就是为了避免这种情况,但是似乎起不到作用。

[此贴子已经被作者于2015-1-7 9:50:54编辑过]

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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 10:18:00 [显示全部帖子]

谢谢。

如果这个表是副本表,current当前行会自己改变,我刚才操作出现这个问题,

本来没的涉及current的操作,只是操作了position,是不是主表和副本表不同的原因?

这个需求很简单,很常用。但是狐表知道这个不好做,所以没有把这个功能做进去,对吧?

 


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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 10:24:00 [显示全部帖子]

tb.current.move(tbl.Position + 1) '向下移动一行

上面的命令只针对没有排序的表,

一个没有排序的表,实际中有什么意义?我想意义不大。所以我请问狐爸爸能不能改进这个功能。


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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 10:32:00 [显示全部帖子]

说是这么说,我按你说的交换了,有些可以,有些就出错。

按理说,当前行current,上一行rows(current.idx-1),下一行rows(current.idx+1),

我现在不敢肯定,这样的表达都是正确的,可能我的其它代码还有问题,

 


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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 10:43:00 [显示全部帖子]

逻辑上是没错。

'上移一行
Dim tb As Table = Tables("w_set_table")
If  tb.Position>0 Then
    Dim c As Integer = tb.current("II0")
    Dim r As Row = tb.rows(tb.current.index-1)
    tb.current("II0")=r("II0")
    r("II0")=c
    tb.Sort="II0"
End If

比如,我现在在当前行一直点“上移”,正常会动,位置也不错,一直点着,不知道什么时候,我的当前行,已经不是当初的那行了,II0的值没错一直OK,可是我的当前行丢了。什么时候丢的也不知道。

我只按上移,只执行上面的代码,没别的操作。


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


加好友 发短信
等级:婴狐 帖子:88 积分:844 威望:0 精华:0 注册:2013/10/15 15:04:00
  发帖心情 Post By:2015/1/7 12:39:00 [显示全部帖子]

Dim tb As Table=args(0)
Dim ss As String =args(1) ' 下移,上移
'上移
If ss ="上移" Then  
 '上移
    If  tb.Position>0 Then
        Dim c As Integer = tb.current("II0")
        Dim str As String=tb.DataTable.name
        str=str.Remove(0,str.LastIndexOf("_")+1)
        str=str & "id"
        Dim cid As Integer =tb.current(str)
        Dim r As Row = tb.rows(tb.current.index-1)
        tb.current("II0")=r("II0")
        r("II0")=c
        tb.Sort="II0"
        c=tb.FindRow("[" & str & "]=" & cid)
        If c>=0 Then
            tb.Position=c
        End If
    End If
Else 
 '下移
    If  tb.Position<tb.rows.count-1 Then
        Dim c As Integer = tb.current("II0")
        Dim str As String=tb.DataTable.name
        str=str.Remove(0,str.LastIndexOf("_")+1)
        str=str & "id"
        Dim cid As Integer =tb.current(str)
        Dim r As Row = tb.rows(tb.current.index+1)
        tb.current("II0")=r("II0")
        r("II0")=c
        tb.Sort="II0"
        c=tb.FindRow("[" & str & "]=" & cid)
        If c>=0 Then
            tb.Position=c
        End If
    End If
End If

这是最终代码。因为移动过程需要改变前行或后行的值,所以会导致当前行的改变,因为在移动后必须重新定位回到原来的当前行。

 回到顶部