CodeSnip: Pivot Tables with ADO.NET and Display in a DataGrid Paged Horizontally
page 1 of 4
Published: 04 Oct 2004
Unedited - Community Contributed
This article describes a simple method to pivot a DataTable producing rows for each column and a column for each row. The pivoted DataTable is then displayed in a DataGrid using horizontal paging to view a limited number of Columns in each page. This is a common display technique used to compare, for instance, product features, where the product names appear across the top of the DataGrid with the Features listed down the side.
by Steve Sharrock
Average Rating: 
Views (Total / Last 10 Days): 53897/ 54


[Download Code]
I was recently asked by a client to prototype a DataGrid showing a feature comparison of several products. The underlying database table contained a row for each product with columns that describe the product name and the various attributes and features of the product.

Like many online comparison grids, the client wanted the products listed across the top horizontally, with the features and attributes listed vertically with their description down the left side. Since there were a large number of products, the desire was to navigate horizontally to each subset of products while keeping the feature names anchored in the first column of the DataGrid. For consistency within the site, the client also wanted the selection of Products to use paging, rather than horizontal scrolling.

The first step is to pivot the table such that each column represents the product name found in the first column of each row of the input table, and each row represents the individual features of all products from the original table's columns. One solution might be to implement this transform as a stored procedure on the database server, and indeed there are several references available for this. However, I was using a Web Service to obtain the product data in the form of a DataSet, so my solution simply required me to pivot the appropriate table from the DataSet. This is a fairly straight-forward transform detailed in the next page of this article.

The next step is to create a DataGrid that navigates horizontally to the selected set of products, while anchoring the first column that contains the description of each feature. The choice was to either prune the pivoted table of all unwanted columns for each page change letting the DataGrid bind all columns or dynamically create the DataGrid for each page specifying the appropriate BoundColumns. The latter approach is outlined in the third page of this article.

A link is provided at the top of each page to download the source code for the demo of these techniques. Use the link below to view a very simple demonstration version of this prototype that shows the raw input table, the complete pivot table, and the final paged comparison DataGrid.

View Pivot Table DataGrid Demo

The next page outlines the steps I used to pivot the DataTable containing the Product rows in preparation for binding the DataGrid.

View Entire Article

User Comments

Title: Resuelto facil   
Name: Demo Atencia
Date: 2013-01-09 2:41:23 AM
Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim tabla As DataTable
Dim tablapersonas As DataTable
tablapersonas = objcl.Lista_Personas_Bono(cboProyectos.SelectedValue)
'tabla=objeto datatable
GridView1.DataSource = PivotTable(tabla)

End Sub
Public Function PivotTable(ByVal [source] As DataTable) As DataTable
Dim dest As New DataTable("Pivoted" + [source].TableName)

dest.Columns.Add(" ")

Dim r As DataRow
For Each r In [source].Rows
Next r
Dim i As Integer
For i = 0 To ([source].Columns.Count - 1) - 1
Next i

For i = 0 To dest.Rows.Count - 1
Dim c As Integer
For c = 0 To dest.Columns.Count - 1
If c = 0 Then
dest.Rows(i)(0) = [source].Columns((i + 1)).ColumnName
dest.Rows(i)(c) = [source].Rows((c - 1))((i + 1))
End If
Next c
Next i
Return dest
End Function 'PivotTable

mas simple ni en la china... saludos
Title: Web Team   
Name: Mani Maran M
Date: 2012-09-24 12:14:49 AM
This is really super.Thanks a lot for publishing this article....
Title: Broken source data link   
Name: Sebastian
Date: 2012-06-06 7:09:49 PM
Hoping to see an answer could you please upload again and reload the source data link please.
Title: Missing source data   
Name: Sierk
Date: 2012-05-10 4:21:57 PM
I know this is old, but the link to the source data is no longer available and I am trying to figure out what the source.TableName from DataTable dest = new DataTable("Pivot" + source.TableName ); is. Could you have the source code restored or add the missing parts?

