Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 8:

Элементы-потребители данных. Data-Bound Controls

DataList

DataList имеет те же черты, что и Repeater, то есть выводит данные согласно шаблонам. Однако это более богатый элемент управления. Во-первых, он поддерживает выбор, редактирование, удаление и вставку. Поэтому список шаблонов пополнился SelectedItemTemplate и EditItemTemplate. Кроме того, у него есть верхний и нижний колонтитулы со стилями HeaderStyle и FooterStyle.

Во-вторых, можно изменить способы отображения. По умолчанию DataList выводит данные поколонно в таблице. Свойство RepeatLayout, установленное как Flow, убирает табличные теги из выходного потока. RepeatDirection меняет направление вывода с вертикального на горизонтальное. RepeatColumns задает количество столбцов таблицы, по умолчанию равное 1.

DataList — наследник абстрактного класса BaseDataList, который наследует WebControl. Поэтому у него, в отличие от Repeater, имеются визуальные свойства. При отображении он представляет собой таблицу, поэтому присутствуют свойства CellPadding и CellSpacing.

У DataList есть шаблон по умолчанию, Visual Studio 2005 и VWD создают его в виде вертикально расположенных меток для каждого поля, а слева от них помещают текст с названием поля. Чтобы войти в режим редактирования шаблона, нужно воспользоваться возможностью SmartTagEdit Templates. После того, как редактирование окончено, не забудьте выйти из режима — End Template Editing.

Можно спроектировать этот элемент так, чтобы в обычном состоянии отображалась краткая информация, а в выбранном состоянии — более подробная.

Посмотрим пример из Quickstarts:

<asp:DataList id="DataList1" runat="server"
        BorderColor="black" BorderWidth="1"
        GridLines="Both" CellPadding="3"
        Font-Names="Verdana" Font-Size="8pt"
        Width="150px"
        HeaderStyle-BackColor="#aaaadd"
        AlternatingItemStyle-BackColor="Gainsboro"
        SelectedItemStyle-BackColor="yellow"
        OnItemCommand="DataList_ItemCommand"
     >
    <HeaderTemplate>
         Items
    </HeaderTemplate>
    <ItemTemplate>
        <asp:LinkButton id="button1" runat="server" Text="Show 
details" CommandName="select" />
        <%# DataBinder.Eval(Container.DataItem, "StringValue") %>
    </ItemTemplate>
    <SelectedItemTemplate>
      Item:
        <%# DataBinder.Eval(Container.DataItem, "StringValue") %>
        <br>
      Order Date:
        <%# DataBinder.Eval(Container.DataItem, "DateTimeValue", 
"{0:d}") %>
        <br>
      Quantity:
        <%# DataBinder.Eval(Container.DataItem, "IntegerValue", 
"{0:N1}") %>
      <br>
    </SelectedItemTemplate>
</asp:DataList>

А обработчик выбора записи такой:

void DataList_ItemCommand(object Sender, 
DataListCommandEventArgs e) {
        string cmd = ((LinkButton)e.CommandSource).CommandName;
        if (cmd == "select")
            DataList1.SelectedIndex = e.Item.ItemIndex;
        BindList();
    }

Чтобы реализовать редактирование, тоже нужно обрабатывать событие. Поэтому в 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:

<?xml version="1.0" encoding="utf-8" ?>
<nobel>
  <phisics>
    <phisisist>
      <name>Basov</name>
      <nationality>Russia(USSR)</nationality>
    </phisisist>
    <phisisist>
      <name>Rentgen</name>
      <nationality>Germany</nationality>
    </phisisist>
    <phisisist>
      <name>Bor</name>
      <nationality> Denmark</nationality>
    </phisisist>
  </phisics>
  <literature>
    <writer>
      <name>Boris Pasternak</name>
      <nationality>Russia</nationality>
      <work>"Doctor Zhivago"</work>
      <winningdate>1958</winningdate>
    </writer>
    <writer>
      <name>Romain Rollan</name>
      <nationality>France</nationality>
      <work>"Jean-Cristophe"</work>
      <winningdate>1915</winningdate>
    </writer>
    <writer>
      <name>Gabriel Garsia Marquez </name>
      <nationality>Columbia</nationality>
      <work>"100 years of solitude"</work>
      <winningdate>1982</winningdate>
    </writer>
    <writer>
      <name>George Bernard Shaw</name>
      <nationality>Great Britain</nationality>
      <work></work>
      <winningdate>1925</winningdate>
    </writer>
  </literature>
</nobel>

Тут построена трехуровневая иерархия. Узел < nobel > должен быть прочитан в DataSet. Внутри него есть 2 узла: один с данными о физике, второй — о литературе. Каждый из них будет помещен в DataTable. Узлы < name >, < nationality >, < work >, < winningdate > вложены в < literature > и повторяются для каждого писателя. Они будут считаны в DataColumns таблицы.

Почему узел < work ></ work > у Шоу пустой? Как считал сам Шоу, Нобелевскую премию 1925 года ему дали за то, что в этом году он ничего не написал.

Через методы ReadXml, WriteXml DataSet может читать данные из XML-файла.

Алексей Савельев
Алексей Савельев

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