我有这样的csv文件:
我需要使用gridview显示这个csv文件。但我必须改变这样的格式:
我必须选择不同的日期和挂载列,并在gridview列上使用日期值。
如何为Gridview列使用csv文件的值?
答案 0 :(得分:2)
假设读取CSV文件不是问题,您已经有List<ClassName>
,DataTable
或List<string[]>
之类的内容。我假设它是List<String[]>
,其中第一个&#34;列&#34;在我的后续方法中是Date
,第二个Mount
和最后一个%
。
您需要真正的DateTime
和int
才能按日期汇总百分比:
var formatProvider = new CultureInfo("de-DE"); // seems to be the correct format
var mountGroups = listOfStringArray
.Select(arr => new
{
Date = DateTime.Parse(arr[0].Trim(), formatProvider).Date,
Mount = arr[1].Trim(),
Percent = int.Parse(arr[2].Trim())
})
.GroupBy(x => x.Mount);
现在按Mount
分组,您只需要将每天的百分比相加。您可以使用DataTable
作为GridView
的数据源。这是使用每天动态列创建表的代码:
var dataSource = new DataTable();
dataSource.Columns.Add("Mount");
var lastWeekColumns = Enumerable.Range(0, 7)
.Select(d => new DataColumn(DateTime.Today.AddDays(-6 + d).ToShortDateString(), typeof(int)))
.ToArray();
dataSource.Columns.AddRange(lastWeekColumns);
以下循环执行LINQ查询并填充表:
foreach(var grp in mountGroups)
{
DataRow row = dataSource.Rows.Add();
row.SetField("Mount", grp.Key); // because: GroupBy(x => x.Mount);
foreach(DataColumn dayCol in lastWeekColumns)
{
DateTime day = DateTime.Parse(dayCol.ColumnName, formatProvider);
int sumPercent = grp.Where(x => x.Date == day)
.Select(x => x.Percent)
.DefaultIfEmpty(0) // fallback value for missing days
.Sum();
row.SetField(dayCol, sumPercent);
}
}
现在您只需将其用作数据源(AuthoGenerateColumns
设置为true
)
grid.DataSource = dataSource;
grid.DataBind();