I have a page that has a number of complicated radgrids on it - lots of template columns, lots of eval statements, custom controls binding to properties of properties, etc. I'm already using custom paging with this, and my page size is 60 records. The underlying data source is a list of objects. It's taking something like 6 or 7 seconds just to get from the Grid DataBinding event to the Grid DataBound event. This decreases as I remove columns from my grid.
- I know that Microsoft mentions that Eval can be slow because it uses reflection (http://msdn.microsoft.com/en-us/library/4hx47hfe(v=vs.110).aspx), so I'm trying to find ways to avoid that. Would I get any improvement by making the grid itself pretty simple with the data in individual GridBoundColumn columns, and then doing more complicated formatting/binding in the ItemDataBound event.
- Some of my template columns contain custom controls that bind from an object. That object is a property of the object I'm binding to the grid. Would this cause performance issues? Should my datasource be very flat rather than having nested objects? Could I store the object in the DataKey collection? I can't imagine that populating the DataKey collection with a ton of data is a very good for performance.
- Other than values that have already been bound to the grid, the only way to access underlying data in the ItemDataBound event is by storing it in the DataKey collection, right? There's no way to access the underlying object I'm binding to, right?
For reference, here is an example of one the grids:
<
rad:RadGrid
ID
=
"gridData"
AllowFilteringByColumn
=
"false"
AllowSorting
=
"false"
runat
=
"server"
Ondate
=
"GridData_DataBinding"
OnNeedDataSource
=
"GridData_NeedDataSource"
OnItemDataBound
=
"GridData_ItemDataBound"
OnItemCommand
=
"GridData_ItemCommand"
OnUpdateCommand
=
"GridData_ItemUpdated"
>
<
GroupingSettings
CaseSensitive
=
"false"
/>
<
ExportSettings
ExportOnlyData
=
"false"
/>
<
MasterTableView
Name
=
"Exceptions"
EditMode
=
"InPlace"
EnableHeaderContextMenu
=
"true"
DataKeyNames
=
"MurexMkt, PrimaryTicker"
>
<
Columns
>
<
rad:GridTemplateColumn
HeaderText
=
""
ItemStyle-HorizontalAlign
=
"Center"
HeaderStyle-Width
=
"10"
HeaderStyle-Font-Bold
=
"true"
UniqueName
=
"Approve"
AllowFiltering
=
"false"
>
<
HeaderTemplate
>
<
input
type
=
"checkbox"
id
=
"chkAll"
onclick
=
"CheckAll(this);"
/>
</
HeaderTemplate
>
<
ItemTemplate
>
<
asp:CheckBox
ID
=
"chkApprove"
Style
=
"margin-right: -6px;"
runat
=
"server"
CssClass
=
"GridApproveCheckbox"
/>
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridBoundColumn
DataField
=
"StagePriceExceptionId"
ReadOnly
=
"true"
HeaderText
=
"ExcID"
AllowFiltering
=
"false"
HeaderStyle-Width
=
"40"
Display
=
"false"
/>
<
rad:GridBoundColumn
DataField
=
"StagePriceId"
ReadOnly
=
"true"
HeaderText
=
"ID"
AllowFiltering
=
"false"
Display
=
"false"
HeaderStyle-Width
=
"40"
/>
<
rad:GridBoundColumn
DataField
=
"SecurityId"
UniqueName
=
"SecurityId"
Display
=
"false"
HeaderText
=
"Security Id"
/>
<
rad:GridBoundColumn
DataField
=
"PriceTypeId"
UniqueName
=
"PriceTypeId"
Display
=
"false"
HeaderText
=
"Price Type Id"
/>
<
rad:GridBoundColumn
DataField
=
"AsOfDate"
ReadOnly
=
"true"
HeaderText
=
"Date"
DataFormatString
=
"{0:MM/dd/yyyy}"
ItemStyle-CssClass
=
"GridColNumber"
/>
<
rad:GridTemplateColumn
UniqueName
=
"SecurityName"
HeaderText
=
"Security"
ReadOnly
=
"true"
DataField
=
"SecurityName"
>
<
ItemTemplate
>
<
asp:HyperLink
ID
=
"hl1"
runat
=
"server"
NavigateUrl='<%# string.Format("~/SecurityXRef/SecurityXref.aspx?
menuId
=
g2
&search={0}", Eval("Ticker")) %>'>
<%# Eval("SecurityName") %>
</
asp:HyperLink
>
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridBoundColumn
DataField
=
"SecurityName"
UniqueName
=
"SecurityNameSimple"
HeaderText
=
"Security"
Display
=
"false"
/>
<
rad:GridBoundColumn
DataField
=
"SecurityIsin"
HeaderText
=
"ISIN"
Display
=
"false"
/>
<
rad:GridBoundColumn
DataField
=
"Ticker"
HeaderText
=
"Ticker"
ReadOnly
=
"true"
/>
<
rad:GridBoundColumn
DataField
=
"RIC"
HeaderText
=
"RIC"
ReadOnly
=
"true"
/>
<
rad:GridBoundColumn
DataField
=
"CurrencyCode"
HeaderText
=
"Currency"
ReadOnly
=
"true"
/>
<
rad:GridBoundColumn
UniqueName
=
"PrimarySource"
DataField
=
"DataSourceShortName"
ReadOnly
=
"true"
HeaderText
=
"Primary Source"
HeaderStyle-Wrap
=
"true"
/>
<
rad:GridBoundColumn
DataField
=
"PriceType"
HeaderText
=
"Price Type"
ReadOnly
=
"true"
/>
<
rad:GridTemplateColumn
HeaderText
=
"Price"
UniqueName
=
"PriceCol"
ItemStyle-CssClass
=
"GridColNumber"
DataField
=
"PriceLast"
SortExpression
=
"PriceLast"
>
<
ItemTemplate
>
<
rad:RadToolTip
ID
=
"radToolTipPrice"
runat
=
"server"
TargetControlID
=
"lnkOverride"
>
<
div
style
=
"text-align:left !important;"
>
<
strong
>Data Source: </
strong
> <%# Eval("DataSourceShortName")%><
br
/>
<
strong
>Price Type: </
strong
> <%# Eval("PriceType")%> <
br
/>
<
strong
>Field: </
strong
> <%# Eval("DataSourceFieldName")%> <
br
/>
<
strong
>Comment: </
strong
> <%# Eval("Comments")%>
</
div
>
</
rad:RadToolTip
>
<
asp:LinkButton
ID
=
"lnkOverride"
runat
=
"server"
CommandName
=
"Edit"
DataTextFormatString
=
"{0:0.000000}"
/>
</
ItemTemplate
>
<
EditItemTemplate
>
<
div
style
=
"text-align:left !important;"
>
<
strong
>Override: </
strong
><
br
/><
asp:TextBox
ID
=
"txtOverride"
runat
=
"server"
Text='<%# Eval("PriceLast","{0:0.000000}") %>'/><
br
/>
<
strong
>Comment: </
strong
><
br
/><
asp:TextBox
ID
=
"txtComment"
runat
=
"server"
TextMode
=
"MultiLine"
Text= '<%# Eval("Comments")%>' Rows="3" />
<
p
>
<
asp:CheckBox
ID
=
"chkAddHAndPrice"
runat
=
"server"
Text
=
"Add Fixed Price"
/>
</
p
>
<
asp:LinkButton
ID
=
"lnkSave"
runat
=
"server"
CommandName
=
"Update"
Text
=
"Update"
/>
<
asp:LinkButton
ID
=
"lnkCancel"
runat
=
"server"
CommandName
=
"Cancel"
Text
=
"Cancel"
/>
</
div
>
</
EditItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridBoundColumn
DataField
=
"JobName"
HeaderText
=
"Loader"
UniqueName
=
"Loader"
Visible
=
"false"
/>
<
rad:GridBoundColumn
DataField
=
"IsOverride"
Visible
=
"false"
/>
<
rad:GridBoundColumn
DataField
=
"PriceLast"
Display
=
"false"
/>
<
rad:GridTemplateColumn
HeaderText
=
"Bloomberg Price"
UniqueName
=
"BloombergSource"
AllowFiltering
=
"false"
ItemStyle-CssClass
=
"GridColNumber"
Display
=
"false"
HeaderStyle-Wrap
=
"true"
>
<
ItemTemplate
>
<%--<
rad:RadToolTip
ID
=
"radToolTipBbg"
runat
=
"server"
TargetControlID
=
"lblBbgSource"
>
<
div
style
=
"text-align:left !important;"
>
<
strong
>Data Source:</
strong
> <%# Eval("BbgDataSource") %>
<
br
/><
br
/>
<
strong
>Field:</
strong
> <%# Eval("BbgField") %> <
br
/>
<
strong
>Loader:</
strong
> <%# Eval("BbgJob") %><
br
/>
<
strong
>Loaded At:</
strong
> <%# Eval("BbgCreated") %>
</
div
>
</
rad:RadToolTip
>
<
asp:Label
ID
=
"lblBbgSource"
runat
=
"server"
Text='<%# Eval("BbgPrice","{0:0.000000}") %>' />--%>
<
HMC:GridPrice
Id
=
"GridPriceBbg"
runat
=
"server"
Price='<%# Eval("BbgPriceVO") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
HeaderText
=
""
DataField
=
"AltSource1"
UniqueName
=
"AltSource1"
AllowFiltering
=
"false"
ItemStyle-CssClass
=
"GridColNumber"
Visible
=
"false"
HeaderStyle-Wrap
=
"true"
>
<
ItemTemplate
>
<
HMC:GridPrice
Id
=
"GridPrice1"
runat
=
"server"
Price='<%# Eval("AltSource1VO") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
HeaderText
=
"Secondary Price"
DataField
=
"AltSource2"
UniqueName
=
"AltSource2"
AllowFiltering
=
"false"
ItemStyle-CssClass
=
"GridColNumber"
Visible
=
"false"
HeaderStyle-Wrap
=
"true"
>
<
ItemTemplate
>
<
HMC:GridPrice
Id
=
"GridPrice2"
runat
=
"server"
Price='<%# Eval("AltSource2VO") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
HeaderText
=
"Tertiary Price"
UniqueName
=
"AltSource3"
AllowFiltering
=
"false"
ItemStyle-CssClass
=
"GridColNumber"
Visible
=
"false"
HeaderStyle-Wrap
=
"true"
>
<
ItemTemplate
>
<
HMC:GridPrice
Id
=
"GridPrice3"
runat
=
"server"
Price='<%# Eval("AltSource2VO") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
HeaderText
=
"Fourth Price"
DataField
=
"AltSource4"
UniqueName
=
"AltSource4"
AllowFiltering
=
"false"
ItemStyle-CssClass
=
"GridColNumber"
Visible
=
"false"
HeaderStyle-Wrap
=
"true"
>
<
ItemTemplate
>
<
HMC:GridPrice
Id
=
"GridPrice4"
runat
=
"server"
Price='<%# Eval("AltSource2VO") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
HeaderText
=
"Fifth Price"
DataField
=
"AltSource5"
UniqueName
=
"AltSource5"
AllowFiltering
=
"false"
ItemStyle-CssClass
=
"GridColNumber"
Visible
=
"false"
HeaderStyle-Wrap
=
"true"
>
<
ItemTemplate
>
<
HMC:GridPrice
Id
=
"GridPrice5"
runat
=
"server"
Price='<%# Eval("AltSource2VO") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
HeaderText
=
"HMC Price"
DataField
=
"HMCPrice"
UniqueName
=
"HMCPrice"
AllowFiltering
=
"false"
ItemStyle-CssClass
=
"GridColNumber"
Display
=
"false"
HeaderStyle-Wrap
=
"true"
>
<
ItemTemplate
>
<
rad:RadToolTip
ID
=
"radToolTipHMCPrice"
runat
=
"server"
TargetControlID
=
"lblHMCPrice"
>
<
div
style
=
"text-align: left !important;"
>
<%# Eval("HMCPriceComment") %>
</
div
>
</
rad:RadToolTip
>
<
asp:Label
ID
=
"lblHMCPrice"
runat
=
"server"
Text='<%# Eval("HMCPrice.Price","{0:0.000000}") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
UniqueName
=
"OpenWindow"
AllowFiltering
=
"false"
HeaderStyle-Width
=
"70"
ItemStyle-HorizontalAlign
=
"Center"
>
<
ItemTemplate
>
<
asp:LinkButton
ID
=
"LinkButton"
runat
=
"server"
CommandName
=
"OpenWindow"
Text
=
"View History"
></
asp:LinkButton
>
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
UniqueName
=
"OpenWindow2"
AllowFiltering
=
"false"
HeaderStyle-Width
=
"70"
ItemStyle-HorizontalAlign
=
"Center"
>
<
ItemTemplate
>
<
asp:LinkButton
ID
=
"LinkButton2"
runat
=
"server"
CommandName
=
"OpenWindow"
Text
=
"View Futures Curve"
></
asp:LinkButton
>
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridTemplateColumn
DataField
=
"ExceptionMessage"
ReadOnly
=
"true"
UniqueName
=
"ExceptionMessage"
HeaderText
=
"Error Description"
>
<
ItemTemplate
>
<
rad:RadToolTip
ID
=
"radToolTipException"
runat
=
"server"
TargetControlID
=
"lblExceptionMessage"
>
<
div
style
=
"text-align: left !important;"
>
<%# Eval("ExceptionMessage") %>
</
div
>
</
rad:RadToolTip
>
<
asp:Label
ID
=
"lblExceptionMessage"
runat
=
"server"
Text='<%# Eval("ShortErrorDescription") %>' />
</
ItemTemplate
>
</
rad:GridTemplateColumn
>
<
rad:GridBoundColumn
DataField
=
"Comments"
HeaderText
=
"Comments"
Display
=
"false"
/>
<
rad:GridBoundColumn
DataField
=
"DataStatusCode"
ReadOnly
=
"true"
HeaderText
=
"Data Status"
/>
<
rad:GridBoundColumn
DataField
=
"ExceptionStatusCode"
ReadOnly
=
"true"
HeaderText
=
"Exception Status"
Visible
=
"false"
/>
</
Columns
>
<
GroupByExpressions
>
<
rad:GridGroupByExpression
>
<
SelectFields
>
<
rad:GridGroupByField
FieldName
=
"MurexMkt"
FieldAlias
=
"MurexMkt"
HeaderText
=
"Murex Market"
/>
<
rad:GridGroupByField
Aggregate
=
"Count"
FieldName
=
"StagePriceId"
/>
</
SelectFields
>
<
GroupByFields
>
<
rad:GridGroupByField
FieldName
=
"MurexMkt"
/>
</
GroupByFields
>
</
rad:GridGroupByExpression
>
<
rad:GridGroupByExpression
>
<
SelectFields
>
<
rad:GridGroupByField
FieldName
=
"PrimaryTicker"
FieldAlias
=
"PrimaryTicker"
HeaderText
=
"Primary Ticker"
/>
<
rad:GridGroupByField
Aggregate
=
"Count"
FieldName
=
"StagePriceId"
/>
</
SelectFields
>
<
GroupByFields
>
<
rad:GridGroupByField
FieldName
=
"PrimaryTicker"
/>
</
GroupByFields
>
</
rad:GridGroupByExpression
>
<
rad:GridGroupByExpression
>
<
SelectFields
>
<
rad:GridGroupByField
FieldName
=
"ExceptionTypeCode"
/>
<
rad:GridGroupByField
Aggregate
=
"Count"
FieldName
=
"StagePriceId"
/>
</
SelectFields
>
<
GroupByFields
>
<
rad:GridGroupByField
FieldName
=
"ExceptionTypeCode"
/>
</
GroupByFields
>
</
rad:GridGroupByExpression
>
</
GroupByExpressions
>
</
MasterTableView
>
</
rad:RadGrid
>