Title: Can U attach source code please   
Name: punk
Date: 2010-07-25 10:09:52 AM
Can U attach souce code please, cos, there's an error on Download Code link.
Title: Some extra tools   
Name: redbull
Date: 2010-02-12 10:07:41 PM
Title: Attachable to a queried datasource?   
Date: 2009-10-29 11:13:48 AM
Thank for the informative article, though I do have one question. In your example, you've embedded your sample data in the code file. What needs to be changed to make use of this with a SqlDataSource instead of the embedded DataTable.

Thank you again.
Title: Display Coffee Table   
Date: 2009-08-11 9:08:46 AM
Hello. Thanks for the guide. But why it always say that there's an error?!. Thanks and have a nice day. :)
Title: plz help anyone   
Name: sachin kumar
Date: 2008-09-25 3:17:32 AM
Just I want that data come from any data source but my datagrid heading column name will come in xml data file
Title: I cannot be the only one to get this error   
Name: Ralphxyz
Date: 2008-09-11 10:46:02 AM
Parser Error Message: Could not load type 'Pivot.Demo'.

Where oh where is "Pivot.Demo"

Certainly not in in the code download!
Title: display image problem   
Name: Rajeev Gangwar
Date: 2008-05-13 4:15:27 AM
Please tell me is there any option for binding the image in the datagrid using pivot table. thanks
Title: Asp.Net(C#)   
Name: Rajasekar
Date: 2008-03-12 9:26:40 AM
I need to bind the Repeated columns values in Single Columns
Title: Not useful to show images   
Name: garima
Date: 2008-01-28 4:04:44 AM
how can we retrieve images from database and display on a grid page with the help of pivot table.
Title: Not Useful in Real World   
Name: Ron Jeremy
Date: 2007-11-27 8:53:25 PM
WHo has pivot tables that don't have fields of the same value? You sample doesn't support datafields that have the same values for multiple fields.

The concept is OK, but you need to add some logic.
Title: Problem where the left col has multple of same values   
Name: Lee
Date: 2007-08-24 5:10:45 PM
Great for very basic pivots. however i have data like this.
Date Qty failure
2007-04-23 2 Damaged Leads
2007-04-23 120 Improper fillet
2007-04-23 34 Non-wetting
2007-04-23 7 Solder missing
2007-04-23 1 Imp hardware mounting
2007-04-23 3 CONTAM
need to see as
Damaged Leads 2
Improper fillet 120
Non-wetting 34
Solder missing 7
Imp hardware mounting 1
Title: ASP.NET 2.0 Code   
Name: Alloyd
Date: 2007-05-27 7:17:59 PM
Were would I get VB.Net version of the code to use on an ASP.NET page. I have used a C to VB conversion utility to convert the code, but I have a type mis-match I can't solve in the BindHorzGrid Sub. Here CodeSnip:

' frist create the "anchored" column[0] -- Product
Dim c As BoundColumn = New BoundColumn()
c.HeaderText = pivotTbl.Columns(0).ColumnName
c.HeaderStyle.Font.Bold = True
c.DataField = pivotTbl.Columns(0).ColumnName
c.ItemStyle.Font.Bold = True

The type mis-match error is:

"Value of type 'System.Web.UI.WebControls.BoundColumn' cannot be converted to 'System.Web.UI.WebControls.BataControlField'"
Title: special case   
Name: Ali
Date: 2007-04-18 2:08:24 AM
Nice article. But there is a problem when you have repeated columns (repeated products)
Title: CodeSnip: Pivot Tables with ADO.NET and Display in a DataGrid Paged Horizontally   
Name: Donna
Date: 2007-01-23 3:13:43 PM
Excellent!! Thanks for the version, this works great!
Title: CodeSnip: Pivot Tables with ADO.NET and Display in a DataGrid Paged Horizontally   
Name: PJackson
Date: 2006-11-18 9:51:50 AM
Thanks. I like the simplicity. PJ
Title: great pivot table   
Name: CSutherland
Date: 2006-11-06 1:34:47 PM
Hey thanks for the great article!
I'm trying to do something exactly like this and its a great example you have. Props!
Title: Great   
Name: APetcu
Date: 2006-09-13 3:52:08 AM
Plain and simple. Thanks!
Title: ok   
Name: mgv
Date: 2006-09-01 4:28:45 AM
not upto the mark try somewhat and get a better ones .
Title: Great article   
Name: Stephan
Date: 2006-07-07 6:09:08 AM
Steve, thank you for this article. It was of great help to me. This saved me time to program something simular
Title: hello   
Name: great
Date: 2006-04-04 2:02:11 AM
it works!
Title: Indian   
Name: KiranKumar.P
Date: 2006-03-28 12:29:57 PM
thank you steve sharrock. Its very useful code for .net developers;
Title: Software Engineer   
Name: John McPherson
Date: 2006-03-06 2:57:09 PM
I'm relatively new at and but I found what I was looking for...

Thank you.


"Sufficiently advanced technology is indistinguishable from magic." - Arthur C. Clark, inventor of the telecommunications satellite
Title: JavaScript Pivot Tables   
Name: Nick
Date: 2006-02-04 7:35:22 PM
For an example of how to rearrange multidimensional tables using JavaScript, check out
Title: version of the pivot table function   
Name: Chris
Date: 2005-12-20 11:25:58 AM
Here is the version of the pivot table function:

Public Function PivotTable(ByVal source As DataTable) As DataTable
Dim dest As DataTable = New DataTable("Pivoted" + source.TableName)

' create shchema (string columns) for the destination
' the first column is for the source column name
dest.Columns.Add(" ")

' the remaining dest columns are from each source table row (1st column)
Dim r As DataRow
For Each r In source.Rows

' now add one row to the dest table for each column in the source, except
' the first which is the Product, in our case
Dim i As Integer
For i = 0 To source.Columns.Count - 1 - 1 Step i + 1

' now move the source columns to their position in the dest row/cell matrix
' starting down the destination rows, and across the columns
Dim rr As Integer = 0
Dim c As Integer = 0
For rr = 0 To dest.Rows.Count - 1 Step rr + 1
For c = 0 To dest.Columns.Count - 1 Step c + 1
If c = 0 Then
dest.Rows(rr)(0) = source.Columns(rr + 1).ColumnName ' the Product name
dest.Rows(rr)(c) = source.Rows(c - 1)(rr + 1)
End If
c = 0
Return dest
End Function
Title: pivot Table demo   
Name: manish punwani
Date: 2005-12-02 7:50:15 AM
this was very helpful
thanks a lot
Title: database conectivity   
Name: arvind
Date: 2005-03-15 12:29:28 PM
how to attach a table of oracle in a aspx page in project.
Title: CodeSnip: Pivot Tables with ADO.NET and Display in a DataGrid Paged Horizontally   
Name: Alejandro Cuellar Gaxiola
Date: 2005-01-28 7:15:50 AM
This is an excellent article showing a very elegant way to pivot a table and how to manage the grid to present the data.
Title: but what about image   
Name: vishal
Date: 2004-12-03 6:42:57 AM
but what about images if i wants to display on the first row.
when i tried and , when i wants to add first row than i am unable to retrieve values from database as i store image in byte() format

how can we retrieve images from database and display on a grid page with the help of pivot table.
Title: VB.NET Code   
Name: Steve
Date: 2004-11-09 8:27:32 AM
Here are a few links to various tools that will convert C# to VB.
Title: VB.NET demo   
Name: Bob
Date: 2004-11-09 7:20:30 AM
Could you supply VB.NET demo code also?

Community Advice: ASP | SQL | XML | Regular Expressions | Windows

©Copyright 1998-2024  |  Page Processed at 2024-07-15 4:11:54 PM  AspAlliance Recent Articles RSS Feed
About ASPAlliance | Newsgroups | Advertise | Authors | Email Lists | Feedback | Link To Us | Privacy | Search