以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  早期版本的复选框问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=186800)

--  作者:rogen
--  发布时间: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
--  发布时间: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
--  发布时间: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
--  发布时间:2023/5/30 15:31:00
--  
试着抛开自带的复选框,直接对DataTable进行操作呢,效率会高一点吧

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

--  作者:chen37280600
--  发布时间:2023/5/30 17:32:00
--  
加临时列就太麻烦了,在原来基础里选完更简单
--  作者:rogen
--  发布时间:2023/5/30 18:28:00
--  

Position  + SystemReady=False 好用,

谢谢楼上2位。