Here I have created sample that will help you out.
HTML
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="product" HeaderText="Product" />
<asp:BoundField DataField="price" HeaderText="Price" />
<asp:BoundField DataField="Unit" HeaderText="Unit" />
</Columns>
</asp:GridView>
<br />
<asp:Button Text="Get Expected Output" runat="server" OnClick="GetOutput" />
<br />
<br />
</div>
Code
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
BindGrid();
}
}
protected void GetOutput(object sender, EventArgs e)
{
GridView gvResult = new GridView();
gvResult.AutoGenerateColumns = true;
gvResult.DataSource = GetResult((DataTable)ViewState["Data"]);
gvResult.DataBind();
this.form1.Controls.Add(gvResult);
}
private void BindGrid()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[4] { new DataColumn("Name", typeof(string)),
new DataColumn("product", typeof(string)),
new DataColumn("price",typeof(string)),
new DataColumn("Unit",typeof(string)) });
dt.Rows.Add("John Hammond", "product1", "1256.25", "2");
dt.Rows.Add("Mudassar Khan", "product2", "1852.28", "3");
dt.Rows.Add("Robert Schidne", "product3", "1745.89", "1");
ViewState["Data"] = dt;
GridView1.DataSource = dt;
GridView1.DataBind();
}
private DataTable GetResult(DataTable dt)
{
DataTable result = dt.Clone();
int i = 0;
DataRow dr = result.NewRow();
foreach (DataColumn column in dt.Columns)
{
string columnData = string.Empty;
foreach (DataRow row in dt.Rows)
{
columnData += row.ItemArray[i].ToString() + ",";
}
dr[i] = columnData.Remove(columnData.Length - 1, 1);
i++;
}
result.Rows.Add(dr);
return result;
}
VB
Protected Sub Page_Load(sender As Object, e As EventArgs)
If Not Me.IsPostBack Then
BindGrid()
End If
End Sub
Protected Sub GetOutput(sender As Object, e As EventArgs)
Dim gvResult As New GridView()
gvResult.AutoGenerateColumns = True
gvResult.DataSource = GetResult(DirectCast(ViewState("Data"), DataTable))
gvResult.DataBind()
Me.form1.Controls.Add(gvResult)
End Sub
Private Sub BindGrid()
Dim dt As New DataTable()
dt.Columns.AddRange(New DataColumn(3) {New DataColumn("Name", GetType(String)), New DataColumn("product", GetType(String)), New DataColumn("price", GetType(String)), New DataColumn("Unit", GetType(String))})
dt.Rows.Add("John Hammond", "product1", "1256.25", "2")
dt.Rows.Add("Mudassar Khan", "product2", "1852.28", "3")
dt.Rows.Add("Robert Schidne", "product3", "1745.89", "1")
ViewState("Data") = dt
GridView1.DataSource = dt
GridView1.DataBind()
End Sub
Private Function GetResult(dt As DataTable) As DataTable
Dim result As DataTable = dt.Clone()
Dim i As Integer = 0
Dim dr As DataRow = result.NewRow()
For Each column As DataColumn In dt.Columns
Dim columnData As String = String.Empty
For Each row As DataRow In dt.Rows
columnData += row.ItemArray(i).ToString() + ","
Next
dr(i) = columnData.Remove(columnData.Length - 1, 1)
i += 1
Next
result.Rows.Add(dr)
Return result
End Function
Screenshot
![](https://i.imgur.com/IylMv3U.jpg)