Bonjour,

Je suis actuellement en plein apprentissage de Winforms.

J'ai commencé à développer un petit logiciel pour me faire la main (voir screenshot en bas)

Si je sollicite votre aide aujourd'hui c'est pour essayer d'avoir la bonne technique pour jongler entre mes listview et mes objets.

Je ne suis pas sur d'utiliser la bonne méthode.

Pour ce projet j'ai deux listView et 2 classes:

- Une classe client que j'utilise dans une List<Client> et que j'affiche dans la ListView clients.
- Une classe session dans une List<Session> qui appartient à la classe client et qui s'affiche dans la ListView sessions (si un client est sélectionné)

Je met automatiquement à jour les ListView avec une méthode (qu'on va appeler Refresh()) qui crée des items pour chacune des listes en passant en revue chaque instance de chaque objet client et sessions.

Voici précisément ce que je fais:

Quand j'encode un client ou session:
1. Je clear ma ListView
2. J'invoque ma méthode Refresh() qui Clear la listView et crée des items pour chaque instance de ma List<Client> ou List<Session>

Quand je supprime un client ou session:
1. Je récupère l'item sélectionné
2. Je récupère le champs Blaze (ou le champs Date/Heure pour les sessions), je fais une recherche dans ma List<Client> pour trouver l'objet concordant au champs Blaze
3. Je remove de la List<Client> l'objet trouvé
4. J'invoque ma méthode Refresh() qui Clear la listView et crée des items pour chaque instance de ma List<Client>

Le code fonctionne, mais des problèmes pourraient se poser si deux clients ont le même Blaze ou deux sessions ont la même heure vu que je base mes recherche la dessus...

Je pense qu'il faut fonctionner avec des ID, j'ai tenté plusieurs tentatives mais sans succès, il y a un truc que je ne fais pas bien de cette façon.

Auriez-vous des exemples à me montrer ?

Je n'aime pas faire de l'a peut prêt, je veux coder de la façon la plus propre possible.

Je vous partage quand même mon code pour les courageux.

Merci de votre aide

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
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
 
 
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        List<Client> listeClients = new List<Client>();
        List<Session> listeSessions = new List<Session>();
 
        ListViewItem clientItem;
        ListViewItem session;
 
        Client selectionClient;
 
        bool login = false;
 
        public Form1()
        {
            InitializeComponent();
 
            // Ajout contrôle du click sur le listView Coordonnées
            ListView_Clients.MouseClick += new MouseEventHandler(this.Item_Client_Click);
        }
 
        private void Bouton_Connexion_Click(object sender, EventArgs e)
        {
            Connexion();
        }
 
        private void Bouton_EncoderClient_Click(object sender, EventArgs e)
        {
            Client_Encoder();
        }
 
        private void Bouton_SupprimerClient_Click(object sender, EventArgs e)
        {
            Client_Supprimer();
        }
 
        private void Bouton_AjouterSession_Click(object sender, EventArgs e)
        {
            Session_Ajouter();
        }
 
        private void Bouton_SupprimerSession_Click(object sender, EventArgs e)
        {
            Session_Supprimer();
        }
 
        private void Connexion()
        {
            string utilisateur = user.Text;
            string mot2passe = password.Text;
 
            if (utilisateur == "yannick")
            {
                if (mot2passe == "score16")
                {
                    login = true;
                    labelConnecte.Text = "Connecté";
                    labelConnecte.ForeColor = System.Drawing.Color.Green;
                    ChargerDonnees();
                    Client_RafraichirListView();
                }
                else
                {
                    MessageBox.Show("Mot de passe incorrect", "Erreur connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Nom d'utilisateur incorrect", "Erreur connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
 
        }
 
        private void Client_Encoder()
        {
            // Récupère les données des champs
            string blaze = BoxBlaze.Text;
            string nom = BoxNom.Text;
            string prenom = BoxPrenom.Text;
            string telephone = BoxTelephone.Text;
            string email = BoxEmail.Text;
            string commentaire = BoxCommentaire.Text;
 
            // Si au moins le champs Blaze est rempli, execute l'encodage.
            if (blaze != "")
            {
                // Reset les champs
                BoxBlaze.ResetText();
                BoxNom.ResetText();
                BoxPrenom.ResetText();
                BoxTelephone.ResetText();
                BoxEmail.ResetText();
                BoxCommentaire.ResetText();
 
                // Crée un objet client avec les infos récupérés
                listeClients.Add(new Client(blaze, nom, prenom, telephone, email, commentaire));
 
                // Crée/Rafraichi le listView des clients
                Client_RafraichirListView();
 
                // Sauvegarde les modifications (il faut etre loggé)
                if (login) SauvegarderDonnees();
 
            }
            else
            {
                MessageBox.Show("Veuillez indiquer un Blaze", "Champs manquant", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
 
        }
 
        private void Client_Supprimer()
        {
            // Vérifie qu'au moins un item est sélectionné
            if (ListView_Clients.SelectedItems.Count > 0) { 
 
                // récupère l'item sélectionné
                string clientName = ListView_Clients.SelectedItems[0].Text;
 
                // retrouve à quel objet il appartient
                selectionClient = listeClients.Find(a => a.blaze.Contains(clientName));
 
                string message = "Voulez-vous vraiment supprimer " + selectionClient.blaze + " ?";
 
                DialogResult fenetreConfirmation = MessageBox.Show(message, "Avertissement", MessageBoxButtons.YesNo);
 
                if (fenetreConfirmation == DialogResult.Yes)
                { 
                    // Supprime l'objet client
                    listeClients.Remove(selectionClient);
 
                    // On rafraichi la liste
                    Client_RafraichirListView();
 
                    // Sauvegarde les modifications (il faut etre loggé)
                    if (login) SauvegarderDonnees();
 
                }
 
            }
 
        }
 
        private void Client_RafraichirListView()
        {
            // Remet la liste à 0
            ListView_Clients.Items.Clear();
 
            foreach(Client _client in listeClients)
            {
                // Défini un nouvel Item
                clientItem = new ListViewItem();
 
                // Défini le contenu des colones de l'item
                clientItem.Text = _client.blaze;
                clientItem.SubItems.Add(_client.nom);
                clientItem.SubItems.Add(_client.prenom);
                clientItem.SubItems.Add(_client.telephone);
                clientItem.SubItems.Add(_client.email);
                clientItem.SubItems.Add(_client.commentaire);
 
                // Ajoute l'item à la listView
                ListView_Clients.Items.Add(clientItem);
            }
        }
 
        private void Item_Client_Click(object sender, MouseEventArgs e)
        {
            // Récupérer le blaze de l'item sélectionné
            // On fait une recherche dans notre liste avec le blaze pour récupérer l'objet concordant
 
            string clientName = ListView_Clients.SelectedItems[0].Text;
            selectionClient = listeClients.Find(a => a.blaze.Contains(clientName));
 
            // Effectuer une recherche avec le blaze de cet index
            Session_RafraichirListView();
        }
 
        private void Session_RafraichirListView()
        {
            // Efface la liste car nous allons la recréer
            ListView_Sessions.Items.Clear();
 
            if (selectionClient.listeSessions.Count > 0)
            {
                foreach (Session s in selectionClient.listeSessions)
                {
                    // Instancie un item
                    session = new ListViewItem();
 
                    session.Text = s.date;
                    session.SubItems.Add(s.duree + " min");
                    session.SubItems.Add(s.tarif + " €");
                    session.SubItems.Add(s.commentaire);
 
                    // Ajoute l'item à la liste
                    ListView_Sessions.Items.Add(session);
                }
            }
        }
 
        private void Session_Ajouter()
        {
            // Vérifie que l'item existe pour ne pas provoquer d'erreur
            if (ListView_Clients.SelectedItems.Count > 0)
            {
                // Récupère les champs
                string date = DateSession.Text;
                string heure = HeureSession.Text;
                string duree = DureeSession.Text;
                string tarif = TarifSession.Text;
                string commentaire = CommentaireSession.Text;
 
                if (date != "" && heure != "" && duree != "" && tarif != "")
                {
                    // Récupérer le blaze de l'item sélectionné
                    // On fait une recherche dans notre liste avec le blaze pour récupérer l'objet concordant
 
                    string clientName = ListView_Clients.SelectedItems[0].Text;
                    selectionClient = listeClients.Find(a => a.blaze.Contains(clientName));
 
                    selectionClient.listeSessions.Add(new Session(date + " à " + heure , heure, duree, tarif, commentaire));
 
                    Session_RafraichirListView();
 
                    HeureSession.ResetText();
                    DureeSession.ResetText();
                    TarifSession.ResetText();
                    CommentaireSession.ResetText();
 
                    // Sauvegarde les modifications (il faut etre loggé)
                    if (login) SauvegarderDonnees();
 
                }
                else
                {
                    MessageBox.Show("Veuillez remplir tous les champs svp", "Champs manquant", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
 
            }
        }
 
        private void Session_Supprimer()
        {
            if (ListView_Sessions.SelectedItems.Count > 0)
            {
                string sessionDate = ListView_Sessions.SelectedItems[0].Text;
 
                MessageBox.Show(sessionDate.ToString());
 
                Session selectionSession = selectionClient.listeSessions.Find(s => s.date.Contains(sessionDate));
 
                selectionClient.listeSessions.Remove(selectionSession);
                Session_RafraichirListView();
 
                // Sauvegarde les modifications (il faut etre loggé)
                if (login) SauvegarderDonnees();
            }
        }
 
        private void SauvegarderDonnees()
        {
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, listeClients);
            stream.Close();
        }
 
        private void ChargerDonnees()
        {
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream("MyFile.bin", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
 
            // Vérifie que le flux n'est pas vide (en cas de création de fichier)
            if (stream.Length > 0)
            {
                listeClients = (List<Client>)formatter.Deserialize(stream);
            }
 
            stream.Close();
        }
 
    }
}
Nom : GestionnaireClient.png
Affichages : 187
Taille : 75,4 Ko