Foxtable(狐表)用户栏目专家坐堂 → 能否根据目录树复选框的选中状态进行数据筛选?


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

主题:能否根据目录树复选框的选中状态进行数据筛选?

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/3/9 13:13:00 [显示全部帖子]

这个问题有点大了,Nodes是根据目录树的层数级增加的,我不知道动态遍历n层目录树的代码应该怎么写,这是一个难点。
另外如果象上图所示,勾选了pd03再直接跳开Cs01而选择下一层,要动态组合成筛选语句估计这也是个难点。


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/3/9 14:19:00 [显示全部帖子]

以下是引用狐狸爸爸在2010-3-9 13:41:00的发言:

如果层级固定,还是好办的,否则要定义函数,使用递归。


嗯,固定层级能实现,不过代码好象比较烦琐,这是我写的遍历三层的测试代码(中间还未判断哪些层级重复,哪些层级缺失)

For i As integer = 0 to tv.Nodes.Count -1
    if tv.Nodes(i).Checked Then
        tvname = tvname & ",'" & tv.Nodes(i).name & "'"
    End If
    For n As integer = 0 to tv.Nodes(i).Nodes.Count -1
        if tv.Nodes(i).Nodes(n).Checked Then
            tvname1 = tvname1 & ",'" & tv.Nodes(i).Nodes(n).name & "'"
        End If
        For x As integer = 0 to tv.Nodes(i).Nodes(n).Nodes.Count -1
            if tv.Nodes(i).Nodes(n).Nodes(x).Checked Then
                tvname2 = tvname2 & ",'" & tv.Nodes(i).Nodes(n).Nodes(x).name & "'"
            End If
        Next
    Next
Next


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/3/9 14:20:00 [显示全部帖子]

老六空时给我们来个示例,或者将你所说的方法写入程序可否?

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/3/10 18:29:00 [显示全部帖子]

呵呵,这种筛选应该用 In 好一点。
[此贴子已经被作者于2010-3-10 18:29:36编辑过]

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/3/10 18:55:00 [显示全部帖子]

5楼代码我只贴了上半段,感觉非常笨的代码,所以下半段没贴。

Dim tv As WinForm.TreeView = Forms("主窗口").Controls("TreeView1")
Dim name,tvname,tvname1,tvname2,Filter As String
For i As integer = 0 to tv.Nodes.Count -1
    if tv.Nodes(i).Checked Then
        tvname = tvname & ",'" & tv.Nodes(i).name & "'"
    End If
    For n As integer = 0 to tv.Nodes(i).Nodes.Count -1
        if tv.Nodes(i).Nodes(n).Checked Then
            tvname1 = tvname1 & ",'" & tv.Nodes(i).Nodes(n).name & "'"
        End If
        For x As integer = 0 to tv.Nodes(i).Nodes(n).Nodes.Count -1
            if tv.Nodes(i).Nodes(n).Nodes(x).Checked Then
                tvname2 = tvname2 & ",'" & tv.Nodes(i).Nodes(n).Nodes(x).name & "'"
            End If
        Next
    Next
Next

if tvname2 <> "" Then
    Filter = "[雇员] In (" & tvname2.Trim(",") & ")"
End If
if tvname1 <> "" Then
    if Filter <> "" Then
        Filter = Filter & " And [客户] In (" & tvname1.Trim(",") & ")"
    Else
        Filter = "[客户] In (" & tvname1.Trim(",") & ")"
    End If
End If
if tvname <> "" Then
    if Filter <> "" Then
        Filter = Filter & " And [产品] In (" & tvname.Trim(",") & ")"
    Else
        Filter = "[产品] In (" & tvname.Trim(",") & ")"
    End If
End If
Tables("订单").Filter = Filter


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/3/10 20:46:00 [显示全部帖子]

是的,我循环语句中并没有加判断(5楼有说明),贴后面这段代码只是想说,好象用In更合适一点。

 回到顶部