Link to home
Start Free TrialLog in
Avatar of feesu
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!
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

Open in new window

Avatar of GO-87
GO-87

Hi feesu
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
Avatar of feesu

ASKER

G!

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:

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

Open in new window

Avatar of feesu

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 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.
Avatar of feesu

ASKER

I did that already. After browsing to a different month, it doesn't bold anything!
Avatar of NerdsOfTech
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

Open in new window

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

Open in new window

Avatar of feesu

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!
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

Open in new window

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:
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

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Antagony1960
Antagony1960

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial