Foxtable(狐表)用户栏目专家坐堂 → 早期版本的复选框问题


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

主题:早期版本的复选框问题

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


加好友 发短信
等级:二尾狐 帖子:586 积分:4817 威望:0 精华:0 注册:2015/11/22 10:28:00
早期版本的复选框问题  发帖心情 Post By:2023/5/30 14:47:00 [只看该作者]

我一直用的2018版,有个bug
开启table的复选后,全选、反选不能精确的选择全部或者反选,

我写的全选代码如下,偶尔会有记录漏选的情况:
Dim t As Table = Tables(e.Form.name & "_明细表")
For i As Integer = t.Rows.Count -1 To 0 Step -1
    t.Rows(i).Checked  = True
Next

反选:
Dim t As Table = Tables(e.Form.name & "_明细表")
For i As Integer = t.Rows.Count -1 To 0 Step -1
    t.rows(i).Checked  = not t.rows(i).Checked
Next
t.Current.Checked  = not t.Current.Checked   '因为发现反选时,焦点所在行不能反选,就加了这句

2022版已经没这个问题了,但不想升级,用不惯代码编辑器;
动态添加一个复选框的做法我会,但在实现勾选后自动计算勾选记录的金额合计值会很慢,
因为datacolchanged事件里写了计算勾选记录合计金额的代码,全选或反选后,会反复触发这个事件,很慢。

想问问,有没有其他代码可以完整的实现复选框的全选、反选功能?

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


加好友 发短信
等级:二尾狐 帖子:586 积分:4817 威望:0 精华:0 注册:2015/11/22 10:28:00
  发帖心情 Post By:2023/5/30 15:11:00 [只看该作者]

我要复选框的原因是想实现勾选部分记录后能做批量操作(审核、删除等)

因为系统自带的底部合计栏只能显示所有可见记录的合计值,

因此想知道勾选记录的合计值的话只能自己写代码,

我动态添加了一个“选”的布尔值的列,在datacolchanged事件写代码:

Dim tol As Double = 0
Select Case e.DataCol.name
    Case "选"
        If e.DataRow("选") = True Then
            tol+=e.DataRow("金额")
        End If
End Select
e.Form.Controls("合计金额").text=tol

 

这段代码,若是一行行的勾选,问题不大,但若用一楼的全选、反选,则会反复触发这个事件,就很慢。

这段代码能优化不,比如不让反复计算,等所有行都全选/反选结束后再计算合计值。

 


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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2023/5/30 15:21:00 [只看该作者]

我之前有解决方法,可以参考下

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

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

Dim t As Table = Tables("MHUserInfo") '根据情况改成你的表名

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 '启动表绘制

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


加好友 发短信
等级:幼狐 帖子:162 积分:1145 威望:0 精华:0 注册:2020/2/11 11:42:00
  发帖心情 Post By:2023/5/30 15:31:00 [只看该作者]

试着抛开自带的复选框,直接对DataTable进行操作呢,效率会高一点吧

在表里面设计一列(也可以动态添加一个临时列),这一列就是逻辑型的,在DataTable里面直接计算。
至于全选代码导致反复触发,全选代码前面加个SystemReady=False后面加个SystemReady=True

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


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2023/5/30 17:32:00 [只看该作者]

加临时列就太麻烦了,在原来基础里选完更简单

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


加好友 发短信
等级:二尾狐 帖子:586 积分:4817 威望:0 精华:0 注册:2015/11/22 10:28:00
  发帖心情 Post By:2023/5/30 18:28:00 [只看该作者]

Position  + SystemReady=False 好用,

谢谢楼上2位。


 回到顶部