2016-01-24 3 views
1

У меня есть datagridview, в котором записаны записи из CSV-файла (около 30 тыс. Записей с 30-40 уникальными идентификаторами - зависит от файла). Это выглядит так:Как суммировать столбцы datagridview по уникальным идентификаторам?

Теперь мой вопрос заключается в том, как суммировать эти столбцы по id? Или, может быть, есть способ напрямую поместить уже подведенные значения в datagridview?

private void dropListBox_DragDrop(object sender, DragEventArgs e) 
{ 
    data= new List<Raport>(); 
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
    foreach (string file in files) 
    { 
     var nameOnly = System.IO.Path.GetFileName(file); 
     dropListBox.Items.Clear(); 
     dropListBox.Items.Add(nameOnly); 
     dataGridView1.Rows.Clear(); 

     string[] readText = File.ReadAllLines(file, Encoding.GetEncoding("Windows-1250")); 

     int i = 0; 
     foreach (string line in readText) 
     { 
      if (i++ == 0) continue; 
      var values = line.Split(';'); 

      string a= values[0]; 
      string b= values[1]; 
      string c= values[2]; 
      string user = values[3]; 
      int xValues= int.Parse(values[4]); 
      int yValues= int.Parse(values[5]); 
      double d= double.Parse(values[6]); 
      string e= values[7]; 
      string f= values[8]; 
      string g= values[9]; 
      string h= values[10]; 
      double i= double.Parse(values[11]); 
      string j= values[12]; 

      Raport Raport = new Raport(
       a, 
       b, 
       c, 
       user, 
       xValues, 
       yValues, 
       d, 
       e, 
       f, 
       g, 
       h, 
       i, 
       j); 

      data.Add(Raport); 

      dataGridView1.Rows.Add(Raport.user, Raport.xValues, Raport.yValues, "8", "8"); 

Это код, который у меня есть. Последние 2 столбца не имеют значения (всегда заполняются фиксированными значениями)

Любые предложения будут оценены.

Это должно пойти как этого

John | 5 |  4  
Carl | 3 |  1 
John | 1 |  6 
Carl | 4 |  1 

затем

John | 6 | 10 
Carl | 7 | 2 

структура из Raport класс

class Raport 
{ 
    public readonly string a; 
    public readonly string b; 
    public readonly string c; 
    public readonly string user; 
    public readonly int xValue; 
    public readonly int yValue; 
    public readonly double d; 
    public readonly string e; 
    public readonly string f; 
    public readonly string g; 
    public readonly string h; 
    public readonly double i; 
    public readonly string j; 

    public Raport(
     string a, 
     string b, 
     string c, 
     string user, 
     int xValue, 
     int yValue, 
     double d, 
     string e, 
     string f, 
     string g, 
     string h, 
     double i, 
     string j) 
    { 
     this.a= a; 
     this.b= b; 
     this.c= c; 
     this.user= user; 
     this.xValue= xValue; 
     this.yValue= yValue; 
     this.d= d; 
     this.e= e; 
     this.f= f; 
     this.g= g; 
     this.h= h; 
     this.i= i; 
     this.j= j; 
    } 

    public Raport() 
    { 
    } 

    public override string ToString() 
    { 
     return a+ " ; " + 
      b+ " ; " + 
      c+ " ; " + 
      user+ " ; " + 
      xValue+ " ; " + 
      yValue+ " ; " + 
      d+ " ; " + 
      e+ " ; " + 
      f+ " ; " + 
      g+ " ; " + 
      h+ " ; " + 
      i+ " ; " + 
      j; 
    } 
} 
} 
+0

Какое из этих столбцов «a, b, c, d, e, f, g, h, i, j 'является идентификационным номером? И какова структура класса Raport? Какие поля вы хотите суммировать? – Steve

+0

ID - это «пользовательский», значения, которые я хочу подвести, - это xValues ​​и yValues ​​на основе идентификатора. (Я помещал их в datagridview в эту строку: dataGridView1.Rows.Add (Raport.user, Raport.xValues, Raport .yValues, «8», «8»);) «a, b, c, d, e, f, g, h, i, j 'не имеет значения, кроме как существует в CSV-файле, который я поставил к приложению. – Bronchi

ответ

0

В настоящее время вы уже добавляя каждый Raport объект в список и DataGridView:

data= new List<Raport>(); 
// ... 
data.Add(Raport); 
dataGridView1.Rows.Add(Raport.user, Raport.xValues, Raport.yValues, "8", "8"); 

Вы можете использовать этот список и LINQ в ваши интересы, чтобы сгруппировать объекты по user собственностям, суммируя два других необходимых свойства, as seen here. Это будет храниться в другой список, который затем может быть использован, чтобы заполнить DataGridView:

var summedData = data.GroupBy(r => new { r.user }) 
        .Select(r => new Raport() 
            { 
             user = r.Key.user, 
             xValue = r.Sum(innerR => innerR.xValue), 
             yValue = r.Sum(innerR => innerR.yValue) 
            } 
          ); 

Затем, вместо добавления каждого Raport созданного во время создания оригинального data списка, просто проходного нового суммированного списка:

foreach (Raport raport in summedData) 
{ 
    dataGridView1.Rows.Add(raport.user, raport.xValues, raport.yValues, "8", "8"); 
} 
+0

Спасибо за ваш ответ и усилие, чтобы это сделать. – Bronchi

Смежные вопросы