自己动手设计筛选树
Foxtable提供的筛选树,能够让我们快速便捷地筛选出所需要的数据。
本节我们将自己编码生成一个筛选树,这并非多此一举,毕竟有时我们会有一些特殊的要求,内置的筛选树不一定能满足我们的需要。
本节的示例文件为CaseStudy目录下的"目录树.Table"。
目的:
设计一个主窗口,在主表左边显示一个数据树,双击某个节点,自动筛选出对应的数据,如下图所示:
设计步骤:
1、新建一个窗口,窗口类型设为主窗口,在窗口中插入一个分区面板。
2、在右分区插入一个Table(表),将其绑定到主表(订单表),并将其停靠属性设置为Fill。
3、在左分区插入一个TreeView(目录树),并将其停靠属性设置为Fill。
4、将分区面板的停靠属性也设为Fill。
5、将窗口的AfterLoad事件设为:
Dim
trv As
WinForm.TreeView
= e.Form.Controls("TreeView1")
trv.BuildTree("订单",
"产品|客户|雇员")
trv.Nodes.Insert("显示所有行",0)
6、将目录树的NodeMouseDoubleClick事件设为:
Dim
Filter As
String
Dim
dr As
DataRow = e.Node.DataRow
'获取生成此节点的行
If
e.Node.Text
<> "显示所有行" Then
Select
Case e.Node.Level
Case 0
Filter =
"[产品]
= '"
& dr("产品")
& "'"
Case 1
Filter =
"[产品]
= '"
& dr("产品")
& "' And [客户]
= '"
& dr("客户")
& "'"
Case 2
Filter =
"[产品]
= '"
& dr("产品")
& "' And [客户]
= '"
& dr("客户")
& "' And [雇员]
= '"
& dr("雇员")
& "'"
End Select
End
If
Tables("订单").Filter
= Filter
7、将窗口的“自动打开”属性设为True。
总共不过十来行代码,即可完成这样一个看似复杂的系统,很简单对不对?
日期列与筛选树
下面的例子使用了SQL语句,如果你还没有接触过SQL语句,可以暂时忽略。
如果需要根据年月来筛选不同的产品:
可以如下修改代码:
1、窗口的AfterLoad事件代码改为:
Dim
cmd As
New SQLCommand
Dim
dt As
DataTable
cmd.CommandText
= "Select Distinct Year(日期)
As 年,
Month(日期)
As 月,
产品
From {订单}"
dt =
cmd.ExecuteReader()
Dim
trv As WinForm.TreeView
= e.Form.Controls("TreeView1")
trv.BuildTree(dt,
"年|月|产品")
trv.Nodes.Insert("显示所有行",0)
上面的代码首先利用SQLCommand生成一个临时表,然后根据这个临时表生成目录树。
临时表包括年、月、产品三列,由于Select语句加上了Distinct关键词,所以提取出来的年、月、日是不重复的。
2、目录树的NodeMouseDoubleClick事件代码改为:
Dim
Filter As
String =
""
If
e.node.Name
<> "显示所有行" Then
Dim
d1 As
Date
Dim d2
As Date
Dim Year
As Integer =
e.Node.DataRow("年")
Dim Month
As Integer =
e.Node.DataRow("月")
Dim Product
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, 1)
'取得该月的第一天
d2 = new
Date(Year,
Month, Date.DaysInMonth(Year,Month))
'取得该月的最后一天
Filter
= "日期 >= #" &
d1 &
"# And 日期 <= #" & d2 & "# And 产品 = '"
& Product
& "'"
End
Select
End
If
Tables("订单").Filter = Filter