I have the table data like:
And I want to display asp.net table like:
Here is the code to get data by group month and shop code
x
var gridData = data
.GroupBy(
x => new {
Convert.ToDateTime(x.InspectedAt).Month,
Convert.ToDateTime(x.InspectedAt).Year,
x.ShopCode
}
)
.Select(x => new InspectionSearchData
{
month = x.Key.Month,
shopCode = x.Key.ShopCode,
total = (int)x.Sum(a => a.PerformCount)
})
.OrderBy(x => x.month)
.ToList();
But i don’t know exactly how to display data like image 2 in asp.net html table.
Can anyone advise on how to do that in asp.net?
Thanks in advance.
Advertisement
Answer
Create a pivot table :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("shopcode", typeof(string));
dt.Columns.Add("month", typeof(int));
dt.Columns.Add("count", typeof(int));
dt.Rows.Add(new object[] { "007", 4, 1 });
dt.Rows.Add(new object[] { "007", 6, 2 });
dt.Rows.Add(new object[] { "009", 7, 1 });
dt.Rows.Add(new object[] { "010", 8, 1 });
dt.Rows.Add(new object[] { "010", 5, 1 });
dt.Rows.Add(new object[] { "011", 9, 5 });
int minMonth = dt.AsEnumerable().Min(x => x.Field<int>("month"));
int maxMonth = dt.AsEnumerable().Max(x => x.Field<int>("month"));
DataTable pivotTable = new DataTable();
pivotTable.Columns.Add("shopcode", typeof(string));
for (int i = minMonth; i <= maxMonth; i++)
{
pivotTable.Columns.Add(i.ToString(), typeof(string));
}
var groups = dt.AsEnumerable().GroupBy(x => x.Field<string>("shopcode"));
foreach(var group in groups)
{
DataRow newRow = pivotTable.Rows.Add();
newRow["shopcode"] = group.Key;
var months = group.GroupBy(x => x.Field<int>("month"));
foreach(var month in months)
{
newRow[month.Key.ToString()] = month.Sum(x => x.Field<int>("count"));
}
for(int i = minMonth; i <= maxMonth; i++)
{
if(newRow[i.ToString()] == DBNull.Value)
{
newRow[i.ToString()] = 0;
}
}
}
}
}
}