2010-06-29 2 views
0

Недавно я приобрел элементы управления Telerik. Я получаю проблемы с производительностью с помощью radgrid.Результат работы Radgrid с большим количеством записей

  1. Я реализовал пейджинг для радиосети с 6000 записей. И я создал опцию viewall на rg402_ItemCreated для radcombo. Когда я выбираю viewall, его занимает 20 секунд, чтобы привязать данные к сетке, и после этого brower застревает (как Firefox 3.6.4, так и IE7) и отображает ошибку (см. Прилагаемое изображение). В любом случае, необходимо изменить код опции viewall, чтобы быстро получить данные. или все равно, чтобы улучшить производительность и сократить время привязки записей.

Вот мой код.

.aspx код

style type="text/css"> 
    .rgPageFirst, .rgPagePrev, .rgPageNext, .rgPageLast 
    { 
     display: none !important; 
    } 
    div.RadGrid_Default .rgHeader, div.RadGrid_Default th.rgResizeCol 
    { 
     background-image: none; 
    } 
</style> 

<script type="text/javascript"> 
    function onRequestStart(sender, args) { 
     if (args.get_eventTarget().indexOf("ExportToExcelButton") >= 0 || 
       args.get_eventTarget().indexOf("ExportToWordButton") >= 0 || 
       args.get_eventTarget().indexOf("ExportToPdfButton") >= 0 || 
       args.get_eventTarget().indexOf("ExportToCsvButton") >= 0) { 

      args.set_enableAjax(false); 
     } 
    } 
</script> 

<div> 
    <tr> 
     <td colspan="2"> 
      <asp:Label runat="server" Font-Bold="true" Font-Size="14pt" ID="lblTskName"></asp:Label> 
     </td> 
    </tr> 
    <br /> 
