如何将列值设置为GridView列?

时间:2015-05-18 13:33:22

标签: asp.net csv gridview

我有这样的csv文件:

enter image description here

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

enter image description here

我必须选择不同的日期和挂载列,并在gridview列上使用日期值。

如何为Gridview列使用csv文件的值?

1 个答案:

答案 0 :(得分:2)

假设读取CSV文件不是问题,您已经有List<ClassName>DataTableList<string[]>之类的内容。我假设它是List<String[]>,其中第一个&#34;列&#34;在我的后续方法中是Date,第二个Mount和最后一个%

您需要真正的DateTimeint才能按日期汇总百分比:

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