RowCommand GridView занял 6,7 секунды - PullRequest
2 голосов
/ 18 ноября 2011

Я поместил GridView внутри панели обновлений.

<asp:UpdatePanel ID="UpdatePanel4" UpdateMode="Conditional" ChildrenAsTriggers="true"
                runat="server">
                        <asp:GridView ID="GridView_Overview" OnRowCommand="GridView_Layout_RowCommand" />
</asp:GridView>
</asp:UpdatePanel>

Когда пользователь нажимает кнопку, gridView будет заполнен данными:

GridView_Overview.DataSource = dataTable;
GridView_Overview.DataBind();

Таблица данных содержит более 10000 записей. Поэтому процесс привязки к сетке просмотра занял около 3,4 секунды.

Когда строка выбрана в виде сетки:

protected void GridView_Layout_RowCommand(object sender, GridViewCommandEventArgs e)
 {if (e.CommandName.Equals("Select"))
      {
          int index = Convert.ToInt32(e.CommandArgument);
          GridViewRow row = this.GridView_Overview.Rows[index];
          Int64 pID = Int64.Parse(((Label)row.FindControl("ID")).Text); // abc
      }
 }

Потребовалось 5,6 секунды для выполнения GridView_Layout_RowCommand, как указано выше. В чем здесь проблема? Как я могу улучшить производительность выбора строки. Если я отбрасываю строку кода // abc, то это быстро, но тогда я не могу получить значение ID для дальнейшего процесса.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Эта проблема возникает из-за того, что асинхронная обратная передача из UpdatePanel будет запущена только после обхода всего DOM.Если вы добавляете более 10000 записей на страницу, значит, ваш DOM будет огромным, а задержка будет значительной.

Ключом к решению вашей проблемы является уничтожение элементов DOM GridView до запуска обратной передачи.Таким образом, DOM будет проходить гораздо меньше.

См. Этот блог для получения советов по работе с ситуацией: Низкая производительность GridView внутри UpdatePanel

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

0 голосов
/ 26 ноября 2011

Проверьте, что клиент отправляет обратно на сервер, используя средства разработки браузера.Что вы должны проверить, так это размер сообщения при нажатии.

Если мои подозрения верны (не могу представить, что они исправили его с тех пор, как я в последний раз пытался его удалить), он отправляет все состояние просмотра обратно всервер и вернуть его снова, чтобы сохранить состояние элемента управления на стороне сервера, что в вашем случае с 10000 строк будет весьма существенным.

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

0 голосов
/ 22 ноября 2011

Ответ Элисон упоминает об этом, и я хочу еще раз подчеркнуть: вы действительно не должны отображать 10000 записей одновременно.Даже с минимальным HTML (который GridView не будет генерировать, поскольку он создает длинные идентификаторы на стороне сервера), вы создали огромную страницу для загрузки пользователями.

Вы также создалимного работы для вашего сервера - работа, которая может быть (есть?) совершенно ненужной.Сколько ваших пользователей вы ожидаете, чтобы пройти все 10000 записей одновременно?Это требует больших усилий даже для преданных своему делу людей.

Лучший способ повысить производительность и сделать вашу страницу более удобной в использовании - это добавить подкачку страниц.Это немного сложно, но разбиение по страницам уменьшит размер данных, которые должен передавать ваш сервер, и значительно сократит время, затрачиваемое браузером на вызов AJAX и рендеринг HTML.

Обзор MSDNвверх здесь .По сути, когда страница меняется, вам нужно сделать что-то вроде этого ( примечание: не точный код):

byte pageSize;

protected override void OnInit(EventArgs e)
{
    pageSize = 50;
}

void GridView_Overview_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
    GridView_Overview.DataSource = dataTable.Skip(pageSize * e.NewPageIndex).Take(pageSize);
    GridView_Overview.DataBind();
}

Вы должны будете включить директиву using System.Data.Linq;в верхней части страницы кода.Возможно, вы захотите позволить пользователю выбрать количество элементов на странице, и в этом случае вы получите pageSize из элемента управления на странице, вместо того, чтобы установить его в OnInit, как я сделал.

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