twitterfacebookrss

Постраничная выборка ASP.NET

Постраничная выборка

Эта статья посвящена примеру организации постраничной выборки в многослойной архитектуре, в стеке Microsoft-овских технологий ASP.NET + MS SQL Server.

Итак, вам по каким-то причинам не нравится стандартный механизм работы GridView в связке с ObjectDataSource. Вкратце напомню, что такой подход постулирует декларативный подход к разработке, т.е. вы вначале должны настроить компонент, задав класс, который содержит в себе данные, которые в свою очередь должен отобразить GridView, отлавливать различные событии и т.д.




В общем, не наш это подход. Мы хотим полный контроль безо всяких там рефлексий. Но если мы отказываемся от этого подхода, пейджинг придётся делать самим.

Отлично, создаём пустую Project Library, наследуемся от стандартного GridView и добавляем ему поддержку пейджинга, т.е. учим его рисовать циферки-ссылочки.

Здесь мы столкнёмся с багом – если GridView не используется в связке с ObjectDataSource, SortDirection всё время будет Ascending. Для решения этой проблемы мы сами отслеживаем направление сортировки через ViewState.

Для поддержки пейджинга GridView необходимо количество всех записей в таблице и реализация события GridView_PagerPageChanged. Также, для поддержки постраничной выборки с сервера БД, программист обязан посылать серверу следущие переменные:

  • Выражение сортировки
  • Идекс страницы
  • Размер страницы

И на выходе мы получаем довольно прямолинейное использование GridView:


    private void FillGrid(String sortExpression, Int32 startRowIndex, Int32 maximumRows)
    {
        DataTransferObject dto = DataProvider.GetEmployees(sortExpression, startRowIndex, maximumRows); 
  //получаем список работников + количество строк в таблице
        this.GridView.TotalRows = dto.TotalRows; //передаем CosmicGrid количество записей в таблице
        this.GridView.DataSource = dto.Data; //отдаем данные (любой IEnumerable)
        this.GridView.DataBindExt();//вместо DataBind() вызываем DataBindExt()
    }

Где DataTransferObject:

public sealed class DataTransferObject
{
     public List Data //данные
     { get; set; }

     public Int32 TotalRows //количество всех записей, для GridView
     { get; set; }
}

На уровне MS SQL Server поддержку постраничной выборки можно организовать различными способами.

Выбирайте подходящий для себя. Мы выбрали второй вариант.

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс
Автор статьи: Александр Шибанов

Александр Шибанов IT - предприниматель с более чем 10 летним стажем в индустрии. Принимал участие в различных по сложности проектах, на позициях программиста и руководителя проектов. С 2011 - года индивидуальный предприниматель.

Комментарии:

1 Comment

  1. Проектные ошибки | Development Practices.ru - Разработка, программирование и архитектура программного обеспечения · 28.04.2011

    [...] от стандартного механизма постраничной выборки (пейджинга), который предлагает Microsoft, из-за того, что этот [...]