1 public static DataTable Pivot(DataTable dataValues, string keyColumn, string pivotNameColumn, string pivotValueColumn)
2 {
3 DataTable tmp = new DataTable();
4 DataRow r;
5 string LastKey = "//dummy//";
6 int i, pValIndex, pNameIndex;
7 string s;
8 bool FirstRow = true;
9
10 pValIndex = dataValues.Columns[pivotValueColumn].Ordinal;
11 pNameIndex = dataValues.Columns[pivotNameColumn].Ordinal;
12
13 for (i = 0; i <= dataValues.Columns.Count - 1; i++)
14 {
15 if (i != pValIndex && i != pNameIndex)
16 tmp.Columns.Add(dataValues.Columns[i].ColumnName, dataValues.Columns[i].DataType);
17 }
18
19 r = tmp.NewRow();
20
21 foreach (DataRow row1 in dataValues.Rows)
22 {
23 if (row1[keyColumn].ToString() != LastKey)
24 {
25 if (!FirstRow)
26 tmp.Rows.Add(r);
27
28 r = tmp.NewRow();
29 FirstRow = false;
30
31 //loop thru fields of row1 and populate tmp table
32 for (i = 0; i <= row1.ItemArray.Length - 3; i++)
33 r[i] = row1[tmp.Columns[i].ToString()];
34
35 LastKey = row1[keyColumn].ToString();
36 }
37
38 s = row1[pNameIndex].ToString();
39
40 if (!tmp.Columns.Contains(s))
41 tmp.Columns.Add(s, dataValues.Columns[pNameIndex].DataType);
42 r[s] = row1[pValIndex];
43 }
44
45 //add that final row to the datatable:
46 tmp.Rows.Add(r);
47
48 return tmp;
49 }
50 }