1 pièce(s) jointe(s)
Controle Utilisateur (UserControl)
Bonjour,
Je suis sur la création d'un usercontrol type calendrier personnalisé. Je simplifie le projet pour exposer mon problème
Sur le usercontrol Calendrier il y a 31 labels (Label1...Label32)
Code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| Public Class Calendrier
Private _cellClicked As CellDay
Private nbDays As Int16
Private _Cells() As CellDay
Public Shadows Event Click(ByVal sender As Object, ByVal e As EventArgs, ByVal day As CellDay) ' occurs when user click on a day
Public Class CellDay
Public Property Cell As Label
Public Property CellDate As DateTime
Public Property CellColor As Color
End Class
Public Sub New()
' Cet appel est requis par le concepteur.
InitializeComponent()
nbDays=31 ' je simplifie l'exemple en prenant un mois fixe de 31 jours
DrawDays()
End Sub
Public Property Days(ByVal Index As Integer) As CellDay
Get
Return _Cells(Index)
End Get
Set(value As CellDay)
_Cells(Index) = value
SetCellBackground(Index, value.CellColor)
End Set
End Property
Private Sub DayClickHandler(ByVal sender As Object, ByVal e As System.EventArgs)
Dim Jour As Int16
Jour = CInt(CType(sender, Label).Text)
_cellClicked = _Cells(Jour)
RaiseEvent Click(sender, e, _cellClicked)
End Sub
Private Sub SetCellBackground(ByVal Index As Int16, Couleur As Color)
Dim lblRef As Label
lblRef = Me.Controls("Label" & Index.ToString)
lblRef.BackColor = Couleur
_Cells(Index).CellColor = Couleur
End Sub
Private Sub DrawDays()
Dim i As Int16
Dim lblRef As Label
ReDim _Cells(31 + 1) ' je veux pouvoir compter de 1 à 31 (exemple simplifié)
For i = 1 To nbDays
lblRef = Me.Controls("Label" & (i).ToString) 'donne al position de la colonne jour correspondant
lblRef.Text = i.ToString
_Cells(i) = New CellDay With {.Cell = lblRef, .CellDate = Date.Parse(i.ToString & "/" & _month.ToString & "/" & _year.ToString), .CellColor = _bgcolor}
AddHandler lblRef.Click, AddressOf DayClickHandler
Next
End Sub
End Class |
Ce usercontrol (simplifié hein!) affichera 31 labels dont leur texte= "1"... "31"
Je veux pouvoir changer chacun leur background. Pour cela je fais appel à la propriété Calendrier.Days(Index).CellColor (où Index est un entier 1..31)
Donc dans une Form où je place mon Calendrier et un Bouton1 avec le code:
Code:
1 2 3
| Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Calendrier1.Days(15).CellColor = Color.AliceBlue
End Sub |
et dans l'évenement Click:
Code:
1 2 3
| Private Sub Calendrier1_Click(sender As Object, e As System.EventArgs, day As Calendrier.CellDay) Handles Calendrier1.Click
MsgBox(day.Cell.ToString & " : " & day.CellColor.ToString)
End Sub |
Lorsque je lance le programme, il m'affiche donc les 31 jours avec le background par défaut. Si je clique sur Calendrier1, il m'affiche le message avec la couleur par défaut. OK
Je clique sur Bouton1, puis sur Calendrier1, il m'affiche alors bien "Alice blue" MAIS le background n'a pas changé!
En passant en mode débug avec point d’arrêt, lorsque je clique sur Bouton1, je m'aperçois qu'il va dans la partie "Get" de la property Days avec le bon index mais pas dans la partie "Set" et donc ne va pas dans le sub SetCellBackground
Comment se fait il?
PS: au cas où, je joins le projet (plus développé que dans mon explication ci dessus)
Merci
Olivier