Каковы некоторые возможности повышения производительности ASP.NET GridView?

У меня есть довольно простое приложение ASP.NET. Он запрашивает некоторые данные и отображает данные в GridView (возможно от 0 до 2000 записей). Я пытался найти несколько способов сделать его более быстрым, передовым опытом и т. Д., Поскольку он кажется немного вялым во время рендеринга GridView. Я видел несколько тем, посвященных использованию CSS и установке всех стилей непосредственно в GridView, но я не уверен, как это будет выглядеть.

Вот как сейчас выглядит GridView ...

<asp:GridView ID="gvResults" runat="server" DataKeyNames="ORDNO" AutoGenerateColumns="False"
    CellPadding="4" ForeColor="#333333" OnSelectedIndexChanged="gvResults_SelectedIndexChanged"
    Width="100%" OnRowDataBound="gvResults_RowDataBound" meta:resourcekey="gvResultsResource1">
    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
    <Columns>
        <asp:BoundField DataField="CSTNO" HeaderText="CUST" meta:resourcekey="BoundFieldResource1" />
        <asp:BoundField DataField="ORDNO" HeaderText="RMA NUMBER" meta:resourcekey="BoundFieldResource2" />
        <asp:BoundField DataField="CSTORD" HeaderText="CUST PO NUMBER" meta:resourcekey="BoundFieldResource3" />
        <asp:BoundField DataField="ORDDTE" HeaderText="ORDER DATE" meta:resourcekey="BoundFieldResource4" />
        <asp:BoundField DataField="INVDTE" HeaderText="INVOICE DATE" HtmlEncode="False" meta:resourcekey="BoundFieldResource5" />
        <asp:CommandField ShowSelectButton="true" ButtonType="Link" meta:resourcekey="CommandFieldResource1"  />
    </Columns>
    <EditRowStyle BackColor="#999999" />
    <EmptyDataTemplate>
        <span style="color: Red;">
            <asp:Literal ID="litErrorNoRMAFound" runat="server" EnableViewState="False" meta:resourcekey="litErrorNoRMATagsFoundResource1"
                OnInit="litErrorNoRMAFound_Init"></asp:Literal>
        </span>
    </EmptyDataTemplate>
    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#3494CC" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" />
    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
</asp:GridView>

Заранее благодарим за любые ваши идеи / комментарии.


Требования EDIT не допускают разбиение данных на страницы. Я также ищу конкретную информацию об использовании CSS и GridView ...

Ответов (12)

Решение

Не используйте GridView. Если вам нужен контроль, используйте повторитель.

Если вы не используете разбиение на страницы (как упомянуто в комментарии), подумайте о переходе к DataList или даже к Repeater, чтобы уменьшить накладные расходы на сам объект.

Включить пейджинг будет работать;)

Вы можете попробовать использовать состояния просмотра на стороне сервера . Это немного увеличивает нагрузку на сервер, но загрузка / обновление страницы должно происходить намного быстрее.

Включено ли состояние просмотра? Это могло быть много скрытых данных.

Поскольку разбиение на страницы не разрешено, я определенно стараюсь уменьшить общую полезную нагрузку этой сетки:

  1. Использование элемента управления повторителем и создание собственной таблицы TABLE для визуализации этой сетки вместо элемента управления сеткой данных - таким образом я получу полный контроль над полезной нагрузкой. Что-то вроде:
  2. Использование стиля 100% CSS вместо атрибутов элементов управления.
  3. Отключение состояния просмотра (?)

Обратите внимание, что проблема производительности здесь меньше связана с asp.net, а больше с объемом передачи данных с сервера на клиентский компьютер.

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

Несколько идей:

  • Если возможно, исключите viewstate.
  • Если вы используете IIS6 или выше, рассмотрите возможность включения сжатия .
  • Включите разбиение по страницам в GridView, чтобы сократить время запросов.
  • Убедитесь, что ваше развернутое производственное решение скомпилировано для выпуска без ложных директив отладки или трассировки.

Использование CSS должно уменьшить размер разметки.

http://www.jigar.net/howdoi/viewhtmlcontent197.aspx показывает, как стилизовать сетку с помощью CSS.

Вы можете полностью заменить визуализацию сетки адаптерами управления CSS , что должно помочь уменьшить размер разметки.

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

Связанный вариант, который может сильно помочь, - это использование ObjectDataSource, который извлекает только те записи, которые сетка хочет отобразить. Это использует новую конструкцию ROW_NUMBER () в SQL Server. Вот пример метода ObjectDataSource, который извлекает определенный диапазон записей. Он использует мой DAL, но вы должны иметь довольно четкое представление:

    [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public List<SelectClassData> GetList(string sortType, int startRowIndex, int maximumRows)
    {
        if (!BusinessUtilities.SQLSafe(sortType))
            throw new Exception("Illegal value in request (unsafe).");
        startRowIndex++;
        int EndRow = startRowIndex + maximumRows;
        using (BSDIQuery qry = new BSDIQuery())
        {
            if (sortType.Length == 0)
                sortType = "Title";
            return
                qry.Command(
                    "With OrderedClassEvent as (Select ClassID, Title, StartDate, EndDate, ROW_NUMBER() OVER (ORDER BY " + sortType + ") as RowNum From ClassEvent)")
                    .Append(" Select ClassID, Title, StartDate, EndDate From OrderedClassEvent Where RowNum Between @StartRow AND ").ParamVal(startRowIndex)
                    .Append("@EndRow ").ParamVal(EndRow)
                    .Append("Order By RowNum")
                    .ReturnList<SelectClassData>();
        }
   }

Что касается использования CSS и т. Д., Которые не сделают сетку более быстрой, но позволят вам определять атрибуты Grid (например, FooterStyle, HeaderStyle и т. Д.) В файле «Skin», который вы спрячете в каталоге тем. . Это необязательно, но вы также можете определить стили для каждого атрибута с помощью CSS. Файл скина покажет "шаблон" GridView с CssClass для каждого атрибута. Когда вы ссылаетесь создать сетку, вы будете ссылаться на файл кожи , а затем просто оставить из всех определений атрибутов , найденных в этом файл (GridView не будет нуждаться в них , потому что он знает , что делать , основываясь на коже). Это особенно удобно, если вы хотите, чтобы все ваши сетки выглядели одинаково.

Вы можете вывести первые X элементов, затем, когда страница загрузится, получить следующие X элементов и так далее. Это, вероятно, сделает страницу более быстрой для конечного пользователя.

Вам также следует выяснить, что именно замедляет работу страницы, а также проверить, можно ли оптимизировать запрос к базе данных с помощью индексов или чего-то подобного.

  • Отключите viewstate, если это возможно.
  • Используйте Repeater вместо сетки и используйте свой собственный html, что уменьшит отображаемую разметку.
  • Попробуйте использовать хранимую процедуру
  • Если у вас есть методы, которые получают данные из других таблиц в вашем db. Попробуйте использовать вид