https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx |
Элементы-потребители данных. Data-Bound Controls
Элементы-потребители данных
Потребители данных отображают данные, полученные из классов-источников данных. Они предоставляют много полезных функций. Например, элемент управления GridView может не только показывать данные, но и сортировать, выбирать, редактировать их. Если этой функциональности недостаточно, ее можно расширить, написав собственные обработчики событий.
Элементы, которые могут быть связаны с элементами-источниками данных, многообразны. Во-первых, это уже хорошо знакомые DropDownList, ListBox, CheckBoxList, RadioButtonList, BulletedList. Однако для всех них необходимо в качестве источника данных указывать не DataSource, а DataSourceID. Все эти элементы отображать могут только одно поле, указанное в DataTextField, с возможностью задания второго в качестве индексного в свойстве DataValueField:
<asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT [CategoryName], [CategoryID] FROM [Categories]"> </asp:SqlDataSource> <asp:CheckBoxList ID="CheckBoxList1" runat="server" AppendDataBoundItems="True" DataSourceID="SqlDataSource3" DataTextField="CategoryName" DataValueField="CategoryID"> </asp:CheckBoxList> <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource3" DataTextField="CategoryName"> </asp:DropDownList> <asp:BulletedList ID="BulletedList1" runat="server" BulletStyle="UpperRoman" DataSourceID="SqlDataSource3" DataTextField="CategoryName" DataValueField="CategoryName"> </asp:BulletedList>
AppendDataBoundItems — это новое свойство. Оно позволяет комбинировать данные из элемента-источника с данными, статически объявленными на странице.
Очень интересны элементы управления Repeater и DataList. Они позволяют управлять отображением данных с помощью шаблонов.
Синтаксис динамического связывания
Можно получать данные, связанные с элементом управления, в его декларации на странице. Это делается с помощью разновидности блока отображения. В ранних версиях ASP .NET с помощью такого механизма можно было только читать, но теперь возможно и двустороннее связывание. Особенно это важно в элементах управления, использующих шаблоны. Хотя DataGrid и GridView автоматически отображают данные, но и в них для создания нужных эффектов используются столбцы-шаблоны.
Для привязки к данным используются разделители <%# %>. В жизненном цикле каждого элемента управления наступает событие DataBinding, во время которого и вычисляются все выражения, заключенные в этот тег.
Если в функции Page_Load мы писали
ContinentDropDownList.DataSource = ContinentArrayList;
то на странице это можно сделать с помощью
<asp: DropDownList id=" ContinentDropDownList " datasource='<%# ContinentArrayList %>' runat="server">
В 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.
Возможный синтаксис для доступа к полю:
<%# ((System.Data.DataRowView)Container.DataItem)["City"]%>
в случае, когда данные получены из DataReader,
<%# ((System.Data.IDataRecord)Container.DataItem)["City"]%>
в случае, когда данные получены из DataSet,
или
<%# DataBinder.Eval(Container.DataItem, "City") %>
Этот способ заменяет оба предыдущие, так как DataBinder с помощью статической функции Eval сам определяет тип источника и соответственно его обрабатывает. Метод Eval перегружен, его второй вариант принимает аргумент для форматирования данных:
DataBinder.Eval(Container.DataItem, "Age","{0:2d}")
В ASP .NET 2.0 синтаксис можно упростить и написать
<%# Eval("City")%>
В новых элементах управления GridView, DetailsView, FormView, где поддерживается двунаправленный вывод данных, можно вызывать метод Bind. Его используют в шаблонах редактируемых строк:
<asp:TextBox ID="EditFirstNameTextBox" Runat="Server" Text='<%# Bind("FirstName") %>' />