2015-05-18 2 views
1

У меня есть CSV-файл, как это:Как установить значения столбцов в столбцы GridView?

enter image description here

Мне нужно, чтобы показать этот CSV-файл с GridView. Но я должен изменить формат, как это:

enter image description here

я должен выбрать отчетливую только дату и установить столбцы и значение даты использования на GridView столбцов.

Как использовать значения csv-файла для столбцов Gridview?

+0

Как вы читаете CSV-файл? Это часть вашего вопроса или у вас уже есть что-то вроде 'List ' или 'DataTable' или' List '? –

+0

Я использую 'Sqldatasource' с' Odbc' без кода. – phe

+0

Итак, вы хотите какой-то поворот, строки в столбцы? Известны ли дни? –

ответ

2

Предполагая, что чтение CSV-файла не является проблемой, и у вас уже есть что-то вроде List<ClassName>, DataTable или List<string[]>. Я предполагаю, что это List<String[]>, где первая «колонка» - 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(); 
Смежные вопросы