Мне кажется, что вы должны поставить это утверждение:
lbltotal.Text = "Total: " + Years.ToString() + " years, " + Months.ToString() + " months and " + Days.ToString() + " days";
снаружи для петли.
И в цикле for вы используете три Int: «Годы», «Месяцы», «Дни», чтобы представить накопление промежутка времени, но на самом деле это Int, а не Timespan, поэтому после цикла он может быть, как: 5 лет 20 месяцев 78 дней, я предполагаю, что это не тот результат, который вы хотите.
Почему бы вам не использовать тип TimeSpan для замены этих трех Int?
Edit:
Вы можете использовать код ниже:
// never mind the date of s1 (1990,1,1),it's not important, just as a start point for the Timespan ts1 to do accumulate;
DateTime s1 = new DateTime(1990, 1, 1);
TimeSpan ts1 = new TimeSpan();
for (int i = 0; i < metroGrid1.Rows.Count; ++i)
{
ts1 += s1.AddDays(Convert.ToInt32(metroGrid1.Rows[i].Cells[2].Value)).AddMonths(Convert.ToInt32(metroGrid1.Rows[i].Cells[1].Value)).AddYears(Convert.ToInt32(metroGrid1.Rows[i].Cells[0].Value)) - s1;
}
int daysResult;
int monthsResult;
int yearsResult;
// get the total number of days, then /365 to get the year count;
yearsResult = ts1.Days /365;
// get the month count by /30 from the remainder of /365;
monthsResult = (ts1.Days % 365) / 30;
// get the day count from the remainder of /30;
daysResult = (ts1.Days % 365) % 30;
lbltotal.Text = "Total: " + yearsResult.ToString() + " years, " + monthsResult.ToString() + " months and " + daysResult.ToString() + " days";