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>