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

  1. #1
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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 sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    avril 2007
    Messages
    13 945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : avril 2007
    Messages : 13 945
    Points : 24 617
    Points
    24 617
    Par défaut
    ne pas travailler avec les selectedindex mais les selecteditem
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    décembre 2003
    Messages
    1 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 875
    Points : 2 784
    Points
    2 784
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    Expert confirmé
    Inscrit en
    avril 2008
    Messages
    2 530
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations forums :
    Inscription : avril 2008
    Messages : 2 530
    Points : 4 316
    Points
    4 316
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    Par défaut
    Et bien c'est semble t'il exactement ce qu'il me faut.
    Reste pour moi à comprendre son utilisation et l'insérer dans mon code.

    Merci beaucoup Mabrouki

  8. #8
    Expert confirmé
    Inscrit en
    avril 2008
    Messages
    2 530
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations forums :
    Inscription : avril 2008
    Messages : 2 530
    Points : 4 316
    Points
    4 316
    Par défaut
    Bonjour
    Pour comment l'utiliser voici un code complet titré de la SDK (MSDN Lib fr):
    code behind.cs du class Data:
    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
    using System;
    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Data;
    using System.Windows.Input;
    using System.Collections.ObjectModel;
     
    namespace SDKSample
    {
      // Create the collection of Order objects
      public class Orders: ObservableCollection<Order>
      {
        public Order o1 = new Order(1001, 5682, "Blue Sweater", 44, "Yes", new DateTime(2003, 1, 23), new DateTime(2003, 2, 4));
        public Order o2 = new Order(1002, 2211, "Gray Jacket Long", 181, "No", new DateTime(2003, 2, 14));
        public Order o3 = new Order(1003, 5682, "Brown Pant W", 02, "Yes", new DateTime(2002, 12, 20), new DateTime(2003, 1, 13));
        public Order o4 = new Order(1004, 3143, "Orange T-shirt", 205, "No", new DateTime(2003, 1, 28));
        public Orders():base()
      	{
      		Add(o1);
      		Add(o2);
      		Add(o3);
      		Add(o4);
      	}
      }
     
      public class Order : INotifyPropertyChanged
      {
        private int _order;
        private int _customer;
        private string _name;
        private int _id;
        private string _filled;
        private DateTime _orderdate;
        private DateTime _datefilled;
     
        public int OrderItem
        {
          get{ return _order;}
          set{ _order=value; OnPropertyChanged("OrderItem");}
        }
        public int Customer
        {
          get{ return _customer;}
          set{_customer=value; OnPropertyChanged("Customer");}
        }
        public string Name
        {
          get{ return _name;}
          set{_name=value; OnPropertyChanged("Name");}
        }
        public int Id
        {
          get{ return _id;}
          set{_id=value; OnPropertyChanged("Id");}
        }
        public string Filled
        {
          get{ return _filled;}
          set{ _filled=value; OnPropertyChanged("Filled");}
        }
        public DateTime OrderDate
        {
          get{ return _orderdate;}
          set{ _orderdate=value; OnPropertyChanged("OrderDate");}
        }
        public DateTime DateFilled
        {
          get{ return _datefilled;}
          set{ _datefilled=value; OnPropertyChanged("DateFilled");}
        }
        public Order(int _order, int _customer, string _name, int _id, string _filled, DateTime _orderdate, DateTime _datefilled)
        {
          this.OrderItem = _order;
          this.Customer = _customer;
          this.Name  = _name;
          this.Id = _id;
          this.Filled = _filled;
          this.OrderDate = _orderdate;
          this.DateFilled = _datefilled;
        }
        public Order(int _order, int _customer, string _name, int _id, string _filled, DateTime _orderdate)
        {
          this.OrderItem = _order;
          this.Customer = _customer;
          this.Name  = _name;
          this.Id = _id;
          this.Filled = _filled;
          this.OrderDate = _orderdate;
        }
     
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(String info)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(info));
        }
      }
    }
    code xaml c'est un Page.xaml reduit à un DockPanel:
    Code XAML : 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
    <DockPanel
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="SDKSample.SortFilter"
      xmlns:source="clr-namespace:SDKSample"
      Name="rootElement"
      DataContextChanged="StartHere" Height="400">
      <DockPanel.Resources>
        <source:Orders x:Key="myDataSource"/>
     
        <DataTemplate x:Key="orderCells">
          <Grid Width="600" Height="15">
            <Grid.ColumnDefinitions>
              <ColumnDefinition/>
              <ColumnDefinition/>
              <ColumnDefinition/>
              <ColumnDefinition/>
              <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="{Binding Path=OrderItem}"/>
            <TextBlock Grid.Column="1" Text="{Binding Path=Customer}"/>
            <TextBlock Grid.Column="2" Text="{Binding Path=Name}"/>
            <TextBlock Grid.Column="3" Text="{Binding Path=Id}"/>
            <TextBlock Grid.Column="4" Text="{Binding Path=Filled}"/>
          </Grid>
        </DataTemplate>
      </DockPanel.Resources>
     
      <DockPanel.DataContext>
        <Binding Source="{StaticResource myDataSource}"/>
      </DockPanel.DataContext>
     
      <Grid Width="600" DockPanel.Dock="Top">
        <Grid.ColumnDefinitions>
          <ColumnDefinition/>
          <ColumnDefinition/>
          <ColumnDefinition/>
          <ColumnDefinition/>
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition/>
          <RowDefinition/>
          <RowDefinition Height="100"/>
        </Grid.RowDefinitions>
        <TextBlock FontWeight="Bold" Grid.Row="0" Grid.ColumnSpan="5">Click a column button to sort the list</TextBlock>
        <Button Grid.Row="1" Grid.Column="0" Name="orderButton" Content="Order" Click="OnClick"/>
        <Button Grid.Row="1" Grid.Column="1" Name="customerButton" Content="Customer" Click="OnClick"/>
        <Button Grid.Row="1" Grid.Column="2" Name="nameButton" Content="Name" Click="OnClick"/>
        <Button Grid.Row="1" Grid.Column="3" Name="idButton" Content="ID" Click="OnClick"/>
        <Button Grid.Row="1" Grid.Column="4" Name="filledButton" Content="Filled?" Click="OnClick"/>
        <ListBox Grid.Row="2" Grid.ColumnSpan="5" Name="myListBox"
                 ItemsSource="{Binding Source={StaticResource myDataSource}}"
                 ItemTemplate="{StaticResource orderCells}"
                 IsSynchronizedWithCurrentItem="True"
                 ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
      </Grid>
     
      <Border BorderBrush="Aqua" Margin="100,40,100,40" BorderThickness="3">
        <Grid Width="450" Height="100" Margin="0,10,0,0" DockPanel.Dock="Top">
          <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition Height="20"/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <TextBlock Foreground="Red" Grid.Row="0" Name="feedbackText"></TextBlock>
          <TextBlock Grid.Row="1" Grid.ColumnSpan="4">Click Next/Previous to Browse. Click Show to Filter</TextBlock>
          <Button Grid.Row="2" Grid.Column="0" Name="Previous" Click="OnBrowse">Previous</Button>
          <Button Grid.Row="2" Grid.Column="1" Name="Next" Click="OnBrowse">Next</Button>
          <Button Grid.Row="2" Grid.Column="2" Name="Filter" Click="OnFilter">Show only Unfilled</Button>
          <Button Grid.Row="2" Grid.Column="3" Name="Unfilter" Click="OnFilter">Show all</Button>
          <TextBlock Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2">Order Number:</TextBlock>
          <TextBlock Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" Name="ViewOrder" Text="{Binding Path=OrderItem}"/>
          <TextBlock Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2">Customer ID:</TextBlock>
          <TextBlock Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2" Name="ViewCustomer" Text="{Binding Path=Customer}"/>
          <TextBlock Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2">Order Date:</TextBlock>
          <TextBlock Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="2" Name="ViewOrderDate" Text="{Binding Path=OrderDate}"/>
          <TextBlock Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2">Filled Date:</TextBlock>
          <TextBlock Grid.Row="6" Grid.Column="1" Grid.ColumnSpan="2" Name="ViewDateFilled" Text="{Binding Path=DateFilled}"/>
        </Grid>
      </Border>
    </DockPanel>
    code behind.cs du page.xaml:
    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
    //------------------------------------------------------------------------------
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Data;
    using System.Windows.Input;
    using SDKSample;
     
    namespace SDKSample
    {
      public partial class SortFilter
      {
        public bool Contains(object de)
        {
            Order order = de as Order;
            //Return members whose Orders have not been filled
            return(order.Filled== "No");
        }
     
        public ListCollectionView myCollectionView;
     
        // Object o keeps the currency for the table
        public SDKSample.Order o;
     
        public void StartHere(Object sender, DependencyPropertyChangedEventArgs args)
        {
          myCollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(rootElement.DataContext);
        }
     
        private void OnClick(Object sender, RoutedEventArgs args)
        {
          Button button = sender as Button;
          //Sort the data based on the column selected
          myCollectionView.SortDescriptions.Clear();
          switch(button.Name.ToString())
          {
            case "orderButton":
              myCollectionView.SortDescriptions.Add(new SortDescription("OrderItem",
                  ListSortDirection.Ascending));
              break;
            case "customerButton":
              myCollectionView.SortDescriptions.Add(new SortDescription("Customer",
                  ListSortDirection.Ascending));
              break;
            case "nameButton":
              myCollectionView.SortDescriptions.Add(new SortDescription("Name",
                  ListSortDirection.Ascending));
              break;
            case "idButton":
              myCollectionView.SortDescriptions.Add(new SortDescription("Id",
                  ListSortDirection.Ascending));
              break;
            case "filledButton":
              myCollectionView.SortDescriptions.Add(new SortDescription("Filled",
                  ListSortDirection.Ascending));
              break;
          }
        }
     
     
        //OnBrowse is called whenever the Next or Previous buttons
        //are clicked to change the currency
        private void OnBrowse(Object sender, RoutedEventArgs args)
        {
          Button b = sender as Button;
          switch(b.Name)
          {
            case "Previous":
              if(myCollectionView.MoveCurrentToPrevious())
              {
                feedbackText.Text = "";
                o = myCollectionView.CurrentItem as Order;
              }
              else
              {
                myCollectionView.MoveCurrentToFirst();
                feedbackText.Text = "At first record";
              }
              break;
            case "Next":
              if (myCollectionView.MoveCurrentToNext())
              {
                feedbackText.Text = "";
                o =  myCollectionView.CurrentItem as Order;
              }
              else
              {
                myCollectionView.MoveCurrentToLast();
                feedbackText.Text = "At last record";
              }
              break;
          }
        }
     
        //OnButton is called whenever the Next or Previous buttons
        //are clicked to change the currency
        private void OnFilter(Object sender, RoutedEventArgs args)
        {
          Button b = sender as Button;
          switch(b.Name)
          {
            case "Filter":
              myCollectionView.Filter = new Predicate<object>(Contains);
              break;
            case "Unfilter":
              myCollectionView.Filter = null;
              break;
          }
        }
      }
    }
    Pour ton cas de Sort par Nom & Ville,tu devra équiper ton class Data de 2 props clr suplementaires car la méthode Sort exige un nom de prop Clr.:
    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
      private string nomCodepostal;
            public string NomCodePostal
            {
                get { return this.Nom+this.CodePostal; }
                set { nomCodepostal = this.Nom + this.CodePostal;
                    NotifyPropertyChanged("NomCodePostal"); }
            }
            private string nomVille;
            public string NomVille
            {
                get { return this.Nom + this.Ville; }
                set
                {
                    nomVille = this.Nom + this.Ville;
                    NotifyPropertyChanged("NomVille");
                }
            }
    De même pour le filtrage par Nom ou Ville, il te faudra probablement 2 ComboBoxes bindés à ta collection source et dont les SelectedValuePath seraient Nom & Ville .

    Chaque SelectedItem doit être caste sur le champ Nom ou Ville et cette valeur doit être injecté dans le bouton FiltreNom ou FiltreVille selon le cas .

    Pour la suppression, 1 bouton suffit pour "détruire" le SelectedItem.
    Pour l'ajout,modif il te faudra 4 TextBlocs probablement qui sont synchronisés avec le ListView( IsSynchronizedWithCurrentItem="true" ) & un bouton Valider.
    Car celui ci (le ListView) est un Control prévu uniquement pour l'affichage.
    bon code.

  9. #9
    Expert confirmé
    Inscrit en
    avril 2008
    Messages
    2 530
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations forums :
    Inscription : avril 2008
    Messages : 2 530
    Points : 4 316
    Points
    4 316
    Par défaut
    re-bonjour
    En addenda ,j'ai oublié de mentionner un cousin Xaml de CollectionView désigné par le doux nom de "CollectionViewSource".
    Utilisable uniquement en xaml.

  10. #10
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    décembre 2003
    Messages
    1 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 875
    Points : 2 784
    Points
    2 784
    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