数据筛选与分页

筛选后的数据,可能还是太多,依然需要分页处理:

 

如何筛选,如何分页,前面都有讲述,并不复杂。

将二者组合起来,首先必须解决的问题是如何保存和传递筛选条件,当然我们可以像页码一样,将条件写在url地址中,用get方式传递。

但是这样的设计,会增加编码难度,我们改用cookie来保存和传递筛选条件,会方便很多,关于cookie,参考:使用cookie

下面是一小段示例代码,清晰地说明了如何通过cookie来保存和传递筛选条件:

Dim flt As String
If e.GetValues.ContainsKey("unfilter") Then
    wb.ClearCookie()

ElseIf
e.PostValues.ContainsKey("product") Then
   
flt =
"
产品 = '" & e.PostValues("product") & "'"
   
wb.AppendCookie("product", e.PostValues("product"))
ElseIf e.Cookies.ContainsKey("product") Then
    flt =
"
产品 = '" & e.Cookies("product") & "'"
End If

代码流程如下:

1、首先判断访问请求中是否包括get参数"unfilter",如果包括,则清除所有Cookie。
2、然后判断PostValues中是否包括product,如果有则从PostValues中提起此值合成筛选条件,然后将product的值保存在cookie中。
3、如果PostValues中是不包括product,就判断cookie中是否包括product,如果有,则提取此值合成筛选条件。

使用流程如下:

1、用户通过筛选页面输入筛选条件,单击确定按钮提交到服务器,此时product的值是保存在
PostValues中的,服务端从PostValues中提取出product合成筛选条件,然后将product的值存入客户端的cookie中。
2、当用户单击上一页、下一页按钮时,保存在cookie中的product值,会自动发送到服务器,服务端从cookie中提取出product值合成筛选条件。
3、如果用户单击"取消筛选"按钮,向服务器发出访问请求"list.htm?unfilter=true",服务段收到请求后,判断请求中包括get参数"unfilter",如是清除cookie,系统回到非筛选状态。

完整的HttpRequest事件代码:

Dim wb As New WeUI
Select
Case e.Path
    Case "filter.htm"
        wb.AddForm("","form1","list.htm")
        With wb.AddInputGroup("form1","ipg1","
数据筛选")
            .AddSelect("product","
产品","|PD01|PD02|PD03|PD04|PD05")
            .AddInput("startdate","
开始日期","date")
            .AddInput("enddate","
结束时间","date")
        End With
        With wb.AddButtonGroup("form1","btg1",True)
            .Add("btn1", "
确定", "submit")
        End With
    Case "list.htm"
        '
合成条件
        Dim flt As String
        If e.GetValues.ContainsKey("unfilter") Then '
如果有unfilter参数,则清除cookie
            wb.ClearCookie()
        ElseIf e.PostValues.Count > 0 Then '
如果是filter.htm访问,则根据用户输入合成条件表达式
            If e.PostValues.ContainsKey("product") Then
                flt = "
产品 = '" & e.PostValues("product") & "'" '合成条件
                wb.AppendCookie("product", e.PostValues("product")) '
将值写入cookie
            Else
                wb.DeleteCookie("product") '
删除cookie
            End If
            If e.PostValues.ContainsKey("startdate") Then
                If flt > "" Then
                    flt = flt & " and "
                End If
                flt = flt & "
日期 >= '" & e.PostValues("startdate") & "'"
                wb.AppendCookie("startdate", e.PostValues("startdate"))
            Else
                wb.DeleteCookie("startdate")
            End If
            If e.PostValues.ContainsKey("enddate") Then
                If flt > "" Then
                    flt = flt & " and "
                End If
                flt = flt & "
日期 <= '" & e.PostValues("enddate") & "'"
                wb.AppendCookie("enddate", e.PostValues("enddate"))
            Else
                wb.DeleteCookie("enddate")
            End If
        Else '
否则根据Cookie合成条件表达式
            If e.Cookies.ContainsKey("product") Then
                flt = "
产品 = '" & e.Cookies("product") & "'"
            End If
            If e.Cookies.ContainsKey("startdate") Then
                If flt > "" Then
                    flt = flt & " and "
                End If
                flt = flt & "
日期 >= '" & e.Cookies("startdate") & "'"
            End If
            If e.Cookies.ContainsKey("enddate") Then
                If flt > "" Then
                    flt = flt & " and "
                End If
                flt = flt & "
日期 <= '" & e.Cookies("enddate") & "'"
            End If
        End If
        '
获取要显示的页码
        Dim page As Integer = 0 '
默认page0,显示第一页
        Dim pageRows As Integer = 10 '
每页10
        If e.GetValues.ContainsKey("page") Then  '
如果地址中有page参数
           
Integer.TryParse(e.GetValues("page"), page) '提取page参数
        End If
        Dim StartRow As Integer = page * pageRows + 1 '此页第一行
        Dim EndRow As Integer = (page + 1) * pageRows '此页最后一行
        '提取此页数据
        Dim cmd As New SQLCommand
        cmd.ConnectionName = "orders" '记得设置数据源名称
        cmd.CommandText = "Select Count(*) From {订单}"
       
If flt > "" Then
            cmd.CommandText = cmd.CommandText & " where " & flt
        End If
        Dim Count As Integer = cmd.ExecuteScalar() '
获取总的行数
        cmd.CommandText = "Select * From (Select Row_Number() Over(Order by
日期) As [NO.], 产品,客户,数量,单价,日期 From 订单 "
        If flt > "" Then
            cmd.CommandText = cmd.CommandText & " where " & flt
        End If
        cmd.CommandText = cmd.CommandText & ") As a "
        cmd.CommandText = cmd.CommandText & "  Where [NO.]>= " & StartRow & " And [NO.] <= " & EndRow
        '
合成网页
        With wb.AddTable("","Table1")
            .CreateFromDataTable(cmd.ExecuteReader)
        End With
        With wb.AddButtonGroup("","btg2", False)
            If page > 0 Then
                .Add("btnPrev", "
上一页","","List.htm?page=" & page - 1)
            End If
            If Endrow < count Then
                .Add("btnNext", "
下一页","","List.htm?page=" & page + 1)
            End If
            If flt  = "" Then
                .Add("btn1", "
筛选", "","filter.htm").kind = 1
            Else
                .Add("btn1", "
取消筛选", "","list.htm?unfilter=true").kind = 1
            End If
        End With

End
Select
e
.WriteString(wb.Build)

 

 


本页地址:http://www.foxtable.com/mobilehelp/topics/0116.htm