Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2036
  • Last Modified:

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

0
feesu
Asked:
feesu
1 Solution
 
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
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

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

Featured Post

[Webinar] Cloud and Mobile-First Strategy

Maybe you’ve fully adopted the cloud since the beginning. Or maybe you started with on-prem resources but are pursuing a “cloud and mobile first” strategy. Getting to that end state has its challenges. Discover how to build out a 100% cloud and mobile IT strategy in this webinar.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now