我在这个场景中遇到了困难,并希望有人可以帮我澄清我错过了哪一步/逻辑。我尝试在线搜索,但我找不到解决此问题的示例。
我们正在设置一个搜索页面,当首次加载显示一堆选项(例如,文本框,复选框等)时。用户将填写表单并将表单提交给自己。一旦回发,该页面将使用用户的选项对数据库构建并运行SQL查询(例如,SELECT ID FROM Customers WHERE Company ='Acme'和AmtDue = 3),然后结果将显示。这部分工作正常。
分解的部分是我试图添加分页的时候。结果集是绑定到Repeater的DataTable。我正在使用PagedDataSource来添加分页。分页适用于第一页,但对于后续页面,它不起作用。基本上,不是返回所请求结果的下一页(例如,SELECT ID FROM Customers WHERE Company ='Acme'和AmtDue = 3),返回的结果是在追加用户的搜索选项之前的SQL查询(例如,SELECT ID FROM顾客)。
我认为我的基本问题是我不确定如何区分正常的Page.IsPostBack和通过结果分页。这导致问题的原因是因为我不想重新收集表单数据,重建查询和重新查询数据库。
我在网上找到的示例涉及每次加载页面时重建的DataTable的分页(例如,Not Page.IsPostBack)。
以下是我们代码的大致概述:
Public dtCustomers As DataTable = New DataTable()
Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load
' When the page first loads, show the search form with search options.
If Not Page.IsPostBack Then
ShowSearchForm()
' Once the form is submitted, show the search results.
Else
' ----------------------------------------
' This is the part that I'm having trouble with. How do I skip the following two steps (GatherFormData() and BuildDT()) when the user requests a subsequent page?
GatherFormData()
dtCustomers = BuildDT()
' ----------------------------------------
BindData()
End If
End Sub
Sub BindData()
Dim objPDS As PagedDataSource = New PagedDataSource()
objPDS.DataSource = dtCustomers.DefaultView
objPDS.AllowPaging = True
objPDS.PageSize = intNumPerPage
objPDS.CurrentPageIndex = Me.ViewState("_CurrentPage")
rptSearchResults.DataSource = objPDS
End Sub
' Subroutine called when the previous page button is pressed.
Sub GoToPrevPage()
' Set viewstate variable to the previous page.
Me.ViewState("_CurrentPage") -= 1
BindData()
End Sub
' Subroutine called when the next page button is pressed.
Sub GoToNextPage()
' Set viewstate variable to the next page.
Me.ViewState("_CurrentPage") += 1
BindData()
End Sub
注意:我知道DataTable必须放入缓存或会话变量,但尚未确定最佳方法。
请原谅代码大纲但实际代码很大,所以简化是为了更容易理解问题的核心。
如果有任何不清楚的地方,请告诉我。提前谢谢!
答案 0 :(得分:0)
我假设您要将数据存储在会话/缓存中(我希望稍后但是可以将用例存储在会话中) - 您可以将密钥存储在视图状态和存在密钥可用于确定回发是否用于分页。例如,
if (ViewState["dataKey"] == null)
{
// first form submittal, do the search
GatherFormData();
dtCustomers = BuildDT();
// store it in cache
ViewState["dataKey"] = Guid.NewGuid().ToString(); // create a key
Cache.[ViewState["dataKey"].ToString()] = dtCustomers; // TODO use Add method to control expiration etc
}
重置搜索(或类似条件)时清除视图状态非常重要
最后,还可以从数据库/数据存储进行分页(例如,使用SQL Server中的排名函数),这样您就不必将搜索结果存储到会话/缓存中,而是执行每个回发后的数据库旅行。当完整的结果集大小可能很大时,这种方法很有用。