65.9K
CodeProject is changing. Read more.
Home

Optimal Alternative To DataBinder.Eval

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1 vote)

Mar 9, 2011

CPOL
viewsIcon

29891

It is not a trick, but a tip/ call for consider to use alternative to Databinder.Eval method with larger data sets

It is common practice among programmers to use DataBinder.Eval method in data binding controls. This should be acceptable for a small amount of data. But if the data become large, it is not an optimal method as it has the overhead of using reflection. According to Microsoft: "Because this method performs late-bound evaluation, using reflection at run time, it can cause performance to be noticeably slow." Example:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="PersonId" DataSourceID="SqlDataSource1">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <%# DataBinder.Eval(Container.DataItem,"Name") %>
            </ItemTemplate>
        </asp:TemplateField>
       <asp:TemplateField>
            <ItemTemplate>
                <%# DataBinder.Eval(Container.DataItem,"Age") %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
Optimal alternative:
<asp:GridView ID="GridView2" 
runat="server" AutoGenerateColumns="False"
    DataKeyNames="PersonId" DataSourceID="SqlDataSource1">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <%# ((DataRowView)Container.DataItem)["Name"]%>
            </ItemTemplate>
        </asp:TemplateField>
       <asp:TemplateField>
            <ItemTemplate>
                <%# ((DataRowView)Container.DataItem)["Age"]%>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
If Data Reader is used to bind the control, then the optimal alternative is:
<asp:GridView ID="GridView3" runat="server">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <%# ((DbDataRecord)Container.DataItem).GetString(0)%>
            </ItemTemplate>
        </asp:TemplateField>
       <asp:TemplateField>
            <ItemTemplate>
                <%# ((DbDataRecord)Container.DataItem).GetInt32(1)%>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
For using these castings, you need to import a few namespaces to the page such as:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Common" %>