DataGridView中的Varchar [HH:MM] SUM

时间:2014-11-04 12:00:55

标签: c# winforms datagridview

我有一个Datagridview,其单元格包含具有HH:mm格式的varchar值,当我需要对这些值求和时,我使用函数

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它可以,但如果我的值为01:30,则总和不起作用。如下所示:enter image description here

如何让它正常工作? 此致

2 个答案:

答案 0 :(得分: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);

OR

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

答案 1 :(得分:0)

或者使用TimeSpan.Add方法而不转换为秒并返回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");