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

feesuAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

GO-87Commented:
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
0
feesuAuthor Commented:
G!

You are a life saver!!

What's wrong with the code? Why did I need to do this?
0
Antagony1960Commented:
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

0
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

feesuAuthor Commented:
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.
0
Antagony1960Commented:
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.
0
feesuAuthor Commented:
I did that already. After browsing to a different month, it doesn't bold anything!
0
NerdsOfTechTechnology ScientistCommented:
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

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

0
feesuAuthor Commented:
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

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

0
Antagony1960Commented:
By the way, you shouldn't need to be formatting dFirst or D1 as they're already date variables. I'd just use DateValue on the RS and MonthView dates if I were you. Like this:
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 dFirst <> DateValue(.VisibleDays(1)) Then
            dFirst = DateValue(.VisibleDays(1))
            For i = 0 To 41: .DayBold(dFirst + i) = False: Next
            RS.MoveFirst
            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
        .Refresh
    End With
End Sub

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.