Смещение рамки календаря с помощью DateTime

118
10 июля 2021, 18:10

Календарь работает. Но, не сходится нужная строка с датой. Не могу найти в чем проблема. На картинке видно проблему.

void DrowMiniCalendar(DateTime selectedDate)
    {
        int posX = 43, posY = 19;
        string[,] days = new string[6, 7];
        int week = 0;
        int dayOfWeek = (int)FirstDayOfMonth(selectedDate).DayOfWeek - 1;
        if (dayOfWeek == -1) dayOfWeek = 6;
        int daysInMonth = LastDayOfMonth(selectedDate).Day;
        for (int day = 1; day <= daysInMonth; ++day)
        {
            days[week, dayOfWeek] = $"{day,2}";
            ++dayOfWeek;
            if (dayOfWeek == 7)
            {
                ++week;
                dayOfWeek = 0;
            }
        }
        for (int row = 0; row < 6; ++row)
        {
            for (int column = 0; column < 7; ++column)
            {
                Console.SetCursorPosition(posX + column * 4, posY + row * 2);
                Console.Write(days[row, column] ?? "    ");
            }
        }
        DrowCurrentDayMiniCalendar(selectedDate);
    }
void DrowCurrentDayMiniCalendar(DateTime selectedDate)
    {
        int posX = 42, posY = 18;
        int column = (int)selectedDate.DayOfWeek - 1;
        if (column == -1) column = 6;
        int row = (selectedDate.Day + (int)FirstDayOfMonth(selectedDate).DayOfWeek - 2) / 7;
        Console.SetCursorPosition(posX + column * 4, posY + row * 2);
        Console.Write("┌──┐");
        Console.SetCursorPosition(posX + column * 4, posY + 1 + row * 2);
        Console.Write("│");
        Console.SetCursorPosition(posX + 3 + column * 4, posY + 1 + row * 2);
        Console.Write("│");
        Console.SetCursorPosition(posX + column * 4, posY + 2 + row * 2);
        Console.Write("└──┘");
    }
Answer 1

Проблема в том, что в рассчете строки для курсора вы переводите день недели из enum в int напрямую

(int)FirstDayOfMonth(selectedDate).DayOfWeek

А в C# используется неделя в формате даты США, когда она начинается с Воскресенья

0 - Воскресенье
1 - Понедельник
2 - Вторник 
...

И если в рассчете столбца вы это учитываете

if (dayOfWeek == -1) dayOfWeek = 6;

То в рассчете строки - нет

int row = (selectedDate.Day + (int)FirstDayOfMonth(selectedDate).DayOfWeek - 2) / 7;

Замените рассчет row в DrowCurrentDayMiniCalendar на

int firstDayOfWeek = FirstDayOfMonth(selectedDate).DayOfWeek - 1;
if (firstDayOfWeek == -1) firstDayOfWeek = 6;
int row = (selectedDate.Day + firstDayOfWeek - 1) / 7
READ ALSO
Тройной sql запрос

Тройной sql запрос

Столкнулся с проблемой вложенности запросаИмеются три таблицы:

91
Как связать таблицы в базе данных?

Как связать таблицы в базе данных?

Проектирую БД для "онлайн журнала"И запутался в связях

90
Как из строк в столбик создать json строку?

Как из строк в столбик создать json строку?

Необходимо email базу контактов, вида

158
Как правильно спарсить все адреса сайта и добавить их в базу данных?

Как правильно спарсить все адреса сайта и добавить их в базу данных?

Пишу парсер для сайта https://kladr-rfru/ 1) нужно получить все города со всех регионов и улицы со всех городов, данные о городах и улицах спарсил 2) далее...

77