Foxtable(狐表)用户栏目专家坐堂 → 表第一次加载出来后,使用遍历全选,会有一行选不上,不知道为啥,很诡异


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

主题:表第一次加载出来后,使用遍历全选,会有一行选不上,不知道为啥,很诡异

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
表第一次加载出来后,使用遍历全选,会有一行选不上,不知道为啥,很诡异  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
回复:(有点甜)For i As Integer = 0 To Tables("SI...  发帖心情 Post By:2019/1/9 11:24:00 [显示全部帖子]

这种全选方式,只能在CurrentChanged没有事件的表里使用。如果有事件,那会非常卡的,有更好的解决方法吗?

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2019/1/10 14:50:00 [显示全部帖子]

这个SystemReady是有什么作用的?好像百度也找不到,能大概说说吗?它可以停止狐表的表事件执行?

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
回复:(有点甜)以下是引用chen37280600在2019/1/10 ...  发帖心情 Post By:2019/1/11 12:00:00 [显示全部帖子]

好,确实绕开了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

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
回复:(chen37280600)回复:(有点甜)以下是引用ch...  发帖心情 Post By:2019/1/13 12:36:00 [显示全部帖子]

我发现这个代码,引发新的bug。我发现当所有行选上以后,再点击一次不会实现反选,以下红色的代码无效。但是如果去掉蓝色的代码,就没问题


Dim t As Table  = Tables("LoanInfo")

'当前版本直接遍历全选,会有部分行失败,由排序的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 =True Then
        r.Checked =False
        MessageBox.show(1)
    Else 
        r.Checked =True
    End If
Next

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
回复:(有点甜)1、用 for i as integer = 0 to t.ro...  发帖心情 Post By:2019/1/14 9:33:00 [显示全部帖子]

用Position不行,看来只能使用SystemReady的方法去停止遍历了

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7959 威望:0 精华:4 注册:2017/12/31 14:53:00
回复:(有点甜)1、用 for i as integer = 0 to t.ro...  发帖心情 Post By:2019/1/14 9:48:00 [显示全部帖子]

在2019.1.4号之前的版本,都有这个问题。给出妥协的代码,此贴可以终结了。以后大家可以用这个代码就好了

-----------------------------------------------
'需求:点击按钮,可以反选所有的行

'思路:
'1用ForEach遍历行去改Check状态,有bug,要使用这种切换Postion的方法改Check状态
'2但是切换Position,会触发CurrentChanged事件,造成性能影响,所以用SystemReady中止事件执行

Dim t As Table = Tables("WHourInfo") '改成你的表名即可
t.StopRedraw '停止表绘制,因为行多会闪烁
SystemReady = False '停止系统事件,这是狐表特有的函数,可以停止系统所有事件的运行

Try
    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    
Catch ex As Exception
    MessageBox.show("程序发生错误,请联系技术员")
End Try

SystemReady = True '启动系统事件
t.ResumeRedraw '启动表绘制
[此贴子已经被作者于2019/1/14 9:50:50编辑过]

 回到顶部