以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  多选筛选树问题,自己把自己搞晕了  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=140095)

--  作者:foxyuan
--  发布时间:2019/8/29 11:53:00
--  多选筛选树问题,自己把自己搞晕了
搞了挺长时间,越搞头越大,问题想复杂了
问题:
1)选一个总类下的分类,再选另一个总类下的分类,会报错。
2)反复点显示全部或是某个总类,会不时地出现√出现的不对的情况。

总是照猫画虎,基础还是不扎实,请高手帮忙看看。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:多选筛选树.table


--  作者:有点蓝
--  发布时间:2019/8/29 12:06:00
--  
测试没有问题呀。关闭退出项目,删除项目所在的文件夹里的bin目录,然后重启项目试试。

另外目录树的勾选操作不能太快,这个问题暂时无法解决

--  作者:foxyuan
--  发布时间:2019/8/29 12:13:00
--  
谢谢。先勾选一个小分类,再去勾选另一个大类下的小分类,肯定会报错的。
--  作者:foxyuan
--  发布时间:2019/8/29 12:16:00
--  
如图。
图片点击可在新窗口打开查看此主题相关图片如下:{1de067d0-f61e-4d6c-83d3-ac8a00af004f}_20190829121459.jpg
图片点击可在新窗口打开查看

--  作者:有点蓝
--  发布时间:2019/8/29 13:50:00
--  
……
Else
    For Each nd In e.node.Nodes \'清除子节点选中状态
        nd.Checked = False
    Next
    If e.node.ParentNode IsNot Nothing Then \'去掉父节点选中状态
        e.node.ParentNode.Checked = False
    End If
    For Each nd In trv.AllNodes
        If nd.Checked = True Then
            If Filter > "" Then
                Filter = Filter & " Or "  \'注意用or而不是And
            End If
            Select Case nd.Level
                Case 0                          \'注意下面的条件都要用括号括起来
                    Dim T1 As String = nd.Text
                    Filter = Filter & "([总类] = \'" & T1 & "\')"
                Case 1
                    Dim T1 As String = nd.Text
                    Dim T2 As String = nd.ParentNode.Text
                    Filter = Filter & "( 总类 = \'" & T2 & "\' And 分类 = \'" & T1 & "\')"
            End Select
        Else
            Select Case e.Node.Level
                Case 0
                    If nd.Nodes.Count > 0
                        For Each nd1 In nd.AllNodes
                            nd1.Checked = False
                        Next
                    End If
                    
            End Select
        End If
    Next
End If


--  作者:foxyuan
--  发布时间:2019/8/29 15:32:00
--  
谢谢蓝大师。按你的代码测了一下,能做到按需筛选了,但与我最初想法不太一致,看看能不能再完美些:
1)做不到选子节点时,父节点也要打个√。或点选父节点时其子节点全部打上√。当然这仅要求在外观上。
2)可以先选大类PD01,再去选第二个大类PD02下的CS01,但做不到先选PD01下的CS01再后选第二个大类PD02。当然操作时可以反过来操作能做到筛选目的。
3)可以同时选不同的大类,也可以同时选不同大类下的小类,还可以先选不同的大类再去选小类,但不能先选任一个小类,再去选别的大类,那样所有的小类会去选。


--  作者:有点蓝
--  发布时间:2019/8/29 16:14:00
--  
5楼的用法就可以了,搞那么复杂干啥,控制麻烦不说,还给用户增加负担。

用户做个筛选,任意勾选都应该可以继续筛选,还非得勾选大类才能勾选小类,麻烦不!

--  作者:foxyuan
--  发布时间:2019/8/29 17:51:00
--  
有道理。不过没有表达清楚,我是说现在还有这三个问题存在,不是要达成这三条。
--  作者:有点蓝
--  发布时间:2019/8/30 11:28:00
--  
去掉这段代码

Else
            Select Case e.Node.Level
                Case 0
                    If nd.Nodes.Count > 0
                        For Each nd1 In nd.AllNodes
                            nd1.Checked = False
                        Next
                    End If
                    
            End Select

--  作者:foxyuan
--  发布时间:2019/8/30 16:35:00
--  
ok,谢谢蓝大师