We are using the Kendo Grid for MVC and provider a software for agencies to see their list of clients. One of our grids is fairly large and has about 15 columns, and depending on the agency there can be upwards of 15,000 records returned within this single grid. We are noticing that the load time in this scenario is very long (9 seconds). I would have thought that by using ajax and paging that this time would be much lower and that as you change places or search in the headers it would do another call with those filters.
Here is what we have currently.
What can be done to speed up this grid?
@(Html.Kendo().Grid(Model)
.Name(
"ClientsGrid"
)
.Events(e => e
.ColumnMenuInit(
"onColumnMenuInit"
))
.Columns(columns =>
{
columns.Template(c => { })
.HeaderTemplate(
@<text>
@
if
(ViewBag.CanAddClients)
{
<a href=
'/clients/clientsAdd.asp?AgencyID=@Session["SelectedAgencyID"]'
><i
class
=
'fas fa-plus fa-lg hidden-xs'
id=
'ClientAdd'
style=
'color: rgb(4, 167, 200); padding-right:4px'
title=
'Client Add'
></i></a>
}
</text>)
.ClientTemplate(@
"#=getAccessibleLinks(ClientID, DocCnt)#"
).MinScreenWidth(768).Width(130);
columns.Bound(c => c.FirstName).Width(130).Filterable(ftb => ftb.Cell(cell => cell.Operator(
"startswith"
).SuggestionOperator(FilterType.StartsWith)));
columns.Bound(c => c.LastName).ClientTemplate(
"#if (!LastName){#Null#} else {# #=LastName# #}#"
).Width(130).Filterable(ftb => ftb.Cell(cell => cell.Operator(
"startswith"
).SuggestionOperator(FilterType.StartsWith)));
columns.Bound(c => c.Age).Sortable(
true
).HtmlAttributes(
new
{ @
class
=
"alignRight"
}).MinScreenWidth(992).Width(80);
columns.Bound(c => c.InsuredInsAndPayerName).Title(
"Primary Ins"
).MinScreenWidth(768).Width(150).Filterable(ftb => ftb.Multi(
true
).Search(
true
));
columns.Bound(c => c.Insured2InsAndPayerName).Title(
"Secondary Ins"
).MinScreenWidth(992).Width(150).Filterable(ftb => ftb.Multi(
true
).Search(
true
));
columns.Bound(c => c.RecordNumber).Title(
"Record #"
).HtmlAttributes(
new
{ @
class
=
"alignRight"
}).MinScreenWidth(992).Width(110).Filterable(ftb => ftb.Cell(cell => cell.Operator(
"startswith"
).SuggestionOperator(FilterType.StartsWith)));
columns.Bound(c => c.Status).MinScreenWidth(992).Width(100).Filterable(ftb => ftb.Multi(
true
).Search(
true
));
columns.Bound(c => c.StaffName).Title(
"Lead Staff"
).MinScreenWidth(992).Width(150).Filterable(ftb => ftb.Cell(cell => cell.Operator(
"startswith"
).SuggestionOperator(FilterType.StartsWith)));
columns.Bound(c => c.TherapistName).Title(
"Therapist"
).MinScreenWidth(992).Width(150).Filterable(ftb => ftb.Cell(cell => cell.Operator(
"startswith"
).SuggestionOperator(FilterType.StartsWith)));
columns.Bound(c => c.ClientTeamName).Title(
"Team"
).MinScreenWidth(992).Width(150).Filterable(ftb => ftb.Multi(
true
).Search(
true
));
columns.Bound(c => c.OfficeName).Title(
"Office"
).MinScreenWidth(992).Width(120).Filterable(ftb => ftb.Multi(
true
).Search(
true
));
columns.Bound(c => c.BillingReady).HeaderTemplate(@
"<span class='hoverToolTip' title='<b>Billing Ready</b><br> If there is a Green Check icon, then your client is billing ready. Ortherwise, the client needs more information.'>BR</span>"
).ClientTemplate(
"#if (BillingReady){#<i class='far fa-check fa-md text-center' style='color:rgb(0, 133, 18);'>#}else {#<i class='far fa-times-circle fa-md text-center' style='color:rgb(196, 18, 48);'>#}#"
).HtmlAttributes(
new
{ @
class
=
"align-center"
}).MinScreenWidth(768).Width(70);
columns.Bound(c => c.DateExpIssue).Title(
"Exp"
).HeaderTemplate(@
"<span class='hoverToolTip' title='<b>Expiration Issues</b><br> If a Red Icon is shown, then your client has expiration issues.'>Exp</span>"
).ClientTemplate(
"#if(DateExpIssue){#<i class='far fa-times-circle fa-md text-center' style='color:rgb(196, 18, 48);'>#}#"
).HtmlAttributes(
new
{ @
class
=
"align-center"
}).Width(75).MinScreenWidth(768);
columns.Bound(c => c.ClientID).Sortable(
false
).Title(
"CP ID"
).HtmlAttributes(
new
{ @
class
=
"alignRight"
}).MinScreenWidth(992).Width(80);
})
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(
false
)
.Read(read => read.Action(
"GetClientsGridDetails"
,
"Clients"
).Data(
"BindingClientsGrid"
))
.PageSize(ViewBag.pageSize)
)
.ClientDetailTemplateId(
"template"
)
.ToolBar(toolbar =>
{
toolbar
.Template(
@<text>
<div
class
=
"toolbar"
>
<div
class
=
"col-lg-3 col-md-4 col-sm-4 col-xs-12 toolBarItem"
>
<label
class
=
"category-label"
for
=
"category"
>Client Status:</label>
@(Html.Kendo().DropDownList().Name(
"ClientStatusID"
)
.HtmlAttributes(
new
{ @id =
"ClientStatusID"
})
.DataTextField(
"Status"
)
.DataValueField(
"StatusID"
)
.Value(
"0"
)
.Text(
"Current Only"
)
.Events(e => e.Change(
"filterClientsGrid"
))
.SelectedIndex(0)
.DataSource(source =>
{
source.Read(read =>
{
read.Action(
"BindClientStatusDetails"
,
"Clients"
);
})
.ServerFiltering(
true
);
})
.AutoBind(
false
)
)
</div>
@
if
(ViewBag.UserType ==
"Staff"
)
{
<div
class
=
"col-lg-3 col-md-4 col-sm-4 col-xs-12 toolBarItem"
>
<label
class
=
"category-label"
for
=
"category"
>Staff Services:</label>
@(Html.Kendo().DropDownList().Name(
"StaffServiceID"
)
.DataTextField(
"StaffSeviceName"
)
.DataValueField(
"StaffServiceId"
)
.Events(e => e.Change(
"filterClientsGrid"
))
.Value(
"Active Only"
)
.Text(
"Active Only"
)
.DataSource(source =>
{
source.Read(read =>
{
read.Action(
"BindStaffServiceDetails"
,
"Clients"
);
})
.ServerFiltering(
true
);
})
)
</div>
}
else
{
<div
class
=
"col-lg-3 col-md-4 col-sm-4 col-xs-12"
></div>
}
<div
class
=
"col-lg-4 col-md-4 col-sm-4 col-xs-12"
>
<h4
class
=
"page-title text-center"
>@ViewBag.Title</h4>
</div>
</div>
</text>);
})
.Sortable()
.ColumnMenu()
.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.Events(events => events
.DataBound(
"onDataBound"
)
)
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(
true
)
.Read(read => read.Action(
"GetClientsGridDetails"
,
"Clients"
).Data(
"BindingClientsGrid"
))
.PageSize(ViewBag.pageSize)
)
.Scrollable()
.Pageable(x => x.PageSizes(
new
int
[] { 50, 100, 250 }))
.Resizable(resize => resize.Columns(
true
))
.Reorderable(reorder => reorder.Columns(
true
))
.NoRecords(
"No records found."
)
)
<script id=
"template"
type=
"text/x-kendo-template"
>
<div
class
=
"container-fluid hidden-lg hidden-md"
>
<div
class
=
"row"
style=
"background:rgb(160, 211,222) !important; padding-top:5px; padding-bottom:5px; text-align:center;"
>
<div
class
=
"col-xs-11"
><b><span style=
"color:rgb(3, 140, 167);"
>Client Details</span></b></div>
</div>
<div
class
=
"row"
style=
"background:white !important; border: 1px solid rgb(160, 211,222);"
>
<div
class
=
"col-md-3 col-sm-4"
>
<div style=
"text-align:center; border-bottom:1px solid color: rgb(255, 255, 255); "
class
=
"p-t-10"
>
<a href=
'/clients/Details/#=ClientID#'
class
=
"p-5 hidden-lg hidden-md hidden-sm visible-xs-inline-block"
><i
class
=
'far fa-user visible-xs'
id=
'ClientsDetails'
style=
'color:rgb(4, 167, 200); padding-right:4px;'
title=
'Client Details'
></i></a>
<a href=
'/clients/Details/#=ClientID#?Tab=clientDocs'
class
=
"p-5 hidden-lg hidden-md hidden-sm visible-xs-inline-block"
><i
class
=
'far fa-paperclip visible-xs'
id=
'ClientDocs'
style=
'color:rgb(4, 167, 200); padding-right:4px'
title=
'Client Docs'
></i></a>
<a href=
'/clientsservices/index/#=ClientID#'
class
=
"p-5 hidden-lg hidden-md hidden-sm visible-xs-inline-block"
><i
class
=
'far fa-hand-holding-heart visible-xs'
id=
'ClientServices'
style=
'color:rgb(4, 167, 200); padding-right:4px'
title=
'Client Service'
></i></a>
<a href=
'/clients/clientsAuths.asp?ClientID=#=ClientID#'
class
=
"p-5 hidden-lg hidden-md hidden-sm visible-xs-inline-block"
><i
class
=
'far fa-check-square visible-xs'
id=
'ClientAuths'
style=
'color:rgb(4, 167, 200); padding-right:4px'
title=
'Client Auths'
></i></a>
<a href=
'/clients/clientsEvents.asp?ClientID=#=ClientID#'
class
=
"p-5 hidden-lg hidden-md hidden-sm visible-xs-inline-block"
><i
class
=
'far fa-user-friends visible-xs'
id=
'ClientEvents'
style=
'color:rgb(4, 167, 200); padding-right:4px'
title=
'Client Events'
></i></a>
</div>
<div
class
=
"p-b-10 hidden-lg visible-md visible-sm visible-xs"
><b>Lead Staff:</b>#
if
(StaffName){# #: StaffName # #}#</div>
<div
class
=
"p-b-10 hidden-lg visible-md visible-sm visible-xs"
><b>Therapist:</b>#
if
(TherapistName){# #: TherapistName # #}#</div>
<div
class
=
"p-b-10 hidden-lg hidden-md visible-sm visible-xs"
><b>Team:</b>#
if
(ClientTeamName){# #: ClientTeamName # #}#</div>
<div
class
=
"p-b-10 hidden-lg hidden-md hidden-sm visible-xs"
><b>Office:</b>#
if
(OfficeName){# #: OfficeName # #}#</div>
<div
class
=
"p-b-10 hidden-lg hidden-md"
><b>Primary Ins:</b>#
if
(InsuredInsAndPayerName){# #: InsuredInsAndPayerName # #}#</div>
<div
class
=
"p-b-10 hidden-lg hidden-md"
><b>Secondary Ins:</b>#
if
(Insured2InsAndPayerName){# #: Insured2InsAndPayerName # #}#</div>
</div>
<div
class
=
"col-md-3 col-sm-4"
>
<div
class
=
"p-b-10 hidden-lg visible-md visible-sm visible-xs"
><b>Age:</b>#
if
(Age){# #: Age # #}#</div>
<div
class
=
"p-b-10 visible-xs"
><b>Billing Ready:</b>#
if
(BillingReady){#<i
class
=
'far fa-check fa-md text-center'
style=
'color:rgb(0, 133, 18);'
/>#}#</div>
<div
class
=
"p-b-10 hidden-lg hidden-md hidden-sm"
><b>Expiration Issues:</b>#
if
(DateExpIssue){# #: DateExpIssue # #}#</div>
<div
class
=
"p-b-10 hidden-lg hidden-md hidden-sm"
><b>Status:</b>#
if
(Status){# #: Status # #}#</div>
<div
class
=
"p-b-10 hidden-lg visible-md visible-sm visible-xs"
><b>Record Number:</b>#
if
(RecordNumber){# #: RecordNumber # #}#</div>
</div>
<div
class
=
"col-md-3 col-sm-4"
>
<div
class
=
"p-b-10 hidden-lg visible-md visible-sm visible-xs"
><b>CPID:</b>#
if
(ClientID){# #: ClientID # #}#</div>
</div>
</div>
</div>
</script>