| 
         https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx  | 
Элементы-потребители данных 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, сортировка по имени пропадет.
| Имя | 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:
                             
