Avant tout je tiens à dire que la correction n'est pas universelle. Elle servira juste à ceux qui n'ont absolument pas réussi à manipuler les objets et autres collection à s'en tirer un minimum.
Mais si vous n'avez rien compris à ce TP et si vous n'avez pas été capable d'en réaliser un ébauche, je ne saurai que vous conseiller de recommencer la lecture de la partie sur la POO.
Pour les autres, chaque situation étant différente je vais tâcher de vous présenter un programme aussi concis et universel que possible.
Mon programme est composé de deux fenêtres. La première regroupant les fonctions de recherche, liste et visualisation d'une fiche. La seconde permettant la création et modification d'une fiche.
Je vais déjà vous détailler des deux fenêtres :

Fenêtre principale. Name : ZBiblio

Fenêtre d'ajout/modification. Name : AjoutEditionFilm
Voici mes deux fenêtres. Quelques contrôles spécifiques. Un
DateTimePicker pour la sélection de la date et un
NumericUpDown pour la sélection de la note.
Vous avez sans doutes remarqués les
DropDownList pour les genres et le réalisateur. Elles sont là pour une fonctionnalité ultérieure qui permettra d'insérer les acteurs et genres déjà remplis sur des films pour permettre un choix rapide. Mais en attendant on peut s'en servir comme de simples
TextBox en utilisant la propriété
Text.
Je vous demanderai de vous passer de moqueries sur mes interfaces

, je n'ai jamais eu l'âme d'un designer

.
Bien bien, passons aux feuilles de code.
La classe Film
Code : VB.NET 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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 | Public Class Film
Private _Nom As String
Public Property Nom As String
Get
Return _Nom
End Get
Set(ByVal value As String)
_Nom = value
End Set
End Property
Private _DateSortie As Date
Public Property DateSortie As Date
Get
Return _DateSortie
End Get
Set(ByVal value As Date)
_DateSortie = value
End Set
End Property
Private _Realisateur As String
Public Property Realisateur As String
Get
Return _Realisateur
End Get
Set(ByVal value As String)
_Realisateur = value
End Set
End Property
Private _Genre1 As String
Public Property Genre1 As String
Get
Return _Genre1
End Get
Set(ByVal value As String)
_Genre1 = value
End Set
End Property
Private _Genre2 As String
Public Property Genre2 As String
Get
Return _Genre2
End Get
Set(ByVal value As String)
_Genre2 = value
End Set
End Property
Private _Acteurs As String
Public Property Acteurs As String
Get
Return _Acteurs
End Get
Set(ByVal value As String)
_Acteurs = value
End Set
End Property
Private _Synopsis As String
Public Property Synopsis As String
Get
Return _Synopsis
End Get
Set(ByVal value As String)
_Synopsis = value
End Set
End Property
Private _RemarquePerso As String
Public Property RemarquePerso As String
Get
Return _RemarquePerso
End Get
Set(ByVal value As String)
_RemarquePerso = value
End Set
End Property
Private _NotePerso As Integer
Public Property NotePerso As Integer
Get
Return _NotePerso
End Get
Set(ByVal value As Integer)
_NotePerso = value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal Nom As String, ByVal DateSortie As Date, ByVal Realisateur As String, ByVal Genre1 As String, ByVal Genre2 As String, ByVal Acteurs As String, ByVal Synopsis As String, ByVal RemarquePerso As String, ByVal NotePerso As Integer)
_Nom = Nom
_DateSortie = DateSortie
_Realisateur = Realisateur
_Genre1 = Genre1
_Genre2 = Genre2
_Acteurs = Acteurs
_Synopsis = Synopsis
_RemarquePerso = RemarquePerso
_NotePerso = NotePerso
End Sub
Public Sub Update(ByVal Nom As String, ByVal DateSortie As Date, ByVal Realisateur As String, ByVal Genre1 As String, ByVal Genre2 As String, ByVal Acteurs As String, ByVal Synopsis As String, ByVal RemarquePerso As String, ByVal NotePerso As Integer)
_Nom = Nom
_DateSortie = DateSortie
_Realisateur = Realisateur
_Genre1 = Genre1
_Genre2 = Genre2
_Acteurs = Acteurs
_Synopsis = Synopsis
_RemarquePerso = RemarquePerso
_NotePerso = NotePerso
End Sub
'Je surcharge le Tostring
Public Overrides Function ToString() As String
Return _Nom
End Function
End Class
|
Beaucoup de lignes pour ce qui concerne les propriétés. Mais c'est un passage obligé

