Foxtable(狐表)用户栏目专家坐堂 → [讨论] 在表中,正序删除空行方法的探讨


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

主题:[讨论] 在表中,正序删除空行方法的探讨

美女呀,离线,留言给我吧!
龙潭春早
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:676 积分:4895 威望:0 精华:0 注册:2018/3/22 16:05:00
[讨论] 在表中,正序删除空行方法的探讨  发帖心情 Post By:2020/8/7 16:51:00 [只看该作者]

在帮助中介绍删除行的时候,要倒序删除

不得不倒序删除的原因,是由于在正序删除时,后面的行会上移填补刚被删除的行号,而计数器会自动加一而错过了对这刚上移第一行的判断,这样连续下去,会导致删除行的混乱。

而通过倒序删除,解决了上述的这个问题。

只是,在实际的开发中,能够正序地删除行,还是很让人期待。

深入研究发现,既然是计数器的自动加数导致的混乱,那通过修正计数器的自动加数,就应该能够实现正序删除行。

在下面的代码中,通过添加代码 i = i - 1”,修正了计数器的加数。使得删除空行后计数器不增加计数,反而减数,使得由于删除行而上移上来的新行被遍历列而被判断是否是空行。

下面的代码,经验证实现了正序删除行:

MainTable = Tables("表C")

Dim i,i2,i3,i4 As Integer
Dim t As Table = Tables("表C")

t.StopReDraw

For i = 0 To t.Rows.Count - 1
    i2 = 0
    For Each c As Col In t.Cols
        If t.Rows(i).IsNull(c) Then
            i2 = i2 + 1 ' 累计为空的列数
        Else
            Exit For ' 遇到第一个不为空的列,则退出循环'
        End If
    Next
    
    If i2 = t.Cols.Count Then ' 累计为空的列数 = 列集合数,则删除该行
        t.Rows(i).Delete()
        i3 = i3 + 1 ' 累计删除的空行数
        i = i - 1 ' 为了再次循环时,保持当前的行号
    Else
        i4 = i4 + 1 ' 累计不为空( 有数据 ) 的行数
    End If
Next

t.ResumeRedraw

output.show("删除前总行数 i = " & i)
output.show("删除的空行数 i3 = " & i3)
output.show("有数据的行数 i4 = " & i4)
output.show("总列数 = " & t.Cols.Count )
output.show("删除后总行数 = " & t.Rows.Count )


 —— 上面这段代码,在正序删除行的时候,经多次测试都正确。

执行结果:

删除前总行数 i = 103
删除的空行数 i3 = 50
有数据的行数 i4 = 103
总列数 = 10
删除后总行数 = 53


 —— 只是,为什么会出现  i = i4 ? 一时没有想清楚。





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


加好友 发短信
等级:狐神 帖子:4627 积分:33767 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By:2020/8/7 16:53:00 [只看该作者]

如果仅仅是为了删除空白行,加一个辅助列即可

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


加好友 发短信
等级:超级版主 帖子:105965 积分:538900 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/8/7 17:17:00 [只看该作者]

我想不出来正序地删除行有什么可让人期待的

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


加好友 发短信
等级:小狐 帖子:335 积分:2674 威望:0 精华:0 注册:2018/11/22 9:19:00
  发帖心情 Post By:2020/8/7 22:11:00 [只看该作者]

dim tbl as table = args(0)   '要删除空行的表
dim Drs as list( of datarow ) = datatable.select (Filter=空行)  ‘FIlter 要根据实际情况写
for each dr as datarow in drs
    ft = dr("主键")
    tbl.datatable.sqldeletefor(ft)
dr.remove
next

’第二种删除空行  
  tbl.datatable.deletefor(filter) :tbl.save   或  tbl.datatable.sqldeletefor(filter)

 

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


加好友 发短信
等级:小狐 帖子:335 积分:2674 威望:0 精华:0 注册:2018/11/22 9:19:00
  发帖心情 Post By:2020/8/7 22:15:00 [只看该作者]

output.show("删除前总行数 i = " & i)    dim Count as intter = tbl.rows.count  '删除前的值
output.show("删除的空行数 i3 = " & i3)   tbl.datatable.select(空行条件).count 
output.show("有数据的行数 i4 = " & i4)  tbl.datatable.select(非空行条件).count 
output.show("总列数 = " & t.Cols.Count )  tbl.cols.count
output.show("删除后总行数 = " & t.Rows.Count ) tbl.rows.count
你循环计数   就失去了Foxtable的优势了

 回到顶部
美女呀,离线,留言给我吧!
龙潭春早
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:676 积分:4895 威望:0 精华:0 注册:2018/3/22 16:05:00
  发帖心情 Post By:2020/8/8 14:47:00 [只看该作者]

嗯 研究一下 多谢!

 回到顶部