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
While answering a question on the Asp.Net forums, I was pleasantly surprised to find nested Generic Lists are possible. They seem much easier than multidimensional arrays.
Here is the key line: List<List<int>> MyListOfIntLists;
protected void Button1_Click(object sender, EventArgs e)
{ List<int> MyInts1;
List<int> MyInts2;
List<List<int>> MyListOfIntLists;
// create the list of lists
MyListOfIntLists = new List<List<int>>();
MyInts1 = new List<int>();
MyInts1.Add(1);
MyInts1.Add(2);
MyInts1.Add(3);
MyInts2 = new List<int>();
MyInts2.Add(4);
MyInts2.Add(5);
MyInts2.Add(6);
MyListOfIntLists.Add(MyInts1);
MyListOfIntLists.Add(MyInts2);
// access the list of lists
MyInts1 = MyListOfIntLists[0];
MyInts2 = MyListOfIntLists[1];
}
I hope you find this useful.
Steve Wellens
Enums are great. They provide additional type safety and make code more readable.
Converting enums to strings is trivial. Converting strings to enums is not as straightforward...so here is a code snippet:
// This enum is in the .Net frameworkpublic
enum DayOfWeek
{ Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
}
protected void Button1_Click(object sender, EventArgs e)
{ // converting enums to strings is easy
String WhatDayItIs = DayOfWeek.Monday.ToString();
// convering strings to enums is a bit more work
DayOfWeek WhatDayItIsDOW;
if (Enum.IsDefined(typeof(DayOfWeek), WhatDayItIs))
WhatDayItIsDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), WhatDayItIs);
}
I hope you find this information useful.
Steve Wellens