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:
Ce usercontrol (simplifié hein!) affichera 31 labels dont leur texte= "1"... "31"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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:
et dans l'évenement Click:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Partager