WinForm Рассчитать все gridview на сегодняшний день

Я хочу вычислять значения даты, такие как изображение.

введите описание изображения здесь

И есть простой способ добавить нижний колонтитул в 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 лет.


Есть идеи?

10000