.NET

индекс
121,03

GridView, и с чем его едят

В этом топике я расскажу об одном замечательном контроле ASP.NET GridView. Многие новички, я думаю, часто встречаются с проблемами в использовании этого контрола. Так же проблемы были и у меня. Отмечу, что в одиночку использовать данный контрол смысла почти нет. Всю свою мощь он проявляет при использовании с каким-либо из источников данных: SqlDataSource, LinqDataSource, ObjectDataSource и другие.
В своих примерах я буду использовать ObjectDataSource.


Итак, приведу простой пример:

<asp:GridView ID="OperationHistoryList" runat="server"
    DataSourceID="OpHistoryListDS"
    AllowPaging="True"
    PageSize="15"
    CssClass="data" AutoGenerateColumns="False"
    onload="OperationHistoryList_Load"
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ДатаВремяЗдесь" />
        <asp:BoundField DataField="СтатусПользователя" />
        <asp:BoundField DataField="КомментКСтатусу" />
    </Columns>

</asp:GridView>

* This source code was highlighted with Source Code Highlighter.


Что здесь для нас интересного? Первое, обязательное – это атрибут runat со значением ”server”. Второе – DataSourceID. В качестве значения указывается идентификатор источника данных, распложенного на странице. Одно важное замечание – GridView может использоваться только внутри серверной формы – <fоrm runаt=”sеrvеr”>. Пара следующих атрибутов, AllowPaging & PageSize задаются для пейджинга. GridView поддерживает пейджинг. Правда, если Вы используете ObjectDataSource, то организовывать пейджинг Вам придется вручную. В моем проекте я использую ORM, написанную в нашей фирме, для включения пейджинга мне приходится перекраивать sql запрос к БД. С SqlDataSource вполне возможно ничего крутить руками не придется. CssClass – говорит сам за себя. AutoGenerateColumns=”false” – Вы сами определяете. Какие колонки показывать (см. вложенный элемент Columns). На первый взгляд, ничего сложного. Ниже приведу ObjectDataSource, настроенный для этого GridView

<asp:ObjectDataSource ID="OpHistoryListDS" runat="server"
    SelectMethod="SelectByMaster"
    TypeName="OperationHistory"
    EnableViewState="false">
    <SelectParameters>
        <asp:Parameter Name="maximumRows" Type="Int32" />
        <asp:Parameter Name="startRowIndex" Type="Int32" />
        <asp:QueryStringParameter Name="masterId" QueryStringField="parent_id" Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>


* This source code was highlighted with Source Code Highlighter.


Пока объяснять что к чему я тут не буду. Этого мы коснемся дальше, когда будем пытаться организовать пейджинг средствами GridView & ObjectDataSource.

GridView поддерживает теймплейты. Теймплейты можно задать для пейджинга, а также для случая, когда источник вернул нам пустые данные (или пусто, или ничего не вернул, кому как будет понятнее).
Кроме этого, возможны широкие настройки стилей для всех составных элементов GridView – header, pager, row, cell и т.п.

Ну и пока закончу знакомить с GridView. Позже расскажу про пейджинг, настройку из codebehind, написание методов выбора данных для ObjectDataSource и многое-многое другое.

Постараюсь ответить на все вопросы. Задавайте.

UPD: завтра про пейджинг, надеюсь уровень будет выше msdn :)
На сегодня немного не рассчитал сил, вот и написал мало
+5
18 ноября 2008, 14:32
6

комментарии (21)

0
imbeat #
что за темплейты?
+1
Smerig #
тра-та-та


тоже тра-та-та
0
Smerig #
хабр теги кушает…

< РаgerTemplate>
тра-та-та
</ РаgerTemplate>

< ЕmptyDataTemplate>
</ ЕmptyDataTemplate>
0
Smerig #
внутри тегов пишешь то, что нужно отобразить, если датасорс не вернул данных, либо что-то специфичное для пейджинга
0
imbeat #
да! с этим понятно!
еще есть TemplateColumn… аналогично, но только для колонок! удобная вещь!
0
Smerig #
Вы используете GridView? И как у Вас дела с пейджингом? :)
0
imbeat #
GridView использую постоянно, пейджинг… только пару раз! специфика проекта подразумевает не большие таблицы!
+3
thorgnir #
простите, а какой смысл в этой статье? ничего, выходящего за рамки одной страницы в msdn вы не написали. те, кто уже пишут на asp.net и так все это знают, либо могут посмотреть за 2 минуты в msdn. А кто не пишет — тому эта инфа и не нужна.

