Thomas Bandt

Über mich | Kontakt | Archiv

ASP.NET Calendar Control - Abgelaufene Tage deaktivieren

Ich habe in einem Projekt das Calendar-WebControl zur Auswahl des Datums benutzt. Dabei sollte es jedoch für den Benutzer nicht möglich sein, in der Vergangenheit liegende Daten auszuwählen. Das Control selbst bietet keine Möglichkeit, in der Vergangenheit befindliche Tage zu deaktivieren, aber mit etwas Handarbeit kann man auch dieses Feature hinzufügen.

Als erstes schauen wir uns das Event OnDayRender an. Dieses wird für jeden einzelnen Tag in der aktuellen Ansicht des Kalenders aufgerufen, und ist folglich der ideale Punkt um vergangene Tage aus dem Kalender zu streichen.

protected void CheckPastDays(Object source, DayRenderEventArgs e) {
    if(e.Day.Date < DateTime.Now.Date) {
        e.Cell.Controls.Clear();
    }
}

Wir überprüfen ganz einfach, ob der aktuell zu rendernde Tag vor dem aktuellen Datum liegt, und wenn ja entfernen wir sämtliche Controls in der Zelle. Das ist die einfachste Möglichkeit den Tag zu streichen, natürlich kann man hier noch mehr machen.

Nun stellt sich aber das nächste kleine Problem: wenn bereits deaktivierte Tage im Kalender angezeigt werden, ist es eigentlich unsinnig noch ein Zurückblättern auf den letzten Monat anzubieten. Das lösen wir wie folgt:

protected void CheckPastMonth(Object sender, MonthChangedEventArgs e) {
    if(e.NewDate.Month-1 < DateTime.Now.Month) {
        Calendar1.PrevMonthText = "";
    }
    else {
        Calendar1.PrevMonthText = "«";
    }
}

private void Page_Load(object sender, System.EventArgs e) {
    if(Calendar1.SelectedDate.Month-1 < DateTime.Now.Month) {
        Calendar1.PrevMonthText = "";
    }
    else {
        Calendar1.PrevMonthText = "«";
    }
}

Zuerst benutzen wir ein weiteres Event, nämlich OnVisibleMonthChanged. Das wird immer dann aufgerufen, wenn der Button zum nächsten oder vorherigen Monat gedrückt wird. In meinem Beispiel besteht der Text des LinkButtons aus einer spitzen Klammer. Wenn der vorhergehende vor dem neu gewählten Monat älter ist, als der aktuelle, dann entferne ich einfach den LinkButton-Text, womit dieser in der Client-Ansicht verschwindet und nicht mehr benutzbar ist.

Das selbe musste in meinem Fall auch beim ersten Aufruf passieren, daher in etwa noch einmal die gleiche Funktion im Page_Load() des WebForms - denn ich übergebe ein vordefiniertes Datum, und dieses kann sich sowohl in der Zukunft als auch im aktuellen Monat befinden, wodurch auch hier ein Test notwendig wird.

kalender.png

Das war's auch schon :)

Kommentare

  1. Gast schrieb am Dienstag, 31. Mai 2005 13:46:00 Uhr:

    Wie zeigt Du das vordefiniertes Datum (kann auch in der Zukunft liegen) automatisch nach dem Page_Load() im Calender an?


« Zurück  |  Weiter »