.
Le constructeur a deux signatures (une signature étant une façon de l'appeler) grâce à une surcharge. Une avec arguments, l'autre sans.
Une méthode
Update permettant la Mise à jour en une ligne de tous les attributs de la fiche.
Et finalement une surcharge de
ToString spécifiant qu'il faut retourner le nom du film lorsque j'utiliserai cette fonction.
La fenêtre principale : ZBiblio
Code : VB.NET 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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192 | Imports System.Xml.Serialization
Imports System.IO
Public Class ZBiblio
Private _FenetreAjout As AjoutEditionFilm
Private _FilmEnVisualisation As Film
Private _ListeFilms As List(Of Film)
Public Property ListeFilms As List(Of Film)
Get
Return _ListeFilms
End Get
Set(ByVal value As List(Of Film))
_ListeFilms = value
End Set
End Property
Private Sub ListeFilms_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Instancie une nouvelle liste
_ListeFilms = New List(Of Film)
'Récupère les infos
Deserialisation()
'MAJ la liste de films
UpdateListe()
End Sub
Private Sub ListeFilms_FormClosing(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
'Sérialise les films lors de la fermeture
Serialisation()
End Sub
Private Sub LB_LISTE_FILMS_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LB_LISTE_FILMS.SelectedIndexChanged
'On vérifie qu'on a sélectionné quelquechose
If Not Me.LB_LISTE_FILMS.SelectedItem Is Nothing Then
'Retrouve le film avec ce nom
For Each FilmALister As Film In _ListeFilms
If FilmALister.Nom = LB_LISTE_FILMS.SelectedItem.ToString Then
'L'insère dans une variable globale
Me._FilmEnVisualisation = FilmALister
End If
Next
'On MAJ les infos de la fiche
Me.LBL_TITRE.Text = Me._FilmEnVisualisation.Nom
Me.LBL_DATE_SORTIE.Text = Me._FilmEnVisualisation.DateSortie.ToShortDateString 'La date seule
Me.LBL_GENRE1.Text = Me._FilmEnVisualisation.Genre1
Me.LBL_GENRE2.Text = Me._FilmEnVisualisation.Genre2
Me.LBL_REALISATEUR.Text = Me._FilmEnVisualisation.Realisateur
Me.LBL_ACTEURS.Text = Me._FilmEnVisualisation.Acteurs
Me.LBL_SYNOPSIS.Text = Me._FilmEnVisualisation.Synopsis
Me.LBL_AVIS_PERSONNEL.Text = Me._FilmEnVisualisation.RemarquePerso
Me.LBL_NOTE.Text = Me._FilmEnVisualisation.NotePerso
End If
End Sub
Public Sub UpdateListe()
'On vide la liste et on la reremplit
Me.LB_LISTE_FILMS.Items.Clear()
'Parcours les films de la bibliotheque
For Each FilmALister As Film In _ListeFilms
'Remplit la liste en se basant sur le nom (vu que j'ai surchargé tostring)
'A le même effet que FilmALister.Nom sans la surcharge.
Me.LB_LISTE_FILMS.Items.Add(FilmALister)
Next
End Sub
#Region "Boutons modif fiche"
Private Sub BT_SUPPRIMER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SUPPRIMER.Click
'Confirmation
If MsgBox("Etes vous certain de vouloir supprimer ce film ?", vbYesNo, "Confirmation") Then
'On le retire de la liste
Me._ListeFilms.Remove(_FilmEnVisualisation)
End If
'MAJ
UpdateListe()
End Sub
Private Sub BT_NOUVELLE_FICHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_NOUVELLE_FICHE.Click
'Si nouveau film, on passe nothing
_FenetreAjout = New AjoutEditionFilm(Nothing)
_FenetreAjout.Show()
End Sub
Private Sub BT_MAJ_FICHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_MAJ_FICHE.Click
'Si une maj on passe le paramètre du film actuel
_FenetreAjout = New AjoutEditionFilm(_FilmEnVisualisation)
_FenetreAjout.Show()
End Sub
#End Region
#Region "Sauvegarde et récupération"
Private Sub Deserialisation()
If File.Exists("BibliothequeFilm.xml") Then
'On ouvre le fichier et recupere son flux
Dim FluxDeFichier As Stream = File.OpenRead("BibliothequeFilm.xml")
Dim Deserialiseur As New XmlSerializer(GetType(List(Of Film)))
'Désérialisation et convertion de ce qu'on récupère dans le type "Film"
_ListeFilms = Deserialiseur.Deserialize(FluxDeFichier)
'Fermeture du flux
FluxDeFichier.Close()
End If
End Sub
Private Sub Serialisation()
'On crée le fichier et récupère son flux
Dim FluxDeFichier As FileStream = File.Create("BibliothequeFilm.xml")
Dim Serialiseur As New XmlSerializer(GetType(List(Of Film)))
'Serialisation et écriture
Serialiseur.Serialize(FluxDeFichier, _ListeFilms)
'Fermeture du fichier
FluxDeFichier.Close()
End Sub
#End Region
#Region "Section recherche"
Private Sub RemplissageChampsRecherche()
'Fonction utilisée plus tard pour pré-replir les DDL de genres / réalisteurs ...
End Sub
Private Sub BT_RECHERCHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_RECHERCHE.Click
Recherche()
End Sub
Private Sub BT_EFFACER_RECHERCHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_EFFACER_RECHERCHE.Click
Me.TXT_TITRE.Text = ""
Me.DDL_ACTEUR.Text = ""
Me.DDL_ANNEE.Text = ""
Me.DDL_GENRE.Text = ""
Me.DDL_REALISATEUR.Text = ""
UpdateListe()
End Sub
Private Sub Recherche()
'On vide la liste et on la reremplit
Me.LB_LISTE_FILMS.Items.Clear()
'Parcours les films de la bibliotheque
For Each FilmALister As Film In _ListeFilms
If Me.TXT_TITRE.Text <> "" Then
If FilmALister.Nom.Contains(Me.TXT_TITRE.Text) Then
Me.LB_LISTE_FILMS.Items.Add(FilmALister)
End If
End If
If Me.DDL_ACTEUR.Text <> "" Then
If FilmALister.Acteurs.Contains(Me.DDL_ACTEUR.Text) Then
Me.LB_LISTE_FILMS.Items.Add(FilmALister)
End If
End If
If Me.DDL_ANNEE.Text <> "" Then
If CDate(FilmALister.DateSortie).Year = Me.DDL_ANNEE.Text Then
Me.LB_LISTE_FILMS.Items.Add(FilmALister)
End If
End If
If Me.DDL_GENRE.Text <> "" Then
If FilmALister.Genre1.Contains(Me.DDL_GENRE.Text) Or FilmALister.Genre2.Contains(Me.DDL_GENRE.Text) Then
Me.LB_LISTE_FILMS.Items.Add(FilmALister)
End If
End If
If Me.DDL_REALISATEUR.Text <> "" Then
If FilmALister.Realisateur.Contains(Me.DDL_REALISATEUR.Text) Then
Me.LB_LISTE_FILMS.Items.Add(FilmALister)
End If
End If
Next
End Sub
#End Region
End Class
|
Cette fenêtre contient les fonctions de sérialisation et désérialisation. En ce qui concerne la sérialisation elle s'effectue automatiquement lors de la fermeture de la fenêtre (autrement dit du programme). La désérialisation quand à elle, se lance au démarrage du programme en vérifiant bien évidemment la présence du fichier xml.
Une propriété permettant de modifier la variable
_ListeFilms est publique de façon à pouvoir l'appeler depuis l'autre fenêtre. Il en va de même pour la méthode
Update.
Pour le reste, je pense que mes commentaires sont assez explicites

.
Fenêtre d'ajout et de modification.
Code : VB.NET 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 | Public Class AjoutEditionFilm
Private _FilmAModifier As Film
Sub New(ByVal FilmAModifier As Film)
' Cet appel est requis par le concepteur.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
'Recupere le film à modifier
_FilmAModifier = FilmAModifier
End Sub
Private Sub AjoutEditionFilm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If _FilmAModifier Is Nothing Then
'S'il ne contient rien, on en crée un nouveau
Else
'Sinon on recupère les infos et on les entre dans les cases correspondantes
Me.TXT_ACTEURS.Text = _FilmAModifier.Acteurs
Me.TXT_AVIS_PERSONNEL.Text = _FilmAModifier.RemarquePerso
Me.TXT_NOM.Text = _FilmAModifier.Nom
Me.TXT_SYNOPSIS.Text = _FilmAModifier.Synopsis
Me.DDL_GENRE1.Text = _FilmAModifier.Genre1
Me.DDL_GENRE2.Text = _FilmAModifier.Genre2
Me.DDL_REALISATEUR.Text = _FilmAModifier.Realisateur
Me.NUM_NOTE.Value = _FilmAModifier.NotePerso
Me.DT_DATE_SORTIE.Value = _FilmAModifier.DateSortie
End If
End Sub
Private Sub BT_SAVE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SAVE.Click
If _FilmAModifier Is Nothing Then
'Enregistre notre film
Dim MonFilm As New Film(Me.TXT_NOM.Text, Me.DT_DATE_SORTIE.Value, Me.DDL_REALISATEUR.Text, Me.DDL_GENRE1.Text, Me.DDL_GENRE2.Text, Me.TXT_ACTEURS.Text, Me.TXT_SYNOPSIS.Text, Me.TXT_AVIS_PERSONNEL.Text, Me.NUM_NOTE.Value)
'On l'ajoute à la liste
ZBiblio.ListeFilms.Add(MonFilm)
MsgBox("Fiche correctement crée", vbOKOnly, "Confirmation")
Else
'Sinon on le modifie en récupérant son index dans la liste de la fenêtre parent
ZBiblio.ListeFilms(ZBiblio.ListeFilms.IndexOf(_FilmAModifier)).Update(Me.TXT_NOM.Text, Me.DT_DATE_SORTIE.Value, Me.DDL_REALISATEUR.Text, Me.DDL_GENRE1.Text, Me.DDL_GENRE2.Text, Me.TXT_ACTEURS.Text, Me.TXT_SYNOPSIS.Text, Me.TXT_AVIS_PERSONNEL.Text, Me.NUM_NOTE.Value)
End If
'MAJ de la liste dans la fenêtre parent
ZBiblio.UpdateListe()
'Ferme la fenêtre d'édition
Me.Close()
End Sub
Private Sub IMG_AFFICHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IMG_AFFICHE.Click
'Ultérieur ; possibilité d'ajouter une fiche.
End Sub
End Class
|
J'ai ajouté manuellement le constructeur de cette fenêtre. Lorsque vous créez le constructeur, automatiquement il ajoute :
Code : VB.NET | ' Cet appel est requis par le concepteur.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
|
Il ne faut surtout pas effacer, c'est ce qui initialise les éléments graphiques. Ajoutez ce que vous voulez après. Personnellement j'ai demandé un argument au constructeur, cet argument étant le film à modifier. Si c'est
nothing qui est passé, cela signifie que c'est une nouvelle fiche qu'il faut créer.
Pour le reste, même remarque : les commentaires doivent être assez clairs à mon avis.
Si un problème vient à vous bloquer, n'hésitez pas à laisser un commentaire sur ce chapitre détaillant votre problème.