Displaying Summary Information (sum or total) in the GridView's Footer
Challenge
"I have a GridView and I need to show the aggregate sum of a column in the footer row"
Introduction
In this article I will go through steps to enable aggregation sum (total) of a column in the asp.net GridView Footer.
Step1: Prepare Database Connection
In this article I used the AdventureWorks Database and I will query table "PurchaseOrderDetail".
In the web.config set the connection string as following:
<connectionStrings>
<add name="dbconnection" connectionString="Data Source=(local);Integrated Security=true;Initial Catalog=AdventureWorks"/>
</connectionStrings>
Step2: Prepare the aspx Page
<head runat="server"> <title>Displaying Summary Information in the GridView's Footer</title> <style type="text/css"> .Gridview { font-family:Verdana; font-size:10pt; font-weight:normal; color:black; } </style> </head> <body> <form id="form1"runat="server"> <div> HeaderStyle-ForeColor="White" HeaderStyle-Font-Bold="true" DataKeyNames="ProductID"
runat="server" ShowFooter="true" AllowPaging="true" PageSize="5" AutoGenerateColumns="false"
DataSourceID="sqldsPurchaseOrderDetail" OnRowDataBound="gvPurchaseOrderDetail_RowDataBound">
<FooterStyle Font-Bold="true" BackColor="#61A6F8" ForeColor="black" />
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="Product ID" />
<asp:BoundField DataField="PurchaseOrderDetailID" HeaderText="Purchase Order ID" />
<asp:TemplateField HeaderText="Order Quantity">
<ItemTemplate>
<asp:Label ID="lblOrderQty" runat="server" Text='<%#Eval("OrderQty") %>' />
</ItemTemplate>
<FooterTemplate>
<asp:Label ID="lbltxtTotal" runat="server" Text="Total Price" />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Price">
<ItemTemplate>
<asp:Label ID="lblPrice" runat="server" />
</ItemTemplate>
<FooterTemplate>
<asp:Label ID="lblTotal" runat="server" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="sqldsPurchaseOrderDetail" runat="server" SelectCommand="select * from [AdventureWorks].[Purchasing].[PurchaseOrderDetail]" ConnectionString="<%$ ConnectionStrings:dbconnection %>"></asp:SqlDataSource> </div> </form> </body> </html> |
Step3: Prepare Code Behind
decimal total = 0; protected void gvPurchaseOrderDetail_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { Label lblPrice = (Label)e.Row.FindControl("lblPrice"); decimal price = Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "UnitPrice")) * Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "OrderQty")); lblPrice.Text = price.ToString(); total += price; } if (e.Row.RowType == DataControlRowType.Footer) { Label lblTotal = (Label)e.Row.FindControl("lblTotal"); lblTotal.Text = total.ToString(); } } |
Result: