WinForm Рассчитать все gridview на сегодняшний день - PullRequest
0 голосов
/ 17 ноября 2018

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

enter image description here

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

0 голосов
/ 17 ноября 2018

Я протестировал решение Куо-Сюань Хсу, и оно возвращает: Итого: 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 лет.

0 голосов
/ 17 ноября 2018

Мне кажется, что вы должны поставить это утверждение:

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...