Contents tagged with GridView

  • Summing Columns in a GridView

    Level: Beginner.

    After getting information from a database, you may also want summary information about the data (totals, averages, counts, etc.). This can be done using SQL group by clauses or, it can be done while binding to a GridView. I've seen other examples of this but they seem more complicated than they need to be.

    Note: If the GridView has more than one page, only the data on the current page can be summarized using this technique.

    Note: The sample uses the OrderDetails table from the NorthWind database.

    ASP code:

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="OrderID,ProductID" DataSourceID="SqlDataSource1" 
        ondatabinding="GridView1_DataBinding" 
        ondatabound="GridView1_DataBound" 
        onrowdatabound="GridView1_RowDataBound">
          <Columns>
              <asp:BoundField DataField="OrderID" HeaderText="OrderID" ReadOnly="True" 
                  SortExpression="OrderID" />
              <asp:BoundField DataField="ProductID" HeaderText="ProductID" ReadOnly="True" 
                  SortExpression="ProductID" />
              <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
                  SortExpression="UnitPrice" />
              <asp:BoundField DataField="Quantity" HeaderText="Quantity" 
                  SortExpression="Quantity" />
              <asp:BoundField DataField="Discount" HeaderText="Discount" 
                  SortExpression="Discount" />
          </Columns>
    </asp:GridView>

    C# Code:

        private Decimal OrderTotal;  // holds total price of order
     
        // ---- the grid is about to start getting data...initialize
     
        protected void GridView1_DataBinding(object sender, EventArgs e)
        { 
            OrderTotal = 0.0M;
        }
     
        // ---- Each row is data bound ------------------------------
     
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DataRowView DRV = e.Row.DataItem as DataRowView;
     
                // price is in column 2
                // quantity is in column 3
                Decimal Price = (Decimal)DRV.Row.ItemArray[2];
                short Quantity = (short)DRV.Row.ItemArray[3];
     
                Decimal RowTotal = Price * Quantity;
     
                OrderTotal += RowTotal;               
            }
        }
     
        // ---- The grid is done getting data, show the Order Total --------
     
        protected void GridView1_DataBound(object sender, EventArgs e)
        {       
            LabelOrderTotal.Text = OrderTotal.ToString("C");
        }

     

    I hope you find this useful.

    Steve Wellens

    Copyright 2008 Steve Wellens