Rubrik: Controls · Sonstiges | VB-Versionen: VB5, VB6 | 06.03.06 |
MonthView - Tage bei Monatsauswahl hervorheben Hier wird gezeigt, wie man sicherstellen kann, dass bestimmte Tage im MonthView bei der Umschaltung des Monats hervorgehoben werden können. | ||
Autor: Dieter Otter | Bewertung: | Views: 16.360 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Über die DayBold-Eigenschaft des Microsoft MonthView-Controls lassen sich bestimmte Tage im Kalender fett hervorheben. Nehmen wir an, es sollen die Tage 23, 24 und 25 im Monat März fett dargestellt werden. Wie würde man hier am besten vorgehen?
Wechselt der Anwender den Monat durch Klick auf die beiden Pfeilsymbole wird das SelChange-Ereignis ausgelöst. Man sollte also meinen, hier wäre das richtige Ereignis, um den Monat abzufragen und die Tage entsprechend hervorzuheben:
Private Sub MonthView1_SelChange(ByVal StartDate As Date, ByVal EndDate As Date, Cancel As Boolean) With MonthView1 ' Wenn der Monat März 2006 ausgewäht wird If Month(StartDate) = 3 And Year(StartDate) = 2006 Then ' Tage 23, 24 und 25 fett hervorheben .DayBold("23.03.06") = True .DayBold("24.03.06") = True .DayBold("25.03.06") = True End If End With End Sub
Irgendwie funktioniert das Ganze aber nicht
Setzt man bspw. ein MsgBox-Aufruf in den Code sieht man, dass die 3 Tage zunächst fett hervorgehoben werden, nach dem Schließen der MsgBox aber wieder normal dargestellt sind.
... .DayBold("23.03.06") = True .DayBold("24.03.06") = True .DayBold("25.03.06") = True MsgBox "Test" ...
Grund hierfür ist, dass man die Monatsauswahl durch den Anwender über den Cancel-Parameter abbrechen kann und das Control die DayBold-Eigenschaften scheinbar nach Abarbeitung des Ereignisses erst einmal wieder zurücksetzt. Die Tage, die fett hervorgehoben werden sollen, dürfen demnach erst dann festgelegt werden, wenn das Ereignis SelChange vollständig abgearbeitet wurde. Nur gibt es im MonthView-Control leider kein AfterMonthChange-Ereignis oder ähnliches
Eine Möglichkeit gibt es aber dennoch: Wir verwenden einfach einen Timer mit einem ganz kurzen Zeitintervall. Der Timer wird im SelChange-Ereignis gestartet und nach Ablauf des Intervalls auch sofort wieder beendet. Den Code für die Hervorhebung der Tage setzen wir dann einfach ins Timer-Ereignis.
Private Sub MonthView1_SelChange(ByVal StartDate As Date, ByVal EndDate As Date, Cancel As Boolean) ' Timer mit kurzem Zeitintervall starten Timer1.Interval = 50 Timer1.Enabled = True End Sub
Private Sub Timer1_Timer() ' Timer wieder ausschalten Timer1.Enabled = False With MonthView1 ' Wenn der Monat März 2006 ausgewäht wird If .Month = mvwMarch And .Year = 2006 Then ' Tage 23, 24 und 25 fett hervorheben .DayBold("23.03.06") = True .DayBold("24.03.06") = True .DayBold("25.03.06") = True End If End With End Sub
Ergänzung von Frank Wenner:
Das geht aber auch besser ohne Timer und mit Boradmitteln, denn es gibt einen spez. Event dafür GetDayBold:
Private Sub MonthView1_GetDayBold(ByVal StartDate As Date, ByVal Count As Integer, State() As Boolean) ' Wenn der Monat März 2006 ausgewäht wird If MonthView1.Month = mvwMarch And MonthView1.Year = 2006 Then ' Tage 23, 24 und 25 fett hervorheben State(23) = True State(24) = True State(25) = True End If End Sub