如何将列值设置为 GridView 列?

How can I set column values to GridView Columns?

我有这样的 csv 文件:

我需要用 gridview 显示这个 csv 文件。但我必须像这样更改格式:

我必须 select 仅区分日期和装载列,并在 gridview 列上使用日期值。

如何将 csv 文件的值用于 Gridview 列?

假设读取 CSV 文件不是问题,并且您已经有类似 List<ClassName>DataTableList<string[]> 的内容。我假设它是一个 List<String[]>,其中第一个 "column" 是 Date,第二个 Mount 和最后一个 % 在我的以下方法中。

您需要真正的 DateTimes 和 ints 才能按日期计算百分比:

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 的数据源。下面是使用每天的动态列创建 table 的代码:

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 查询并填充 table:

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();