Foxtable(狐表)用户栏目专家坐堂 → 多选筛选树问题


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

主题:多选筛选树问题

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


加好友 发短信
等级:二尾狐 帖子:541 积分:4291 威望:0 精华:0 注册:2019/1/13 10:12:00
多选筛选树问题  发帖心情 Post By: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()

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


加好友 发短信
等级:超级版主 帖子:110790 积分:563882 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/8/26 14:55:00 [只看该作者]


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


加好友 发短信
等级:二尾狐 帖子:541 积分:4291 威望:0 精华:0 注册:2019/1/13 10:12:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:541 积分:4291 威望:0 精华:0 注册:2019/1/13 10:12:00
  发帖心情 Post By:2021/8/26 15:24:00 [只看该作者]

老师,这是我学习狐表以来最高端的问题了,期待您的帮助!

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


加好友 发短信
等级:超级版主 帖子:110790 积分:563882 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/8/26 15:25:00 [只看该作者]

请上传实例测试

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


加好友 发短信
等级:二尾狐 帖子:541 积分:4291 威望:0 精华:0 注册:2019/1/13 10:12:00
  发帖心情 Post By: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()

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


加好友 发短信
等级:超级版主 帖子:110790 积分:563882 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/8/30 17:03:00 [只看该作者]

判断一下如果勾选了“显示所有行”,就就先去掉所有其它的子节点的勾选,然后也不要生成其它勾选条件了

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


加好友 发短信
等级:二尾狐 帖子:541 积分:4291 威望:0 精华:0 注册:2019/1/13 10:12:00
  发帖心情 Post By:2021/8/30 17:13:00 [只看该作者]

这个代码我不会写,老师,麻烦您帮忙改一下好吗?

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


加好友 发短信
等级:超级版主 帖子:110790 积分:563882 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:541 积分:4291 威望:0 精华:0 注册:2019/1/13 10:12:00
  发帖心情 Post By:2021/8/30 18:05:00 [只看该作者]

老师,功能正常,没有错误提示了。但是“显示所有行”前面的复选框不能选中,就这样吧,不影响用。谢谢!

 回到顶部