I have this sample from a recent talk at Basta! conference in Germany, which shows (among other things) how to bind a cross table to a DataGridView (the standard .NET 2 data grid). A cross table is basically the result of transposing some data and using one of the fields for a second dimension.
The sample I have works on two tables of data. It doesn’t actually use a database and the reference that points from the list of votes to that of features is implemented as an object reference, but the relationship is like this:

Now, let’s assume there’s this data in the two tables/lists:
Features
| ID | Name |
|---|---|
| 1 | Synthesize out-of-the-box supply-chains |
| 2 | Syndicate vertical mindshare |
Votes
| ID | Feature_ID | Year | Priority |
|---|---|---|---|
| 1 | 1 | 2004 | 30 |
| 2 | 1 | 2005 | 40 |
| 3 | 1 | 2006 | 70 |
| 4 | 2 | 2004 | 70 |
| 5 | 2 | 2005 | 60 |
| 6 | 2 | 2006 | 30 |
In a cross table the same data could look like this:
| Feature/Year | 2004 | 2005 | 2006 |
|---|---|---|---|
| Synthesize out-of-the-box supply-chains | 30 | 40 | 70 |
| Syndicate vertical mindshare | 70 | 60 | 30 |
This is exactly the kind of transformation demonstrated in my sample. Now, there are a number of other things in that program, so don’t be confused. I suggest you focus on the workings of the VoteValuePropertyDescriptor class.
Here’s the download: FeatureVoting.zip
