可以多选的筛选树

本节的内容可以参考CaseStudy目录下的文件: 多选筛选树.Table

本节的任务是生成一个可以多选的筛选树:

常规设计

设计步骤非常简单:

1、新建一个窗口,插入一个目录树控件,将目录树的“显示复选框”属性设置为True。

2、将窗口的AfterLoad事件代码设置为:

e.Form.Controls("TreeView1").BuildTree("订单", "产品|客户")

3、将目录树的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
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 '
注意下面的条件都要用括号括起来
            flt = flt & "(
产品 = '" & nd.Text & "')"
       
Else
            flt = flt & "( 产品 = '" & nd.ParentNode.Text & "' And 客户 = '" & nd.Text & "')"
        End If
    End If   

Next
Tables
("订单").Filter = flt

通用设计

上述常规编码方式,目录树的层级越多,代码就越复杂,下面我们提供一个通用的筛选树代码,不过有多少层,代码都一样。

设计步骤同样很简单:

1、新建一个窗口,插入一个目录树控件,将目录树的“显示复选框”属性设置为True。

2、将窗口的AfterLoad事件代码设置为:

e.Form.Controls("TreeView1").BuildTree("订单", "产品|客户|雇员")

3、将目录树的AfterCheckNode事件代码设置为:

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  = flt

至此这个多层的筛选树已经设计完成,而且代码是完全通用的,例如我们要根据产品、日期、折扣三列生成筛选树,只需稍作调整即可:

1、将窗口事件AfterLoad的代码改为:

e.Form.Controls("TreeView1").BuildTree("订单", "产品|日期|折扣")

2、将目录树的AfterCheckNode事件的 前两行代码改为:

Dim nms As String() = {"产品","日期","折扣"} '指定生成目录树的各列
Dim qts As String() = {"'","#",""} '指定将各列的值括起来的符号

前后只需修改三行代码,唯独需要注意的是指定将各列的值括起来的符号时,记得字符列用单引号,日期列用符号#,数值列则不需要指定符号,例如上面的折扣列。


本页地址:http://www.foxtable.com/webhelp/topics/2503.htm