</div> 
<div> 
    <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> 
    </telerik:RadScriptManager> 
    <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> 
     <ClientEvents OnRequestStart="onRequestStart" /> 
     <AjaxSettings> 
      <telerik:AjaxSetting AjaxControlID="rg402"> 
       <UpdatedControls> 
        <telerik:AjaxUpdatedControl ControlID="rg402" LoadingPanelID="RadAjaxLoadingPanel1" /> 
       </UpdatedControls> 
      </telerik:AjaxSetting> 
     </AjaxSettings> 
    </telerik:RadAjaxManager> 
    <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" Skin="Default"> 
    </telerik:RadAjaxLoadingPanel> 
    <telerik:RadGrid ID="rg402" runat="server" AutoGenerateColumns="false" Height="550px" 
     OnNeedDataSource="rg402_NeedDataSource" Width="120%" AllowPaging="True" AllowSorting="True" 
     AllowMultiRowSelection="True" EnableHeaderContextMenu="true" GridLines="None" 
     EnableHeaderContextFilterMenu="true" AllowMultiRowEdit="true" AllowFilteringByColumn="True" 
     OnPreRender="rg402_PreRender" OnItemCreated="rg402_ItemCreated" EnableViewState="false"> 
     <HeaderStyle HorizontalAlign="Center" BorderWidth="1px" Font-Bold="true" Font-Size="8pt" /> 
     <ExportSettings IgnorePaging="true" ExportOnlyData="true"> 
      <Pdf AllowModify="false" AllowPrinting="true" PageBottomMargin="" PageFooterMargin="" 
       PageHeaderMargin="" PageHeight="11in" PageLeftMargin="" PageRightMargin="" PageTopMargin="" 
       PageWidth="14in" /> 
     </ExportSettings> 
     <MasterTableView DataKeyNames="orderId" CommandItemDisplay="Top" EditMode="InPlace" 
      PageSize="30"> 
      <CommandItemSettings ShowExportToWordButton="true" ShowExportToExcelButton="true" 
       ShowExportToCsvButton="true" ShowExportToPdfButton="true" ShowAddNewRecordButton="false" /> 
      <Columns> 
       <telerik:GridClientSelectColumn UniqueName="ClientSelectColumn" HeaderStyle-Width="3%" 
        ItemStyle-Width="3%"> 
       </telerik:GridClientSelectColumn> 
       <telerik:GridBoundColumn UniqueName="sId" HeaderText="sId" DataField="sId" Visible="false"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="orderId" HeaderText="orderId" DataField="orderId" 
        Visible="false"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="Customer Name" HeaderText="Customer Name" DataField="Customer Name" 
        ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="Market Name" HeaderText="Market Name" DataField="Market Name" 
        ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="LOB" HeaderText="LOB" DataField="LOB" ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="Headend Name" HeaderText="Headend Name" DataField="Headend Name" 
        ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="Project Name" HeaderText="Project Name" DataField="Project Name" 
        ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridHyperLinkColumn UniqueName="Site Name" HeaderText="Site Name" DataTextField="Site Name"> 
       </telerik:GridHyperLinkColumn> 
       <telerik:GridBoundColumn UniqueName="Task Status" HeaderText="Task Status" DataField="Task Status" 
        ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="Plant Test Date" HeaderText="Plant Test Date" 
        DataField="Plant Test Date" ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="CORE CM Number" HeaderText="CORE CM Number" 
        DataField="CORE CM Number" ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="Req SM Imp Date" HeaderText="Req SM Imp Date" 
        DataField="Req SM Imp Date" ReadOnly="true"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="SM Ticket Number" HeaderText="SM Ticket Number" 
        DataField="SM Ticket Number"> 
       </telerik:GridBoundColumn> 
       <telerik:GridBoundColumn UniqueName="Sch SM Imp Date" HeaderText="Sch SM Imp Date" 
        DataField="Sch SM Imp Date"> 
       </telerik:GridBoundColumn> 
       <telerik:GridEditCommandColumn UniqueName="ECC402"> 
       </telerik:GridEditCommandColumn> 
      </Columns> 
     </MasterTableView> 
     <ClientSettings EnableRowHoverStyle="true" ReorderColumnsOnClient="false" AllowDragToGroup="false" 
      AllowColumnsReorder="True"> 
      <Scrolling AllowScroll="true" UseStaticHeaders="true" /> 
      <Selecting AllowRowSelect="True"></Selecting> 
      <Resizing AllowRowResize="true" AllowColumnResize="True" EnableRealTimeResize="True" 
       ResizeGridOnColumnResize="False"></Resizing> 
     </ClientSettings> 
     <PagerStyle Mode="NextPrevAndNumeric"></PagerStyle> 
    </telerik:RadGrid> 

