Каковы некоторые возможности улучшения производительности ASP.NET GridView? - PullRequest
4 голосов
/ 25 февраля 2009

У меня есть приложение 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 ]

11 голосов
/ 25 февраля 2009

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

  • Устранить состояние просмотра, если это возможно.
  • Если вы используете IIS6 или новее, рассмотрите возможность включения сжатия .
  • Включите подкачку в GridView, чтобы сократить время запроса.
  • Убедитесь, что ваше развернутое производственное решение скомпилировано с выпуском без каких-либо мошеннических директив по отладке или трассировке
10 голосов
/ 26 февраля 2009

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

3 голосов
/ 25 февраля 2009

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

2 голосов
/ 25 февраля 2009

Viewstate включен? Это может быть много скрытых данных.

2 голосов
/ 25 февраля 2009

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

1 голос
/ 25 февраля 2009

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

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

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

1 голос
/ 25 февраля 2009

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

Связанный параметр, который может помочь lot , заключается в использовании 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 и т. Д., Которые не сделают сетку zippier, но позволят вам определить атрибуты Grid (например, FooterStyle, HeaderStyle и т. Д.) В файле "Skin", который вы будете скрывать каталог тем. Это необязательно, но вы также можете определить стили для каждого атрибута, используя CSS. В файле скина будет показан «шаблон» GridView с CssClass для каждого атрибута. Когда вы ссылаетесь на создание сетки, вы ссылаетесь на файл Skin, а затем просто пропускаете все определения атрибутов, найденные в этом файле (gridview не нуждается в них, потому что он знает, что делать на основе на коже). Это особенно здорово, если вы хотите, чтобы все ваши сетки выглядели одинаково.

1 голос
/ 25 февраля 2009

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

0 голосов
/ 26 февраля 2009
  • Отключить режим просмотра, если это возможно.
  • Используйте Repeater вместо сетки и используйте ваш собственный HTML, это уменьшит предоставленная наценка
  • Попробуйте использовать хранимую процедуру
  • Если у вас есть какие-либо методы, которые получают некоторые данные из других таблиц в вашем дб. Попробуйте использовать вид
0 голосов
/ 25 февраля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...