自己动手设计筛选树

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


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