以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  多选筛选树问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=171326)

--  作者:15666282205
--  发布时间:2021/8/26 14:46:00
--  多选筛选树问题
老师,我们的项目用的是阿里云SQL数据库,表设置为启动不加载,设置了筛选树,显示复选框,想实现多选筛选树。以下的代码在目录树的afterchecknode事件中,多选复选框时只显示最后一次的,如果实现多选显示呢?请您指导。
\'----------------------------------目录树-----------------------
Dim Filter As String = ""
If e.node.Name <> "显示所有行" Then \'要用Name属性,不能用Text属性
    Dim d1 As Date
    Dim d2 As Date
    Dim Year As Integer = e.Node.DataRow("年")
    Dim Month As Integer = e.Node.DataRow("月")
    Dim Day As Integer = e.node.DataRow("日")
    Dim Product As String = e.Node.DataRow("合同序号")
    Dim Product1 As String = e.Node.DataRow("合同名称")
    \'Dim Product2 As String = e.Node.DataRow("考勤员")
    Select Case e.Node.Level
        Case 0
            d1 = New Date(Year,1,1) \'取得该年的第一天
            d2 = new Date(Year,12,31) \'取得该年的最后一天
            Filter = "日期 >= \'" & d1 & "\' And 日期 <= \'" & d2 &  "\'"
        Case 1
            d1 = New Date(Year, Month, 1) \'取得该月的第一天
            d2 = new Date(Year, Month, Date.DaysInMonth(Year,Month)) \'取得该月的最后一天
            Filter = "日期 >= \'" & d1 & "\' And 日期 <= \'" & d2 &  "\'"
        Case 2
            d1 = New Date(Year, Month, day) \'取得该月的第一天
            Filter = "日期 = \'" & d1 & "\'"
        Case 3
            d1 = New Date(Year, Month, day) \'取得该月的第一天
            Filter = "日期 = \'" & d1 & "\' And 合同序号 = \'" & Product & "\'"
            
    End Select
End If
If user.name <> "开发者" AndAlso user.group  <> "会计员"  AndAlso user.group  <> "出纳员"  Then
    If Filter > "" Then
        Filter = Filter & " and 经办人 like \'%" & user.name & "%\'"
    Else
        Filter = "经办人 like \'%" & user.name & "%\'"
    End If
End If
DataTables("现金日记账").LoadFilter = Filter
DataTables("现金日记账").Load()

--  作者:有点蓝
--  发布时间:2021/8/26 14:55:00
--  
参考这里生成条件:http://www.foxtable.com/webhelp/topics/2503.htm
--  作者:15666282205
--  发布时间:2021/8/26 15:23:00
--  
老师,我看过这个帮助,但是我水平比较低,难就难在怎么和我的代码整合起来,您帮忙给弄一下行吗?我把帮助的代码给贴过来,谢谢您了!
Dim nms As String() = {"产品","客户","雇员"} \'指定生成目录树的各列 
Dim qts As String() = {"\'","\'","\'"} \'指定将各列的值括起来的符号,这里都是字符型,所以都是单引号 
Dim trv As WinForm.TreeView = e.Sender 
Dim flt As String 
Dim nd As WinForm.TreeNode 
For Each nd In e.node.allNodes \'清除子节点的选中标记 
    nd.Checked = False 
Next 
nd = e.Node.ParentNode 
Do While nd IsNot Nothing \'清除父节点的选中标记 
    nd.Checked = False 
    nd = nd.ParentNode 
Loop 
For Each nd In trv.AllNodes 
    If nd.Checked  Then 
        Dim rts() As String = nd.FullPath.Split("\\") 
        Dim val As String = ""
        For i As Integer = 0 To rts.length - 1
            If val > "" Then
                val = val & " And "
            End If
            val = val & nms(i) & " = " & qts(i) & rts(i) & qts(i)
        Next
        If flt > "" Then
            flt = flt & " Or (" & val & ")"
        Else
            flt = val
        End If
    End If
Next
Tables("订单").Filter  = fl

