数据筛选与分页
筛选后的数据,可能还是太多,依然需要分页处理:
如何筛选,如何分页,前面都有讲述,并不复杂。
将二者组合起来,首先必须解决的问题是如何保存和传递筛选条件,当然我们可以像页码一样,将条件写在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 '默认page为0,显示第一页
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)