Опубликован: 14.11.2006 | Уровень: для всех | Доступ: платный
Лекция 8:

Элементы-потребители данных. 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") %>' />
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет