Rotate ASP.NET GridView: Convert GridView Columns to Rows and Rows to Columns

HTML Markup

Below is the HTML Markup where I have n ASP.Net GridView Control and two buttons one to Rotate / Flip / Transpose GridView Columns to Rows and another to Rotate / Flip / Transpose GridView rows to Columns,
  1. <asp:GridView ID="GridView1" CssClass="Grid" HeaderStyle-CssClass="header" runat="server" AutoGenerateColumns="true">  
  2. </asp:GridView>  
  3. <br />  
  4. <asp:Button ID="btnConvert1" runat="server" Text="Convert Rows to Columns" OnClick="Convert" CommandArgument="1" />  
  5. <asp:Button ID="btnConvert2" runat="server" Text="Convert Columns to Rows" OnClick="Convert" CommandArgument="2" Visible="false" />  
C#
  1. protected void Page_Load(object sender, EventArgs e)   
  2. {  
  3.     if (!IsPostBack)   
  4.     {  
  5.         DataTable dt = new DataTable();  
  6.         dt.Columns.AddRange(new DataColumn[3]   
  7.         {  
  8.             new DataColumn("Item"), new DataColumn("Quantity"), new DataColumn("Price")  
  9.         });  
  10.         dt.Rows.Add("Shirt", 145, 500);  
  11.         dt.Rows.Add("Jeans", 0, 2000);  
  12.         dt.Rows.Add("Trousers", 190, 1545);  
  13.         dt.Rows.Add("Tie", 30, 200);  
  14.         dt.Rows.Add("Cap", 0, 300);  
  15.         dt.Rows.Add("Hat", 90, 350);  
  16.         dt.Rows.Add("Scarf", 290, 140);  
  17.         dt.Rows.Add("Belt", 150, 400);  
  18.         ViewState["dt"] = dt;  
  19.         BindGrid(dt, false);  
  20.     }  
  21. }  
  22. private void BindGrid(DataTable dt, bool rotate)  
  23. {  
  24.     GridView1.ShowHeader = !rotate;  
  25.     GridView1.DataSource = dt;  
  26.     GridView1.DataBind();  
  27.     if (rotate)  
  28.     {  
  29.         foreach(GridViewRow row in GridView1.Rows)  
  30.         {  
  31.             row.Cells[0].CssClass = "header";  
  32.         }  
  33.     }  
  34. }  
On btnConvert1 Event:
  1. protected void Convert(object sender, EventArgs e)  
  2. {  
  3.     DataTable dt = (DataTable) ViewState["dt"];  
  4.     if ((sender as Button).CommandArgument == "1")   
  5.     {  
  6.         btnConvert1.Visible = false;  
  7.         btnConvert2.Visible = true;  
  8.         DataTable dt2 = new DataTable();  
  9.         for (int i = 0; i <= dt.Rows.Count; i++)   
  10.         {  
  11.             dt2.Columns.Add();  
  12.         }  
  13.         for (int i = 0; i < dt.Columns.Count; i++)   
  14.         {  
  15.             dt2.Rows.Add();  
  16.             dt2.Rows[i][0] = dt.Columns[i].ColumnName;  
  17.         }  
  18.         for (int i = 0; i < dt.Columns.Count; i++)   
  19.         {  
  20.             for (int j = 0; j < dt.Rows.Count; j++)   
  21.             {  
  22.                 dt2.Rows[i][j + 1] = dt.Rows[j][i];  
  23.             }  
  24.         }  
  25.         BindGrid(dt2, true);  
  26.     } else  
  27.     {  
  28.         btnConvert1.Visible = true;  
  29.         btnConvert2.Visible = false;  
  30.         BindGrid(dt, false);  
  31.     }  
  32. }