--  作者:15666282205
--  发布时间:2021/8/26 15:24:00
--  
老师,这是我学习狐表以来最高端的问题了,期待您的帮助!
--  作者:有点蓝
--  发布时间:2021/8/26 15:25:00
--  
请上传实例测试
--  作者:15666282205
--  发布时间:2021/8/30 16:59:00
--  
老师,我从你们的qq请教了另一位老师,实现了复选的功能,还有个小问题:选择“显示所有行”复选框时出现以下错误提示,选择其他复选框没有问题。请您指导。
.NET Framework 版本:4.0.30319.1026
Foxtable 版本:2020.5.29.8
错误所在事件:窗口,财务管理,TreeView1,AfterCheckNode
详细错误信息:
未将对象引用设置到对象的实例。
以下是代码(在目录树的AfterCheckNode事件中):
Dim trv As WinForm.TreeView = e.Sender
Dim flt As String
For Each nd As WinForm.TreeNode In e.node.Nodes \'清除子节点选中状态
    nd.Checked = False
Next
If e.node.ParentNode IsNot Nothing Then \'去掉父节点选中状态
    e.node.ParentNode.Checked = False
End If
Dim d1 As Date
Dim d2 As Date
For Each nd As WinForm.TreeNode In trv.AllNodes
    If nd.Checked Then
        If flt > "" Then
            flt = flt & " Or "  \'注意用or而不是And
        End If
        If nd.Level = 0 Then \'注意下面的条件都要用括号括起来
            d1 = New Date(nd.DataRow("年"),1,1) \'取得该年的第一天
            d2 = d1.AddYears(1) \'取得该年的最后一天
            flt = flt & "(日期 >= \'" & d1 & "\' And 日期 < \'" & d2 &  "\')"
        ElseIf nd.Level = 1 Then \'注意下面的条件都要用括号括起来
            d1 = New Date(nd.DataRow("年"),nd.DataRow("月"),1) \'取得该年的第一天
            d2 = d1.AddMonths(1) \'取得该年的最后一天
            flt = flt & "(日期 >= \'" & d1 & "\' And 日期 < \'" & d2 &  "\')"
        ElseIf nd.Level = 2 Then \'注意下面的条件都要用括号括起来
            d1 = New Date(nd.DataRow("年"),nd.DataRow("月"),nd.DataRow("日")) \'取得该年的第一天
            flt = flt & "(日期 = \'" & d1 & "\')"
        Else
            d1 = New Date(nd.DataRow("年"),nd.DataRow("月"),nd.DataRow("日")) \'取得该年的第一天
            flt = flt & "(日期 = \'" & d1 & "\' and 合同序号 = \'" & nd.DataRow("合同序号") & "\')"
        End If
    End If
Next
If user.name <> "开发者" AndAlso user.group  <> "会计员"  AndAlso user.group  <> "出纳员"  Then
    If flt > "" Then
        flt =  "(" & flt & ") And 经办人 Like \'%" & user.name & "%\'"
    Else
        flt = "经办人 like \'%" & user.name & "%\'"
    End If
End If
DataTables("现金日记账").LoadFilter = flt
DataTables("现金日记账").Load()

--  作者:有点蓝
--  发布时间:2021/8/30 17:03:00
--  
判断一下如果勾选了“显示所有行”,就就先去掉所有其它的子节点的勾选,然后也不要生成其它勾选条件了
--  作者:15666282205
--  发布时间:2021/8/30 17:13:00
--  
这个代码我不会写,老师,麻烦您帮忙改一下好吗?
--  作者:有点蓝
--  发布时间:2021/8/30 17:26:00
--  
if e.node.text = "显示所有行" andalso e.node.checked then
DataTables("现金日记账").LoadFilter = ""
DataTables("现金日记账").Load()
else
e.Sender.nodes(0).checked = false
原来的事件代码
endif

--  作者:15666282205
--  发布时间:2021/8/30 18:05:00
--  
老师,功能正常,没有错误提示了。但是“显示所有行”前面的复选框不能选中,就这样吧,不影响用。谢谢!