![]() | ||||||||||||||||||||||||||||||
![]() |
![]() |
|
|
|||||||||||||||||||||||||||
![]() |
|
ASP.Net. Лекция 8. Элементы-потребители данных (Data-Bound Controls) (исходники)Источник: ASPNET Mania Асмик Гаряка
Потребители данных отображают данные, полученную из классов источников данных. Они дают большую функциональность. Например, элемент управления GridView может не только показывать данные, но и сортировать, выбирать, редактировать их. Если этой функциональности недостаточно, ее можно расширить, написав собственные обработчики событий. Элементы, которые могут быть связаны с элементами-источниками данных, многообразны. Во-первых, это уже хорошо знакомые DropDownList, ListBox, CheckBoxList, RadioButtonList, BulletedList. Однако, у всех них необходимо в качестве источника данных указывать не DataSource, а DataSourceID. Все эти элементы отображать могут только 1 поле, указанное в DataTextField, с возможностью задания второго в качестве индексного в свойстве DataValueField.
AppendDataBoundItems - это новое свойство. Оно позволяет комбинировать данные из элемента-источника с данными, статически объявленными на странице. Очень интересны элементы управления Repeater и DataList. Они позволяют управлять отображением данных с помощью шаблонов. Синтаксис динамического связыванияМожно получать данные, связанные с элементом управления, в его декларации на странице. Это делается с помощью разновидности блока отображения. В ранних версиях ASP .NET с помощью такого механизма можно было только читать, но теперь возможно и двустороннее связывание. Особенно это важно в элементах управления, использующих шаблоны. Хотя DataGrid и GridView автоматически отображают данные, но и в них для создания нужных эффектов используются столбцы-шаблоны. Для привязки к данным используются разделители <%# %>. В жизненном цикле каждого элемента управления наступает событие DataBinding, во время которого и вычисляются все выражения, заключенные в этот тег. Если в функции Page_Load мы писали
То на странице это можно сделать с помощью
В ASP .NET 1.x данные читались в объекты DataSet или DataReader, после чего вызывался DataBind. в ASP.NET 2.0, если же установлено свойство DataSourceID, то событие DataBinding вызывается автоматически. В сгенерированном ASP.NET классе страницы в обработчике этого события для ContinentDropDownList будет выполняться код datasource = ContinentArrayList; При этом в локальном кеше создается копия прочтенных данных. Для элементов Repeater, DataList, DataGrid синтаксис привязки данных разбирается в событии ItemDataBound, для GridView - в RowDataBound. Эти события вызываются столько раз, сколько записей в источнике данных. Каждый раз, когда ASP.NET встречает эти разделители в шаблоне, внутри элемента Item (RepeaterItem, DataListItem, DataGridItem) создается элемент типа DataBoundLiteralControl, внутри которого записывается выражение внутри разделителей. В обработчике события DataBinding этого элемента определена переменная Container, которая указывает на этот самый Item, то есть секцию элемента. Классы Item хранят данные в свойстве DataItem. Поэтому в шаблонах доступ к данным происходит с помощью синтаксиса Container.DataItem. Возможный синтаксис для доступа к полю
в случае, когда данные получены из DataReader,
в случае, когда данные получены из DataSet,
Этот способ заменяет оба предыдущие, так как DataBinder с помощью статической функции Eval сам определяет тип источника и соответственно его обрабатывает. Метод Eval перегружен, его второй вариант принимает аргумент для форматирования данных.
В ASP .NET 2.0 синтаксис можно упростить и написать
В новых элементах управления GridView, DetailsView, FormView, где поддерживается двунаправленный вывод данных, можно вызывать метод Bind. Его используют в шаблонах редактируемых строк.
RepeaterRepeater в переводе означает «тот, кто повторяет». Среди его значений «студент-второгодник» и «вор-рецидивист». Ведь они тоже повторяют, то что делают. Но это плохие значения, а хорошее - элемент-повторитель заданного шаблона для всех полей источника данных. Шаблон - это множество тегов HTML и серверных элементов управления, которые задают образец для отображения составной части сложного элемента управления. DataGrid может использовать шаблоны или нет, но Repeater без них существовать не может, сам по себе он не имеет визуального представления. Таким образом, программист сам определяет его внешний вид. Кроме DataSourceID и DataMember, собственных свойств у него нет. Поэтому у программиста есть полный контроль над тем, как выводится Repeater. Как минимум, должен быть описан шаблон ItemTemplate. HeaderTemplate отображается один раз в начале отрисовки рипитера, FooterTemplate в конце, SeparatorTemplate между отображением каждого пункта, AlternatingItemTemplate - для четных пунктов. Все серверные элементы управления в шаблоне помещаются целиком, поэтому чтобы получить таблицу, используют простые теги HTML. Например, открывающий тег <table> помещают в HeaderTemplate, а закрывающий в FooterTemplate. В этом примере составляются характеристики сотрудников
В браузере это выглядит так:
Обратите внимание на условные выражения:
Этим достигается тот эффект, что в предложении о мужчине употребляются местоимения мужского, а о женщине - женского рода. В таблице нет поля для пола, но его можно вычислить по TitleOfCourtesy, который у мужчин бывает или "Mr. ", или "Dr.". Если нужно изменить внешний вид всего шаблона, проще всего поместить все его содержимое или весь элемент в Panel и определить в нем стили. С помощью элемента управления Repeater можно создавать этикетки для конвертов, пригласительные билеты и так далее. DataListDataList имеет те же черты, что и Repeater, то есть выводит данные согласно шаблонам. Однако это более богатый элемент управления. Во-первых, он поддерживает выбор, редактирование, удаление и вставку. Поэтому список шаблонов пополнился SelectedItemTemplate и EditItemTemplate. Кроме того, у него есть верхний и нижний колонтитулы со стилями HeaderStyle и FooterStyle. Во-вторых, можно изменить способы отображения. По умолчанию DataList выводит данные поколонно в таблице. Свойство RepeatLayout установленное как Flow, убирает табличные теги из выходного потока. RepeatDirection меняет направление вывода с вертикального на горизонтальное. RepeatColumns задает количество столбцов таблицы, по умолчанию равное 1. DataList наследник абстрактного класса BaseDataList, который наследует WebControl. Поэтому у него в отличие от Repeater, имеются визуальные свойства. При отображении он представляет собой таблицу, поэтому присутствуют свойства CellPadding и CellSpacing. У DataList есть шаблон по умолчанию, Visual Studio 2005 и VWD создают его в виде вертикально расположенных меток для каждого поля, а слева от них текст с названием поля. Чтобы войти в режим редактирования шаблона, нужно воспользоваться возможностью SmartTag - Edit Templates. После того, как редактирование окончено, не забудьте выйти из режима - End Template Editing. Можно спроектировать этот элемент так, чтобы в обычном состоянии отображалась краткая информация, а в выбранном состоянии - более подробная. Посмотрим пример из Quickstarts:
А обработчик выбора записи такой:
Чтобы реализвать редактирование, тоже нужно обрабатывать событие. Поэтому в ASP.NET 2.0 DataList лучше использовать для показа данных без редактирования, а если требуется редактирование, использовать элемент управления FormView. Свойство DataKeyField имеется и у DataGrid, и у DataList. С помощью него происходит связывание с ключевым полем таблицы данных. DataGridЭто очень популярный элемент управления, и неудивительно. Особенно много он применялся в ASP.NET 1.x, но теперь его функции перекрываются GridView. Тем не менее его стоит изучить, так как многие его свойства схожи со свойствами GridView. DataGrid делает очень легким представление табличной информации, которая содержится в базах данных, файлах XML, или создается вручную. Достаточно создать DataGrid, установить свойство DataSource, и получить готовую таблицу на странице. Формат таблицы можно менять независимо от данных. Данные можно сортировать, выбирать, редактировать. В простейшем варианте нужно установить только свойство DataSource, его значением может быть объект, реализующий интерфейс IEnumerable, например SqlDataReader, DataTable. При этом на странице выводится таблица, где строкам соответствуют записи, а столбцам поля. Создадим простой XML-файл с табличной информацией. Это будут данные о лауреатах Нобелевской премии по литературе и физике. Назовите ее nobel.xml.
Тут построена трехуровневая иерархия. Узел <nobel> должен быть прочитан в DataSet. Внутри него есть 2 узла - один с данными о физике, второй о литературе. Каждый из них будет помещен в DataTable. Узлы <name>, <nationality>, <work>, <winningdate> вложены в <literature> и повторяются для каждого писателя. Они будут считаны в DataColumns таблицы. Почему узел <work></work> у Шоу пустой? Как считал сам Шоу, Нобелевскую премию 1925 года ему дали за то, что в этом году он ничего не написал. Через методы ReadXml, WriteXml DataSet может читать данные из XML-файла. Форма, которая читает информацию из этого файла:
Поменяв индекс в DataTable newDataTable = newDataSet.Tables[1] на 3, получим страницу с другими данными - лауреатов премии по литературе. По умолчанию элемент DataGrid сам определяет количество полей в источнике данных и генерирует колонки таблицы. Это определяется свойством AutoGenerateColumns. С элементом управления DataGrid могут быть связаны не все типы данных. Поддерживаются примитивные типы, строки, DataTime и Decimal. Если в поле неподдерживаемый тип, столбец не будет создан. Если ни одного подходящего поля нет, будет выброшено исключение. DataGrid имеет заголовок (Header), который по умолчанию виден, и нижний колонтитул (Footer). При автоматической генерации в заголовке каждого столбца выводится название поля. Если AutoGenerateColumns установить в False, можно самим управлять колонками и определять более сложный его вид. В таком случае надо включать в DataGrid элементы BoundColumn. Некоторые свойства BoundColumn: DataField определяет поле источника данных. DataFormatString задает формат вывода данных. ReadOnly делает поле недоступным для редактирования. В заголовке и нижнем колонтитуле можно установить любой текст, а в заголовке еще и картинку(HeaderText, FooterText, HeaderImageUrl). В ячейку генерируемой DataGrid таблицы вставляется LiteralControl, текст которого берется из источника данных и форматируется в соответствии с DataFormatString. Для редактируемой строки в ячейке появляется TextBox. Есть и другие типы колонок. ButtonColumn отображает в каждой строке командную кнопку. Если связать ее с полем, на кнопках будут надписи из этого поля. EditCommandColumn показывает кнопки для редактирования. HyperLinkColumn превращает текст в гиперссылки. Например, поле PhotoPath можно показать в такой колонке, тогда щелчок по ссылке покажет фотографию. TemplateColumn позволяет определить шаблон отображения, как в DataList. При желании можно программно скрывать и показывать колонки, например:
У элемента DataGrid есть 7 свойств, задающих стили различных его частей или типов строк. Все они имеют тип TableItemStyle. Это AlternatingItemStyle, EditItemStyle, FooterStyle, HeaderStyle, ItemStyle, PagerStyle, SelectedItemStyle. Стили образуют иерархию, то есть атрибут стиль, который выше в иерархии, наследует те, которые ниже, если он его не переопределяет. Порядок в ней такой:
PagerStyle - это стиль пейджера, то есть номеров страниц-гиперссылок, при выборе которых таблица перелистывается. Чтобы пейджер появился, должен быть установлен атрибут AllowPaging и количество записей должно быть больше PageSize. Все эти свойства удобно устанавливать с помощью PropertyBuilder. В Visual Studio 2005 есть возможность автоформатирования, как и у DataList. Новый вариант, без автоматической генерации колонок и со стилями.
Добавим в эту форму с возможностью сортировки. DataGrid поддерживает свойство AllowSorting. Но это только потенциальная возможность сортировки, так как сам элемент сортировать не может, это должен обеспечить программист. При AllowSorting = True в заголовке выводятся гиперссылки, при нажатии на которые вызывается событие SortCommand. Так как нет автогенерации, в описание BoundColumn нужно вставить SortExpression.
Метод-обработчик события SortCommand принимает параметр типа DataGridSortCommandEventArgs, в свойстве SortExpression которого содержится строка - выражение сортировки SortExpression. Необходимо использовать это выражение для сортировки данных, полученных из источника данных.
Где bindData() вынесен в отдельную функцию и вызывается также из Page_Load.
DataGrid поддерживает возможность разбиения на страницы, но для этого тоже приходится писать код обработчиков событий. В WebMatrix имеются шаблоны таких страниц. С появлением GridView такую технику можно считать устаревшей, так как GridView позволяет делать все это с помощью одного только декларативного связывания. Покажем возможность удаления, обновления и редактирования данных в DataGrid с помощью SqlDataSource. Создайте на сервере SQL в базе DemoBase таблицу Users с 3 полями:
Поле UID - автоинкрементное. Поэтому операция INSERT не будет требовать задания его значения. Конечно, это первичный ключ. В таблице свойств найдите IdentitySpecification, раскройте его и выберите (IsIdentity). Будем работать с таблицей с помощью 3 процедур.
Процедура EditUser будет использоваться для вставки записей, если @UID, и для обновления в противном случае.
Процедура для удаления записей.
На форме будет находиться, кроме DataGrid, 2 элемента редактирования NameTextBox и CommentTextBox и кнопка Add. Для наших тайных целей добавим элемент управления типа HiddenField. Эта цель - хранит id текущего элемента и передавать его SqlDataSource. Добавим на форму такой источник данных.
Обратите внимание на то, что в InsertParameters значение параметра UID по умолчанию 0 и он не связан с элементом управления. В остальных случаях он связан с HiddenField1. Значение в это поле будет передаваться в обработчиках. На этот раз DataGrid будет использовать шаблонизированные столбцы TemplateColumn. Этот тип столбца DataGrid позволяет полностью управлять форматом отображения и редактирования данных -можно выводить данные в несколько строк или использовать для редактирования данных любые элементы управления. Например, для отображения булевской информации используем элементы CheckBox.
И остальные элементы:
DataGrid уже будет выводить данные, имеет гиперссылки для правки и удаления, но при нажатии ничего не происходит. Остается написать нужный код. SqlDataSource уже знает параметры команды Delete, это единственный параметр, и связан он был с HiddenField1. Нужно записать значение ключа id в это поле.
Добавление записи происходит еще проще, так как параметры процедуры Insert находятся в тех текстовых полях, которые заполняются для вставки:
В момент начала редактирования текстовые поля прячутся, так как значения из полей редактирования внутри таблицы будут копироваться туда, и нужно скрыть это от пользователя. Кроме того, эти элементы управления во время редактирования не нужны.
Редактирование сложнее. В шаблоне столбцов элемента DataGrid указаны текстовые поля, которые появляются после нажания на ссылку «редактировать». Значения параметров надо брать оттуда, но их нельзя указать в декларации SqlDataSource, потому что они в момент генерации страницы их там просто нет. Например, для того, чтобы установить в режим редактирования строку DataGrid, необходимо присвоить свойству EditItemIndex элемента управления DataGrid значение индекса текущей строки. В событии UpdateCommand в аргументе e находим текущую строку. Обновляемые данные находятся в TextBox-ах в ячейках 0 и 1. Чтобы выйти из режима редактирования, свойству EditItemIndex нужно присвоить значение -1.
После обновления вновь читаем данные и делаем видимыми поля редактирования. Отказ от редактирования без сохранения изменений обрабатывается в событии CancelCommand.
ЗаключениеМы рассмотрели 3 элемента управления, существовавшие с ASP.NET 1.0. Repeater использует только шаблоны, DataList создает таблицу и пользуется шаблоном для отображения ее строк, а DataGrid может обходиться и без шаблонов. Примерно такая же система существует и у новых элементов управления ASP.NET 2.0. Объектная модель упрощает связывание с данными, но ее реальная мощь проявляется при использовании новых элементов управления GridView, DetailsView, FormView, которые мы рассмотрим в следующей лекции. Ссылки по теме
|
|