.cs файл ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     if (!IsPostBack) 
     { 
      Session["SearchRes"] = null; 
      if (Session["TaskName"] != null) 
       lblTskName.Text = Session["TaskName"].ToString(); 
      Session["FilColms"] = null; 
      Session["SortExp"] = null; 
      Session["FilExp"] = null; 
      Session["ViewAll"] = null; 
      BindGrid(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

private void BindGrid() 
{ 
    try 
    { 
     DataSet dsResult = new DataSet(); 

     clsSearch_BL clsObj = new clsSearch_BL(); 
     clsObj.TaskID = (string)Session["TaskID"]; 
     clsObj.CustName = (string)Session["CustName"]; 
     clsObj.MarketName = (string)Session["MarketName"]; 
     clsObj.HeadendName = (string)Session["HeadendName"]; 
     clsObj.SiteName = (string)Session["SiteName"]; 
     clsObj.TaskStatus = (string)Session["TaskStatus"]; 
     clsObj.OrdType = (string)Session["OrdType"]; 
     clsObj.OrdStatus = (string)Session["OrdStatus"]; 
     clsObj.ProName = (string)Session["ProName"]; 
     clsObj.LOC = (string)Session["LOC"]; 
     clsObj.QuoteID = (string)Session["QuoteID"]; 
     clsObj.CMNumber = (string)Session["CMNumber"]; 

     if (Session["SearchRes"] == null) 
     { 
      dsResult = clsObj.getSearchResults_BL(clsObj); 
      Session["SearchRes"] = dsResult; 
     } 
     else 
      dsResult = (DataSet)Session["SearchRes"]; 

     DataView dataView = dsResult.Tables[0].DefaultView; 
     rg402.DataSource = dsResult; 
     //rg402.DataBind(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

protected void rg402_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e) 
{ 
    BindGrid(); 
} 

protected void rg402_PreRender(object sender, EventArgs e) 
{ 
    rg402.MasterTableView.GetColumnSafe("RowIndicator").Display = false; 

} 

protected void rg402_ItemCreated(object sender, GridItemEventArgs e) 
{ 
    if (e.Item is GridPagerItem) 
    { 
     RadComboBox combo = (e.Item as GridPagerItem).FindControl("PageSizeComboBox") as RadComboBox; 

     // The number of items shown when all is selected 
     int allRowsCount = int.MaxValue; 

     // Remove duplicates 
     RadComboBoxItem duplicate = combo.Items.FindItemByValue(allRowsCount.ToString()); 
     if (duplicate != null) 
     { 
      duplicate.Remove(); 
     } 

     // Create a new item for showing all 
     RadComboBoxItem item = new RadComboBoxItem("All", allRowsCount.ToString()); 
     item.Attributes.Add("ownerTableViewId", e.Item.OwnerTableView.ClientID); 
     combo.Items.Add(item); 

     // Set the current pagesize as the selected value 
     combo.Items.FindItemByValue(rg402.PageSize.ToString()).Selected = true; 
    } 
+0

Что со всеми из переменные сеанса? Похоже, что ваше приложение работает сверхурочно без причины. –

ответ

1

Моя команда сделала тесты производительности на RadGrid против некоторых других высокоразвитых признакам 3-й контрольной партии, и RadGrid был самым быстрым в то время ... поэтому вы сделали хороший выбор в контроле.

Браузер - ваше ограничение. У вас будет такая же проблема с любым управлением. Плохая практика - отображать на экране больше, чем полезный объем данных.

6000 строк и 16 столбцов ... это, вероятно, более 9 мегабайт HTML, ваш браузер должен анализировать только для вашего datagrid.

Не указывайте им вариант ViewAll. Если они хотят быстро выполнить поиск данных, вы можете добавить возможности поиска, которые фильтруют результаты.

Если они действительно хотят все данные сразу, то я предоставляю ссылку возле сетки, которая позволяет им загружать всю сетку в данные в виде файла Excel.

+0

Я согласен, что отправка всех данных просто переборщила. Ограничьте себя до 5 - 7 столбцов и реализуйте расширенный пейджинг, о котором я говорил. Затем NestedViewTemplate может предоставить «БОЛЬШЕ ДАННЫХ» для каждой записи и иметь собственный SQLDataSource внутри шаблона. Затем вы попадаете в базу данных во второй раз для конкретных данных, а не возвращаете ВСЕ ROWS в одном массивном предложении select. –

0

В то время как я согласен с @Ed B, что у вас есть много данных, которые вы представляете в сетке, я думаю, что у старых браузеров будут проблемы с управлением выводом памяти, которое вы представляете.

В RadGrid (по состоянию на 2 кв. 2013 г.) появилась новая функция, называемая виртуализацией, которая может дать вам характеристику производительности и функцию «просмотреть все», которую вы ищете.

Вы можете включить виртуализацию сетки, добавив следующую разметку в вашем RadGrid/ClientSettings разметке:

<Virtualization EnableVirtualization="true" InitiallyCachedItemsCount="2000" 
        ItemsPerView="100"/> 

Вы можете узнать больше об этой функции в онлайн демо: http://demos.telerik.com/aspnet-ajax/grid/examples/performance/virtualization/defaultcs.aspx

Смежные вопросы