PagedDataSource не работает с предыдущими / следующими страницами
Мне тяжело с этим сценарием, и я надеюсь, что кто-то может помочь мне прояснить, где я пропускаю шаг / логику. Я попытался выполнить поиск в Интернете, но не смог найти пример, который решает эту проблему.
Мы настраиваем страницу поиска, которая при первой загрузке отображает множество параметров (например, текстовые поля, флажки и т. Д.). Пользователь заполняет форму и отправляет ее обратно самому себе. После публикации на странице будет создан и выполнен SQL-запрос (например, SELECT ID FROM Customers WHERE Company = 'Acme' AND AmtDue = 3) к базе данных с параметрами пользователя, и затем отобразятся результаты. Эта часть работает нормально.
Часть, которая ломается - это когда я пытаюсь добавить нумерацию страниц. Набор результатов представляет собой таблицу данных, привязанную к повторителю. Я использую PagedDataSource для добавления нумерации страниц. Нумерация страниц отлично работает для первой страницы, но для последующих страниц она не работает. По сути, вместо возврата следующей страницы запрошенного результата (например, SELECT ID FROM Customers WHERE Company = 'Acme' AND 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 нужно будет поместить в кеш или переменную сеанса, но я не выбрал лучший метод.
Пожалуйста, извините схему кода, но фактический код является огромным, так что упрощение состоит в том, чтобы облегчить понимание сути проблемы.
Дайте мне знать, если что-то из этого было неясно. Заранее спасибо!
1 ответ
Я предполагаю, что вы собираетесь хранить свои данные в сеансе / кэше (я бы предпочел позже, но может быть вариант для сохранения их в сеансе) - вы можете хранить ключ в состоянии просмотра, и присутствие ключа может быть используйте, чтобы определить, является ли постбэк для нумерации страниц или нет. Например,
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), так что вам не нужно сохранять результаты поиска в сеансе / кэше, а выполнять отключение базы данных по адресу каждый пост-обратно. Такой подход полезен, когда размер полного набора результатов может быть огромным.