feesu
asked on
VB6 - How do I set DayBold property in the MonthView control dynamically?
Hi Experts,
I have a month view control that I need to set its dayBold property at runtime for multiple days. I am using the below code, but it doesn't seem to work!
I have checked the code and the recordset has 3 records for different dates in the same month, however it doesn't show any bold day!
I have a month view control that I need to set its dayBold property at runtime for multiple days. I am using the below code, but it doesn't seem to work!
I have checked the code and the recordset has 3 records for different dates in the same month, however it doesn't show any bold day!
RS.MoveFirst
While Not RS.EOF
With Me.MonthView1
Dim d1 As Date
d1 = DateValue(RS("valueDate"))
.DayBold(d1) = True
End With
RS.MoveNext
Wend
ASKER
G!
You are a life saver!!
What's wrong with the code? Why did I need to do this?
You are a life saver!!
What's wrong with the code? Why did I need to do this?
DayBold only works on dates which fall within the VisibleDays array, which spans from 1 to 42.
Unfortunately, the bolding information is not preserved as you move from month to month, so I suggest you put the code in the SelChange event. Assuming the RS recordset is defined elsewhere (if not you could refine the query to limit it to the visible dates), something like this should work:
Unfortunately, the bolding information is not preserved as you move from month to month, so I suggest you put the code in the SelChange event. Assuming the RS recordset is defined elsewhere (if not you could refine the query to limit it to the visible dates), something like this should work:
Private Sub MonthView1_SelChange(ByVal StartDate As Date, _
ByVal EndDate As Date, Cancel As Boolean)
Dim d1 As Date
Static dFirst As Date
With MonthView1
If dFirst <> .VisibleDays(1) Then
dFirst = .VisibleDays(1)
While Not RS.EOF
d1 = DateValue(RS("valueDate"))
If d1 >= dFirst And d1 <= dFirst + 41 Then
.DayBold(d1) = True
End If
RS.MoveNext
Wend
End If
End With
End Sub
ASKER
Antagony1960,
Your point is valid. However, I have tried the code you sent, and called it as well on load. But it never bolded anything!
Note: I have defined the RS in the form declaration and opened it in the form load.
Your point is valid. However, I have tried the code you sent, and called it as well on load. But it never bolded anything!
Note: I have defined the RS in the form declaration and opened it in the form load.
Your probably still at the end of the recordset when the event fires. Try sticking a movefirst in just before the wend loop:
RS.MoveFirst
While Not RS.EOF
...ect.
RS.MoveFirst
While Not RS.EOF
...ect.
ASKER
I did that already. After browsing to a different month, it doesn't bold anything!
Don't forget to refresh the control :)
private Sub Form_Activate()
'...
While Not RS.EOF
With Me.MonthView1
Dim d1 As Date
d1 = DateValue(RS("valueDate"))
.DayBold(d1) = True
End With
RS.MoveNext
Wend
Me.MonthView1.Refresh
End Sub
Ah, it's a long time since I've played with this so I'd forgotten that Microsoft, in their wisdom, decided to make the control have different methods of bolding depending on whether the date is set externally or by clicking on the calendar itself. You need to add the GetDayBold event for calendar clicks:
Private Sub MonthView1_GetDayBold(ByVal StartDate As Date, ByVal Count As Integer, State() As Boolean)
Dim i As Integer
For i = 0 To Count - 1
State(i) = MonthView1.DayBold(StartDate + i)
Next
End Sub
ASKER
Hello again,
This is my code that I call on load and on sel change. In addition to the code you sent for GetDayBold.
Your code started bolding the days of each month! For example, I need to bolden only 24th of Oct. but now when I click on next month manually, the 24th of Nov. is also bolded!
This is my code that I call on load and on sel change. In addition to the code you sent for GetDayBold.
Your code started bolding the days of each month! For example, I need to bolden only 24th of Oct. but now when I click on next month manually, the 24th of Nov. is also bolded!
Sub test()
Me.Show
DoEvents
Dim D1 As Date
Static dFirst As Date
With MonthView1
If Format(dFirst, "dd/mm/yyyy") <> Format(.VisibleDays(1), "dd/mm/yyyy") Then
dFirst = Format(.VisibleDays(1), "dd/mm/yyyy")
RS.MoveFirst
While Not RS.EOF
D1 = Format(DateValue(RS("valueDate")), "dd/mm/yyyy")
If D1 >= Format(dFirst, "dd/mm/yyyy") And D1 <= Format(DateAdd("d", 41, dFirst), "dd/mm/yyyy") Then
.DayBold(Format(D1, "dd/mm/yyyy")) = True
'MsgBox "bolded: " & D1
End If
RS.MoveNext
Wend
End If
.Refresh
End With
DoEvents
End Sub
Right, sorry about that. I was just about to go out for the day so I didn't get chance to test it properly.
Yeah, I'd forgotten all about this MonthView control's annoying behaviour. You'll still need to use the GotDayBold event code I posted earlier, but you now also have to reset any existing bolding whenever the month changes. This should do it:
Yeah, I'd forgotten all about this MonthView control's annoying behaviour. You'll still need to use the GotDayBold event code I posted earlier, but you now also have to reset any existing bolding whenever the month changes. This should do it:
Private Sub MonthView1_SelChange(ByVal StartDate As Date, _
ByVal EndDate As Date, Cancel As Boolean)
Dim D1 As Date, i As integer
Static dFirst As Date
With MonthView1
If Format(dFirst, "dd/mm/yyyy") <> Format(.VisibleDays(1), "dd/mm/yyyy") Then
dFirst = Format(.VisibleDays(1), "dd/mm/yyyy")
For i = 0 To 41: .DayBold(dFirst + i) = False: Next
RS.MoveFirst
While Not RS.EOF
D1 = Format(DateValue(RS("valueDate")), "dd/mm/yyyy")
If D1 >= Format(dFirst, "dd/mm/yyyy") And D1 <= Format(DateAdd("d", 41, dFirst), "dd/mm/yyyy") Then
.DayBold(Format(D1, "dd/mm/yyyy")) = True
End If
RS.MoveNext
Wend
End If
.Refresh
End With
End Sub
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Is your code running inside the Form_Load ( ) event handler? If so, try adding these two lines before your code:
Me.Show
DoEvents
Cheers
G