Я хочу вычислять значения даты, такие как изображение.
И есть простой способ добавить нижний колонтитул в MetroGridView, который вычисляет значение метки?
В настоящее время я использую ярлык для отображения общих значений.
Любые предложения или идеи?
-Спасибо
Вот код:
private void btnCalc_Click(object sender, EventArgs e)
{
// check start date
if (dtStart.Value > dtEnd.Value)
{
MetroMessageBox.Show(this, "Start Date wrong!", "Error");
return;
}
DateTime Now = dtEnd.Value;
int Years = new DateTime(Now.Subtract(dtStart.Value).Ticks).Year - 1;
DateTime PastYearDate = dtStart.Value.AddYears(Years);
int Months = 0;
for (int i = 1; i <= 12; i++)
{
if (PastYearDate.AddMonths(i) == Now)
{
Months = i;
break;
}
else if (PastYearDate.AddMonths(i) >= Now)
{
Months = i - 1;
break;
}
}
int Days = Now.Subtract(PastYearDate.AddMonths(Months)).Days;
int index = metroGrid1.Rows.Add();
metroGrid1.Rows[index].Cells[0].Value = Years;
metroGrid1.Rows[index].Cells[1].Value = Months;
metroGrid1.Rows[index].Cells[2].Value = Days;
for (int i = 0; i < metroGrid1.Rows.Count; ++i)
{
Years += Convert.ToInt32(metroGrid1.Rows[i].Cells[0].Value);
Months += Convert.ToInt32(metroGrid1.Rows[i].Cells[1].Value);
Days += Convert.ToInt32(metroGrid1.Rows[i].Cells[2].Value);
// stuck here ...
lbltotal.Text = "Total: " + Years.ToString() + " years, " + Months.ToString() + " months and " + Days.ToString() + " days";
}
}
Всего 2 ответа
Мне кажется, что вы должны поместить это утверждение:
lbltotal.Text = "Total: " + Years.ToString() + " years, " + Months.ToString() + " months and " + Days.ToString() + " days";
снаружи для цикла.
А для цикла for вы используете три Int: «Years», «Months», «Days», чтобы представить накопление временного интервала, но на самом деле это Int, а не Timespan, поэтому после цикла это может выглядеть так: 5 лет 20 месяцев 78 дней, я предполагаю, что это не тот результат, который вы хотите.
Почему бы вам не использовать тип TimeSpan для замены этих трех Int?
Изменить: вы можете использовать следующий код:
// 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";
Я тестировал решение Kuo-hsuan Hsu, и он возвращает: Всего: 19 лет, 8 месяцев и 3 дня
Я попробовал немного схожую (см. Ниже) и получаю: Всего: 19 лет, 7 месяцев и 26 дней Калькулятор Windows говорит мне: 19 лет, 7 месяцев, 3 недели, 5 дней, что то же самое, что и выше. Но в любом случае, в течение долгого времени мой код не является точным, а код Го-сюань Хсу тоже не подходит.
// taken values from grid
int years = 18 ;
int months = 18 ;
int days = 57 ;
DateTime today = DateTime.Today; // 2018-11-17
DateTime futuredate = today.AddYears(years);
futuredate = futuredate.AddMonths(months);
futuredate = futuredate.AddDays(days); // 2038-07-13
TimeSpan tsp = futuredate - today;
years = tsp.Days / 365;
futuredate = futuredate.AddYears(-years);
tsp = futuredate - today;
months = tsp.Days / 30;
futuredate = futuredate.AddMonths(-months);
tsp = futuredate - today;
days = tsp.Days;
string res1 = "Total: " + years.ToString() + " years, " + months.ToString() + " months and " + days.ToString() + " days";
Я недоволен приведенным выше кодом. Я собираюсь запустить цикл от даты начала до конца и вычислить значения. Это позволило бы мне даже рассчитывать только на рабочие дни - возможно, иметь список государственных праздников на следующие 100 лет.