Here is a complete example which does grouping as asked. I didn't setup formatting of columns in the DataGridView.
Data class using mocked data
using System.Data;
using System.Linq;
namespace GroupbyDataTable
{
public class Operations
{
public static DataTable Mocked()
{
var table = new DataTable();
table.Columns.Add(new DataColumn("TaxRate", typeof(decimal)));
table.Columns.Add(new DataColumn("Value", typeof(decimal)));
table.Columns.Add(new DataColumn("TaxAmount", typeof(decimal)));
table.Columns.Add(new DataColumn("FinalValue", typeof(decimal),
"Value + TaxAmount"));
table.Rows.Add(5, 1000, 50);
table.Rows.Add(5, 2000, 100);
table.Rows.Add(10, 1000, 100);
table.Rows.Add(10, 2000, 200);
table.Rows.Add(15, 1000, 150);
table.Rows.Add(15, 2000, 300);
return table;
}
public static DataTable GroupData(DataTable dt)
{
return dt.AsEnumerable()
.GroupBy(row => DataRowExtensions.Field<decimal>(row, "TaxRate"))
.Select(grouped =>
{
var row = dt.NewRow();
row["TaxRate"] = grouped.Key;
row["Value"] = grouped.Sum(dRow => dRow.Field<decimal>("Value"));
row["TaxAmount"] = grouped.Sum(dRow => dRow.Field<decimal>("TaxAmount"));
row["FinalValue"] = grouped.Sum(dRow => dRow.Field<decimal>("FinalValue"));
return row;
}).CopyToDataTable();
}
}
}
Form code
using System;
using System.Data;
using System.Windows.Forms;
namespace GroupbyDataTable
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Shown += OnShown;
}
private void OnShown(object sender, EventArgs e)
{
dataGridView1.DataSource = Operations.Mocked();
}
private void GroupButton_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = Operations
.GroupData((DataTable)dataGridView1.DataSource);
}
private void ReloadButton_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = Operations.Mocked();
}
}
}
@Smart_Codes , Is any update? I think Karn's solution is ok, Please tell me if you still have the questions.