Пишите уж сразу более хитрые и неочевидные вещи.
+2
Smerig #
Пока написал вводную статью. Понимаю. что те, кто пользуется гридвью, многое и без меня знают. Я лишь пытаюсь привлечь новичков, которые могли пытаться использовать этот контрол, но в силу различных граблей могли от него отказаться.

Написать все сразу надо кучу времени. А пока нет, пишу частями
0
Smerig #
надеюсь, завтра будет вторая часть уже с пейджингом. А после перейдем к возникающим подводным камням и увеличению скорости разработки
+2
dmodeus #
Как-то мало информативно.
1. Размыто предназначение контрола
2. Все серверные контролы должны быть с runat=server, иначе они не будут там обрабатываться и рендериться — в html так и остануться <asp:… />. Соответсвенно все серверные контролы должны находиться внутри form и этот form должен быть один на веб-странице. Так устроен ASP.NET, это требования. Так что «одно важное замечание» бессмыслено.
3. Про датагридовский пейджинг нужно помнить одну весщь. Таскает он от SQL все данные и фильтрует уже локально. Так что свой sql пейждинг имеет смысл делать, когда критичен передаваемый объем данных.

Имхо msdn'овская статья полезней будет.
+1
logman #
Согласен при копипасте сюда статьи из msdn толку было бы больше, тем более контрол стандартный.
Так и не понял зачем выдумывать свое описание для того, для чего уже и так есть вся документация.
0
Smerig #
Тут не будет про ObjectDataSource. Именно с ним и спейджингом на его основе было много проблем
0
Smerig #
Я вроде уже указал, что sql запрос нужно переделывать вручную
0
Mephistophele #
Посмотрим на продолжение, для начала очень даже не плохо. Было бы неплохо рассмотреть детально шаблоны(тэмплэйты :) ), и написать какой-либо заковыристый гридик, с сортировочкой по колонкам, с выполнием этого счастья без постбэков.
0
Ordos #
У нас датагрид используется только в админке, где внешний вид не критичен, можно без стилей сразу получить приличную таблицу, но для внешней части сайтов больше подходит Repeater или ListView
0
Smerig #
Это, видимо, из-за сложной настройки gridview?
0
Ordos #
Из-за того, что Repeater или ListView имеют большую гибкость при отображении
0
olen #
С появлением ListView надобность в GridView отпала. А учитывая, что он генерит табличный html, лучше его вообще не использовать. Тем более новичкам.
А статья — простой пересказ информации из MSDN, ничего ценного.
0
Smerig #
называть мою статью просто так пересказом, извините меня. Все писалось мною и без всяких оглядок на мсдн. Статья как уже я написал — вводная. Цель — попытка привлечь новичков.

Дальше можно с Вами поспорить насчет ненадобности гридвью. Понятно, что листвью можно гибко настраивать, делать списками, с помощью css легко списки превратить в галерею. А вот там, где нужно использовать именно таблицы, почему не использовать гридвью? Очень хорошая вещь. Дальше спорить не буду насчет того, что уобнее для отображения табличной информации, грид или лист, ибо листвью еще не пользовался.
0
olen #
Под «пересказом msdn» я имел в виду то, что вы просто изложили сведения, имеющиеся в msdn, не добавив ничего совершенно нового. При этом неважно, заглядывали вы туда или нет.

А чтобы использовать гридвью, там где это будет правильно, надо хорошо понимать весь процесс и все недостатки его использования. Иначе будут получаться приложения-монстры. Поэтому, я и не рекомендую новичкам начинать использовать GridView раньше того же ListView.

GridView в некоторых ситуациях может быть полезен, но это не контрол для новичков, а ваша статья именно на них и рассчитана.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.