2014-11-04 2 views
1

에서 SUM I는 HH와 VARCHAR 값에 포함 된 세포 DataGridView를 가지고 난 함수를 사용하여 이들 값의 합을 수행 할 때, mm 형식대 Varchar [HH : MM] DataGridView를

private void CalcTime 
{ 
    string span = dataGridView1.Columns["Horas"].ToString(); 
    double seconds = 0; 
    seconds = dataGridView1.Rows 
     .Cast<DataGridViewRow>() 
     .AsEnumerable() 
     .Sum(x => TimeSpan.Parse((x.Cells["Horas"].Value.ToString())).TotalSeconds); 
    string somat = ""; 
    double segundosc = seconds; 
    somat = string.Format(
     "{0:00}:{1:00}", 
     segundosc/3600, 
     (segundosc/60) % 60, 
     segundosc % 60); 
} 

경우 값은 01:00 또는 03:00과 비슷하지만 괜찮 으면 1:30과 같은 값이 있으면 합계가 작동하지 않습니다. 아래와 같이 : enter image description here

어떻게 올바르게 만들 수 있습니까? 감사합니다

+0

나는이를 복제 할 수 없습니다 다시 초로 변환없이 TimeSpan.Add 방법을 사용합니다. 총계는 5:40이어야하지만 6:40이됩니다. 거기에 우리가 볼 수없는 추가 기록이 있습니까? 뭐가 숨겨져 있니? –

+0

@GrantWinney 복제 할 수있었습니다. – juharr

답변

2

문제는 초의 합계가 20400이고 3600으로 나눌 때 5.666666이 나옵니다. 변수가 double이고 형식이 {0:00}이므로 값이 반올림됩니다. 합계를 int으로 전송하거나 Math.Floor을 사용해야합니다.

int seconds = (int)dataGridView1.Rows 
    .Cast<DataGridViewRow>() 
    .AsEnumerable() 
    .Sum(x => TimeSpan.Parse((x.Cells["Horas"].Value.ToString())).TotalSeconds); 

또는

somat = string.Format(
    "{0:00}:{1:00}", 
    Math.Floor(segundosc/3600), 
    (segundosc/60) % 60); 

또한 당신은 당신의 string.Format의 마지막 매개 변수가 필요하지 않습니다.

또 다른 옵션은 TimeSpan으로 TimeSpan.FromSeconds으로 다시 변환하는 것입니다.

double seconds = dataGridView1.Rows 
    .Cast<DataGridViewRow>() 
    .AsEnumerable() 
    .Sum(x => TimeSpan.Parse((x.Cells["Horas"].Value.ToString())).TotalSeconds); 
TimeSpan totalTime = TimeSpan.FromSeconds(seconds); 
string somat = totalTime.ToString(@"hh\:mm"); 
+0

많은 감사합니다 @juharr : D – Reznor13

0

또는 TimeSpan 유형

TimeSpan all = New TimeSpan(0); 
foreach(DataGridViewRow dgvr In dataGridView1.Rows) 
{ 
    all = all.Add(TimeSpan.Parse(dgvr.Cells["Horas"].Value.ToString())); 
} 
string somat = all.ToString(@"hh\:mm"); 
+0

'Enumerable.Sum (IEnumerable )'이 너무 나쁘다. 하지만 Enumerable.Aggregate를 사용하면됩니다. – juharr

+0

@juharr, 죄송합니다, 왜 여기에'Enumerable.Sum()'이 필요한지 이해가 안 되니? – Fabio

+0

'foreach'를'Enumerable.Agregate'로 대체하여 값을 더할 수 있습니다. 나는'TimeSpan'에서'Enumerable.Sum'을 사용하는 방법이 없다는 것이 너무 나쁘다는 것을 말하고있었습니다. – juharr

관련 문제