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

Элементы-потребители данных ASP .NET 2.0

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Аннотация: Элементы управления для отображения данных ASP .NET 2.0.

В ASP .NET появились 3 новых элемента управления для отображения табличных данных: GridView, DetailsView и FormView.

GridView

Элемент управления GridView является усовершенствованным элементом, призванным заменить DataGrid. Все сказанное о DataGrid относится к GridView, но с немного другими названиями. Так, вместо BoundColumn употребляется BoundField, а в названиях стилей вместо Item находится Row. Таким образом, любой DataGrid можно преобразовать в GridView, но не наоборот. Хотя в простейшем варианте GridView отображает такую же таблицу, он наследник не DataGrid, а CompositeDataBoundControl.

Главное преимущество GridView — автоматическое связывание с данными, благодаря чему нет необходимости писать обработчики событий, чтобы обеспечить функциональность, такую как удаление, редактирование, сортировка, разбиение на страницы при условии связывания с элементами-источниками данных. Он обеспечивает стандартную обработку подобных событий, но ее всегда можно расширить, чтобы обеспечить дополнительные возможности.

В отличие от версии 1.1, новые элементы могут работать и на мобильных устройствах.

GridView вместе с SqlDataSource появится простым перетаскиванием таблицы Users на форму:

<asp:GridView ID="GridView1" runat="server" 
    AutoGenerateColumns="False" DataKeyNames="UID"
    DataSourceID="SqlDataSource1" 
    EmptyDataText="There are no data records to display.">
    <Columns>
        <asp:BoundField DataField="name" HeaderText="name" 
SortExpression="name" />
        <asp:BoundField DataField="Comments" 
HeaderText="Comments" SortExpression="Comments" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
ConnectionString="<%$ ConnectionStrings:DemoBaseConnectionString1 %>"
        DeleteCommand="DELETE FROM [Users] WHERE [UID] = @UID" 
InsertCommand="INSERT INTO [Users] ([UID], [name], [Comments]) 
VALUES (@UID, @name, @Comments)"
        ProviderName="<%$ 
ConnectionStrings:DemoBaseConnectionString1.ProviderName %>"
    SelectCommand="SELECT [UID], [name], [Comments] FROM [Users]" 
UpdateCommand="UPDATE [Users] SET [name] = @name, [Comments] = 
@Comments WHERE [UID] = @UID">
    <InsertParameters>
        <asp:Parameter Name="UID" Type="Int32" />
        <asp:Parameter Name="name" Type="String" />
        <asp:Parameter Name="Comments" Type="String" />
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="name" Type="String" />
        <asp:Parameter Name="Comments" Type="String" />
        <asp:Parameter Name="UID" Type="Int32" />
    </UpdateParameters>
    <DeleteParameters>
        <asp:Parameter Name="UID" Type="Int32" />
    </DeleteParameters>
</asp:SqlDataSource>

Установка свойства AllowSorting создает в заголовке гиперссылки, при нажатии на которые таблица будет сортироваться по выбранному полю. В этом проявляется преимущество перед DataGrid, в котором для сортировки необходимо переопределить событие SortCommand (рис. 9.1).

После повторного нажатия на заголовок таблица сортируется по этому полю в убывающем порядке.

Иногда значения в каком-либо поле могут повторяться, и нужно отсортировать значения сначала по первому полю, затем по второму. Но сортировка по умолчанию сортирует только по одному полю. Если теперь нажать мышкой на Comments, сортировка по имени пропадет.


Рис. 9.1.
Имя Comments
Burda Одесса, ведущий кулинар
Burda Редактор журнала мод
Bush Вашингтон, президент
Bush Буш-отец

В таком случае поможет немного кодирования. Переопределим событие Sorting:

protected void GridView1_Sorting(object sender, 
GridViewSortEventArgs e)
{
    string oldExpression = GridView1.SortExpression;
    string newExpression = e.SortExpression;
    if (oldExpression.IndexOf(newExpression) < 0)
    {
        if (oldExpression.Length > 0)
             e.SortExpression = oldExpression + ", " + 
newExpression;
         else
             e.SortExpression = newExpression;
     }
     else
     {
         e.SortExpression = oldExpression;
     }
}

Отсортируем сначала по имени, потом по Comments:

Имя Comments
Burda Одесса, ведущий кулинар
Burda Редактор журнала мод
Bush Буш-отец
Bush Вашингтон, президент
< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Алексей Савельев
Алексей Савельев

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