以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  表第一次加载出来后,使用遍历全选,会有一行选不上,不知道为啥,很诡异  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=118344)

--  作者:chen37280600
--  发布时间:2018/4/30 10:17:00
--  表第一次加载出来后,使用遍历全选,会有一行选不上,不知道为啥,很诡异

我的表使用动态加载。第一次加载SIteminfo这个表,然后我启动表的多选,然后全选,会有一行没有被选上,很奇怪。

 

启动表多选的代码:

Tables("SItemInfo").ShowCheckBox = e.Sender.Checked

 

全选代码:(我的按钮名称写“全选/反选”,但我没有添加反选代码)

For Each r As Row In Tables("SItemInfo").rows
        r.Checked =True
Next

 

全选按钮结果:


图片点击可在新窗口打开查看此主题相关图片如下:1.jpg
图片点击可在新窗口打开查看

 

1如果我点击分类,加载其他的数据,再去全选又没有问题了。

2我还试过用倒序遍历全选,也一样会出现。

3出现这个情况后,我不重新加载数据,我点击第二行或者第四第五行,再全选,没用还是漏了。只有我点击了一下那个被漏选的行,然后点一下全选,它才会被选上!

4有时候,第一次加载这个表数据,数据有几十行的时候,还会出现第一行,第4或第5行左右(反正不知名的某一行),和最后一行,没有被选上的诡异情况。

 

我的表的Afterload里有段这样的代码,不知道是否有影响

 

    \'表滚动条默认最左边---
    Dim gt As Table =   Tables(e.DataTable.Name)
    If gt.Rows.Count > 0 Then
        gt.Select(0,0)
    End If
    \'表滚动条默认最左边---

[此贴子已经被作者于2018/4/30 10:21:09编辑过]

--  作者:有点甜
--  发布时间:2018/4/30 15:49:00
--  
For i As Integer = 0 To Tables("SItemInfo").rows.count-1
    Tables("SItemInfo").Position = i
    Tables("SItemInfo").rows(i).checked = True
Next

--  作者:chen37280600
--  发布时间:2019/1/9 11:24:00
--  回复:(有点甜)For i As Integer = 0 To Tables("SI...
这种全选方式,只能在CurrentChanged没有事件的表里使用。如果有事件,那会非常卡的,有更好的解决方法吗?
--  作者:有点甜
--  发布时间:2019/1/9 11:37:00
--  
以下是引用chen37280600在2019/1/9 11:24:00的发言:
这种全选方式,只能在CurrentChanged没有事件的表里使用。如果有事件,那会非常卡的,有更好的解决方法吗?

 

加上systemready

 

systemready = False
For i As Integer = 0 To Tables("SItemInfo").rows.count-1
    Tables("SItemInfo").Position = i
    Tables("SItemInfo").rows(i).checked = True
Next
systemready = True


--  作者:chen37280600
--  发布时间:2019/1/10 14:50:00
--  
这个SystemReady是有什么作用的?好像百度也找不到,能大概说说吗?它可以停止狐表的表事件执行?
--  作者:chen37280600
--  发布时间:2019/1/10 14:52:00
--  
我发现用Position去选择行,它会一直往下滚动选中行,勾选行。如果行数少就没所谓,如果行多,就很麻烦了,一直这样切换下去,

虽然可以通过StopRedraw解决,但是有更好的方法吗?

顺便贴出我的完整代码,给其他人用

--------------------------------------------------
\'用ForEach遍历行去改Check状态,有bug,要使用这种切换Postion的方法改Check状态
\'SystemReady是狐表一个底层函数,可以停止系统所有事件的运行
Dim t As Table = Tables("ItemInfo")
t.StopRedraw \'停止表绘制,因为行多会闪烁
SystemReady = False \'停止系统事件

For i As Integer = 0 To t.Rows.count-1
    t.Position = i
    If t.Rows(i).Checked Then
        t.Rows(i).Checked = False
    Else
        t.Rows(i).Checked = True
    End If
Next

SystemReady = True \'启动系统事件
t.ResumeRedraw \'启动表绘制


[此贴子已经被作者于2019/1/10 15:06:00编辑过]

--  作者:有点甜
--  发布时间:2019/1/10 15:24:00
--  
以下是引用chen37280600在2019/1/10 14:50:00的发言:
这个SystemReady是有什么作用的?好像百度也找不到,能大概说说吗?它可以停止狐表的表事件执行?

 

http://www.foxtable.com/webhelp/scr/2218.htm

 


--  作者:有点甜
--  发布时间:2019/1/10 15:25:00
--  
以下是引用chen37280600在2019/1/10 14:52:00的发言:
我发现用Position去选择行,它会一直往下滚动选中行,勾选行。如果行数少就没所谓,如果行多,就很麻烦了,一直这样切换下去,

虽然可以通过StopRedraw解决,但是有更好的方法吗?

 

把某个字段,升、降排序(排序两次),也可以绕过这个bug

 


--  作者:zhy400137
--  发布时间:2019/1/11 5:28:00
--  
mark
--  作者:chen37280600
--  发布时间:2019/1/11 12:00:00
--  回复:(有点甜)以下是引用chen37280600在2019/1/10 ...
好,确实绕开了bug,现在给出完整代码,方便其他网友
--------------------------------------------

Dim t As Table  = Tables("ItemInfo")

\'当前版本直接遍历全选,会有部分行失败,由排序的BUG引发,所以触发一次排序,绕开BUG---
Dim s As String = t.Sort 
t.Sort ="_identify desc"
t.Sort =s
\'当前版本直接遍历全选,会有部分行失败,由排序的BUG引发,所以触发一次排序,绕开BUG---

For Each r As Row In t.rows
    If r.Checked Then
        r.Checked =False
    Else 
        r.Checked =True
    End If
Next