IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Windows Discussion :

tri d'une listview et modification d'un listviewitem


Sujet :

Développement Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Autodidacte débutant
    Inscrit en
    Mai 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 55
    Par défaut tri d'une listview et modification d'un listviewitem
    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.) :

    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);
                    }
                }
            }
    Tout ce code fonctionne bien mais j'ai un soucis que je vais essayer de vous exposer.

    J'ai une procédure qui me permet de modifier un client par exemple :

    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());
                }
     
            }
    Ca fonctionne bien avec la listview remplit par l'observableCollection "clients"

    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.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    ne pas travailler avec les selectedindex mais les selecteditem
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Homme Profil pro
    Autodidacte débutant
    Inscrit en
    Mai 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 55
    Par défaut
    Je ne suis pas certain de bien comprendre.
    J'utilise les deux dans mon programme.
    Et pour cette partie du code, j'ai choisi cette méthode car je perds le selectedItem quand je suis dans ma seconde listview. D'où mon choix d'utiliser les index.
    Et pour le problème que j'ai que je choisisse l'un ou l'autre ca ne change rien il me semble. Que ce soit le selectedindex ou le selecteditem, ils seront de toute façon différents entre mes deux collections.

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Si je ne me trompe pas, dans le deuxième code, lors de l'édition d'un client, celui-ci est supprimé puis ajouté (clients.RemoveAt/clients.Insert). Cela me paraît étrange.

    Par exemple si lors de l'édition du client, tous les paramètres sont changés, et qu'ils correspondent à un autre client existant, est-ce géré ?

    De ce que je comprends, il ne devrait y avoir qu'une seule observableCollection. S'il y a 2 ListViews, ce devrait être avec la même collection, juste triée différemment.

    Un code minimaliste démontrant le problème serait le bienvenu.

  5. #5
    Membre actif
    Homme Profil pro
    Autodidacte débutant
    Inscrit en
    Mai 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 55
    Par défaut
    Merci moldavi,

    Merci de t’intéresser à mon problème et merci de m'apporter une vision plus professionnelle que la mienne.
    Je me rend compte qu'il y a des choses étranges dans mon code.
    Je ne gere pas en effet le doublon lors du modification.
    Et je vais tenter de faire le tri sur la meme observableCollection.
    Mais je me pose toujours la question suivante :
    Si je fais un tri sur cette observablecollection grace au code donné dans mon post initial. Les résultats qui s'afficheront garderont ils l'index qu'ils possèdent avant le tri ? Ou auront ils un nouvel index en rapport a leur nouvelle place dans la collection ?

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    Citation Envoyé par Ledidic Voir le message
    Merci moldavi,

    Merci de t’intéresser à mon problème et merci de m'apporter une vision plus professionnelle que la mienne.
    Je me rend compte qu'il y a des choses étranges dans mon code.
    Je ne gere pas en effet le doublon lors du modification.
    Et je vais tenter de faire le tri sur la meme observableCollection.
    Mais je me pose toujours la question suivante :
    Si je fais un tri sur cette observablecollection grace au code donné dans mon post initial. Les résultats qui s'afficheront garderont ils l'index qu'ils possèdent avant le tri ? Ou auront ils un nouvel index en rapport a leur nouvelle place dans la collection ?
    L'ajout,modif ou suppression ne doivent se faire que sur la collection source
    code source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    myCollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(rootElement.DataContext);
    Toute collection triée ou filtrée n'est qu'une vue (de l'esprit j'allais dire) posée sur la collection source.
    Il convient d'utiliser les fonctions de tri et de filtrage de l'api CollectionView
    Une collection triée ou filtrée ne doit servir qu'aux seules fins d'affichage .

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par Ledidic Voir le message
    Si je fais un tri sur cette observablecollection grace au code donné dans mon post initial. Les résultats qui s'afficheront garderont ils l'index qu'ils possèdent avant le tri ? Ou auront ils un nouvel index en rapport a leur nouvelle place dans la collection ?
    Normalement, il n'y a aucune raison pour qu'un tri sur une listview, qui sera une vue, modifie l'arrangement d'une observablecollection. Et donc les index de cette liste. C'est juste un binding.

    Néanmoins je ne peux pas être affirmatif sur ce point, par que je n'ai jamais expérimenté. C'est pour cette raison qu'un code minimaliste devrait permettre de s'en assurer.

    Mon approche serait simple. Je fais un mini programme, avec une observablecollection et 2 listviews bindées à cette même collection. Je trie différemment les 2 listviews, et je vérifie que observablecollection n'a pas changé.

    Il semble que l'approche de MABROUKI aille dans ce sens.

Discussions similaires

  1. [XL-2010] Selectionner un item d'une ListView pour modification utilisateur
    Par dan34 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/07/2016, 09h32
  2. [Débutant] Problème de tri dans une listview
    Par Jean-Luc80 dans le forum VB.NET
    Réponses: 10
    Dernier message: 08/09/2013, 18h43
  3. Fonction de tri dans une ListView
    Par megamario dans le forum VB.NET
    Réponses: 4
    Dernier message: 16/06/2010, 16h32
  4. Réponses: 3
    Dernier message: 07/05/2008, 11h03
  5. Tri dans une ListView
    Par essadiki_ista dans le forum VB.NET
    Réponses: 6
    Dernier message: 02/06/2007, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo