可以多选的筛选树
本节的内容可以参考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()
=
{"'","#",""}
'指定将各列的值括起来的符号
前后只需修改三行代码,唯独需要注意的是指定将各列的值括起来的符号时,记得字符列用单引号,日期列用符号#,数值列则不需要指定符号,例如上面的折扣列。