以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [讨论] 在表中,正序删除空行方法的探讨  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=153346)

--  作者:龙潭春早
--  发布时间: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
--  发布时间:2020/8/7 16:53:00
--  
如果仅仅是为了删除空白行,加一个辅助列即可
--  作者:有点蓝
--  发布时间:2020/8/7 17:17:00
--  
我想不出来正序地删除行有什么可让人期待的
--  作者:nxhylczh
--  发布时间: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
--  发布时间: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的优势了

--  作者:龙潭春早
--  发布时间:2020/8/8 14:47:00
--  
嗯 研究一下 多谢!