Bonjour à tous,
J'ai actuellement un listview qui contient une liste de clients.
Sur ce listview je permets à l'utilisateur de faire des recherches ou par le nom et le prenom, ou part la ville et le code postal.
Voici le code des différentes méthodes qui effectuent l'opération (Elles ne sont pas de moi.) :
Tout ce code fonctionne bien mais j'ai un soucis que je vais essayer de vous exposer.
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 private void OnFilterChanged(object sender, TextChangedEventArgs e) { triClient = new ObservableCollection<Client>(clients); listClient.ItemsSource = triClient; var filtered = clients.Where(Client => Filter(Client)); Remove_NonMatching(filtered); AddBack_Client(filtered); } private bool Filter(Client client) { return client.nom.Contains(textChercheNom.Text, StringComparison.InvariantCultureIgnoreCase) && client.prenom.Contains(textCherchePrenom.Text, StringComparison.InvariantCultureIgnoreCase) && client.adresse.Contains(textChercheAdresse.Text, StringComparison.InvariantCultureIgnoreCase) && client.codePostal.Contains(textChercheCodePostal.Text, StringComparison.InvariantCultureIgnoreCase) && client.ville.Contains(textChercheVille.Text, StringComparison.InvariantCultureIgnoreCase); } private void Remove_NonMatching(IEnumerable<Client> filterdData) { for (int i = triClient.Count - 1;i >=0; i--) { var item = triClient[i]; if(!filterdData.Contains(item)) { triClient.Remove(item); } } } private void AddBack_Client(IEnumerable<Client> filteredData) { foreach (var item in filteredData) { if (!triClient.Contains(item)) { triClient.Add(item); } } }
J'ai une procédure qui me permet de modifier un client par exemple :
Ca fonctionne bien avec la listview remplit par l'observableCollection "clients"
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 private async void btnEditerClient_Click(object sender, RoutedEventArgs e) { string statut; if (indexSelectionClient != -1) { if (textNom.Text != "" && textPrenom.Text != "" && textAdresse.Text != "" && textCodePostal.Text != "" && textVille.Text != "" && textTelephone.Text !="" && chkStatutPerso.IsChecked == false || chkStatutPro.IsChecked == false) { if (chkStatutPerso.IsChecked == true) { statut = "Particulier"; } else { statut = "Professionnel"; } try { Client modificationClient = new Client() { nom = textNom.Text, prenom = textPrenom.Text, adresse = textAdresse.Text, codePostal = textCodePostal.Text, ville = textVille.Text, telephone = textTelephone.Text, statut = statut, interventionList = clients[indexSelectionClient].interventionList }; clients.RemoveAt(indexSelectionClient); clients.Insert(indexSelectionClient, modificationClient); clients = new ObservableCollection<Client>(clients.OrderBy(p => p.nom)); listClient.ItemsSource = null; listClient.ItemsSource = clients; SauvegarderClient(); textNom.Text = ""; textPrenom.Text = ""; textAdresse.Text = ""; textCodePostal.Text = ""; textVille.Text = ""; textTelephone.Text = ""; chkStatutPerso.IsChecked = false; chkStatutPro.IsChecked = false; btnEditerClient.Visibility = Visibility.Collapsed; btnValiderClient.Visibility = Visibility.Visible; } catch (Exception) { var dialog = new Windows.UI.Popups.MessageDialog("Impossible de modifier le client."); await (dialog.ShowAsync()); } } else { var dialog = new Windows.UI.Popups.MessageDialog("Remplissez tous les champs."); await (dialog.ShowAsync()); } } else { var dialog = new Windows.UI.Popups.MessageDialog("Selectionnez un client à modifier"); await (dialog.ShowAsync()); } }
Quand une recherche est en cours la listview est remplit par une autre observableCollection appelée "triClient".
Du coup si je modifie le client que l'on a recherché, celui ci a un numéro d'index propre à l'observableCollection "triClient" par exemple 3 qui n'est pas celui qu'il possède en temps normal dans l'observableCollection "clients" par exemple 12
Evidemment vous vous en doutez la modification est faite sur le client avec l'index 3 mais dans l'observableCollection "clients". Ce client n'est pas celui que l'on voulait modifier.
Alors je me demande comment éviter ce petit soucis.
Suis je obligé de faire une recherche du client (recherché) dans l'observableCollection "clients" et faire les modifications une fois trouvé ?
Ou alors existe t'il une façon de faire que je ne voit pas ?
Merci pour votre temps.
Cordialement.
Partager