Das Rendern eines Kalenders ist nicht besonders kompliziert. Durch die Verwendung von DateTimeFormatInfo in System.Globalization und der DateTime können alle erforderlichen Informationen abgerufen werden:
- DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek
- DateTimeFormatInfo.CurrentInfo.GetMonthName(month)
- DateTimeFormatInfo.CurrentInfo.GetAbbreviatedDayName((DayOfWeek)dayNumber)
Ein Monat im Kalender kann in einer Tabelle wiedergegeben werden:
_ _ _ 1 2 3 4
5 6 7 8 9 ...
Um die Anzahl der leeren Zellen am Anfang zu bestimmen, kann etwas wie folgt verwendet werden:
DateTime date = new DateTime(year, month, 1);
int emptyCells = ((int)date.DayOfWeek + 7
- (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek) % 7;
Da ein Monat maximal 31 Tage und maximal 6 leere Zellen am Anfang hat, kann ein Monat auf maximal Ceil(37 / 7) = 6 Zeilen dargestellt werden. Es sind also maximal 42 Zellen in einem Monat darzustellen, von denen einige leer sein werden.
Alle 7 (Anzahl der Tage in einer Woche) Zellen wird eine neue Zeile in die Tabelle eingefügt.
int days = DateTime.DaysInMonth(year, month);
for (int i = 0; i != 42; i++)
{
if (i % 7 == 0) {
writer.WriteLine("<tr>");
if( i > 0 ) writer.WriteLine("</tr>");
}
if (i < emptyCells || i >= emptyCells + days) {
writer.WriteLine("<td class=\"cal-empty\"> </td>");
} else {
writer.WriteLine("<td class=\"cal-day\"\">" + date.Day + "</td>");
date = date.AddDays(1);
}
}
Fügen Sie außerdem einfach einen zusätzlichen Link in den nicht leeren Zellen zur gewünschten Route hinzu, wenn die Daten mit Aktivität sind.