Нужно ли повторно извлекать данные при разбивке по страницам, используя asp: GridView - PullRequest
4 голосов
/ 22 сентября 2011

У меня есть экран поиска .aspx, который отображает результаты поиска в компоненте asp: GridView.По результатам поиска может быть возвращено до 1000 записей.Я хочу реализовать разбиение на страницы в сетке, чтобы одновременно отображалось только 15 записей, и пользователь мог просматривать результаты.

Я извлекаю записи, передавая параметры поиска службе WCF, которая возвращаетСписок конкретных объектов.Я создаю Datatable и вставляю по одному DataRow на объект объекта из Списка.Затем я связываю представление сетки с таблицей данных.

Вот как определяется моя сетка на странице .aspx:

<asp:GridView ID="gridCat" runat="server" AutoGenerateColumns="False" DataKeyNames="CatalogueID" 
   HeaderStyle-CssClass="fieldHeading" RowStyle-CssClass="fieldContent" 
    AlternatingRowStyle-CssClass="alternateFieldContent" Width="100%" 
    AllowPaging="True" AllowSorting="True" AutoGenerateDeleteButton="True" 
    PageSize="15">

, и у меня также есть этот метод в коде ((.файл aspx.vb):

    Sub GridPagingAction(ByVal sender As Object, ByVal e As GridViewPageEventArgs) Handles gridCat.PageIndexChanging
    gridCat.PageIndex = e.NewPageIndex
    gridCat.DataBind()
    gridCat.Visible = True
End Sub

Моя проблема заключается в следующем: первая страница отображается правильно, т.е. первые 15 записей отображаются правильно.Однако, когда я перехожу на страницу 2 в сетке, метод GridPagingAction запускается на сервере, но в сетке ничего не отображается - он просто пуст.

Я думаю, что причина этого заключается в том, что Datatableбольше не существует на сервере, когда запрос на вторую страницу попадает на сервер - это правильно?А asp: GridView при рендеринге первой страницы результатов берет только первые 15 записей из Datatble и отправляет их обратно в браузер.Поэтому, когда запрос на вторую страницу поступает в другие записи (т.е. записи 16 - 1000) нигде не существует - все ли это правильно?

Если да, то какое решение лучше - я не вижукак реализовать пейджинг без необходимости выполнения одного из следующих действий:

  1. повторный поиск каждый раз, когда пользователь использует опцию пейджинга;
  2. сохранение результатов поиска в сеансе послепервый Поиск извлекает их каждый раз, когда пользователь использует опцию подкачки;
  3. вручную вставляет результаты поиска в ViewState и извлекает их каждый раз, когда пользователь использует опцию подкачки.

Есть лилучший способ сделать это (или я делаю это неправильно)?Если нет, какой из 3 вариантов вы считаете лучшим?Я склоняюсь к варианту 2, так как не считаю вариант 1 работоспособным и не хочу отправлять множество ненужных данных обратно в браузер согласно варианту 3.

1 Ответ

2 голосов
/ 22 сентября 2011

Все, что вы сказали, правильно.Вы можете использовать ViewState или Session для хранения данных на стороне клиента или сервера, но если у вас действительно есть столько записей, было бы неплохо собирать только те данные, которые вам действительно нужны.

Итак, если вы хотите показать записи с 1 по 10, вы выполняете запрос к базе данных и извлекаете только эти десять записей.Если вы хотите показать следующие десять, вы выполните другой запрос с соответствующими параметрами.

Это значительно улучшит вашу производительность и использование памяти, ЕСЛИ вызов вашей БД не слишком дорогой.

Этостатья может дать вам представление о том, как это сделать: http://dotnetslackers.com/articles/gridview/Optimized-Paging-and-Sorting-in-ASP-NET-GridView.aspx

Если вы хотите простое решение без каких-либо дополнительных усилий, я бы запросил все записи по каждой обратной передаче (ваш вариант # 1).Если вы хотите самое эффективное решение без больших накладных расходов, используйте пользовательский пейджинг.

...