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

C# Discussion :

ICollectionview valeurs de filtres multiples


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 56
    Points : 43
    Points
    43
    Par défaut ICollectionview valeurs de filtres multiples
    Bonjour,

    J'ai une collection d'objets comme ci-dessous (exemple)

    (Type, Quantité, Provenance)
    Banane, 12, Afrique
    Pomme, 2, France
    Poire, 20, France
    Banane, 20, Amérique

    Je peux filtrer ma collection, via un combobox, par type, quantité et provenance.
    Par contre je ne peux avoir qu'une seule valeur de filtre. Exemple : que les fruits de type "pomme", ou que les fruits de provenance "France".

    Ce que j'aimerais ajouter c'est la possibilité d'avoir les fruits de type banane ET pomme en même temps.

    J'utilise le code suivant pour filtrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ListeDesFruits.Filter = item =>
    {
      if (item == null) return false;
     
      PropertyInfo info = item.GetType().GetProperty(choix); //type, quantité ou provenance
     
      if (info == null) return false;   
     
      return info.GetValue(item,null).ToString().Contains(valeurDuChoix);
     
    };
    Est-ce que quelqu'un pourrait m'aider à trouver la solution ?
    Merci d'avance.

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Quelque chose comme ça ?

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var value = info.GetValue(item,null).ToString();
     
    return value.Contains(valeurduchoix1) ¦¦ value.Contains(valeurduchoix2);
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 56
    Points : 43
    Points
    43
    Par défaut
    Merci pour cette réponse.

    Toute mes excuses, ce que je n'ai effectivement pas précisé, c'est que je ne connais pas à l'avance le nombre de choix que l'utilisateur va faire.

    Pour reprendre mon exemple simple, l'utilisateur pourrait sélectionner "pomme, poire, banane" comme valeur du filtre pour le type. (le nombre de choix possible est dynamique)

    Je ne vois alors pas comment appliquer votre méthode qui fonctionne très probablement.
    Après ce n'est peut-être pas la méthode du filtrage que je dois utiliser, mais autre chose. Je suis ouvert à tout autre proposition pour arriver au résultat voulu

  4. #4
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Points : 152
    Points
    152
    Par défaut
    Salut,

    Tu peux mettre en place ce mécanisme qui permet de mettre en place des règles de filtrage très facilement :

    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
     
            public ObservableCollection<Operation> Operations
            {
                get { return GetFilteredOperations(FilteredOperations); }
            }
     
            public ObservableCollection<Operation> FilteredOperations { get; set; }
     
            private string _operationNameFilter;
            public string OperationNameFilter
            {
                get
                {
                    return _operationNameFilter;
                }
                set
                {
                    _operationNameFilter = value;
                    RaisePropertyChanged("OperationNameFilter");
                    RaisePropertyChanged("Operations");
                }
            }
     
            public OperationListViewModel()
            {
                FilteredOperations = new ObservableCollection<Operation>();
                // TODO : Chargement des opérations
     
                // Filters
                var sites = OperationUIService.LoadCountries();
                SelectedSitesFilter = new List<SiteViewModel>();
                sites.ForEach(s =>
                                  {
                                      var site = new SiteViewModel {CurrentSite = s};
                                      site.PropertyChanged += SitePropertyChanged;
                                      SelectedSitesFilter.Add(site);
                                  });
     
                OperationNameFilter = string.Empty;
            }
     
            void SitePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
            {
                RaisePropertyChanged("Operations");
            }
     
            /// <summary>
            /// Filter operations by name, code, ...
            /// </summary>
            /// <param name="listBase"></param>
            /// <returns></returns>
            private ObservableCollection<Operation> GetFilteredOperations(IEnumerable<Operation> listBase)
            {
                var filteredOperation = new ObservableCollection<Operation>();
     
                var list = from p in listBase
                           where
                               FilterNameMethod(p, OperationNameFilter) &&
                               FilterSitesMethod(p, SelectedSitesFilter.ToList())
                           select p;
     
                foreach (var u in list)
                    filteredOperation.Add(u);
     
                return filteredOperation;
            }
     
            /// <summary>
            /// Filter by name
            /// </summary>
            /// <param name="operation"></param>
            /// <param name="name"></param>
            /// <returns></returns>
            public static bool FilterNameMethod(Operation operation, string name)
            {
                if (operation == null) return false;
                if (name == null) return false;
                if (name.Equals(string.Empty)) return true;
                return (operation.LongName.ToUpper().StartsWith(name.ToUpper()));
            }
     
            /// <summary>
            /// Filter by site
            /// </summary>
            /// <param name="operation"></param>
            /// <param name="sites"></param>
            /// <returns></returns>
            public static bool FilterSitesMethod(Operation operation, List<SiteViewModel> sites)
            {
                var activeSites = sites.Where(s => s.IsActive);
                foreach (var site in activeSites)
                {
                    // TODO
                }
                return true;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <StackPanel Orientation="Horizontal">
                    <TextBox Text="{Binding OperationNameFilter, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Width="352" />
                    <ComboBox ItemsSource="{Binding SelectedSitesFilter}" Width="202">
                       ...
                    </ComboBox>
                </StackPanel>
     
                <ListView ItemsSource="{Binding Operations}">
                ...
                </ListView>
    Attention, ici on n'utilise plus la fonction Filter de la ListView mais des champs type TextBox, ComboBox quleque part dans ta vue.
    Cette réponse vous a aidé ?
    Problème résolu ?

Discussions similaires

  1. [A-02] Fonction OuvrirUnFichier avec filtre multiple
    Par mbasroger dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/03/2009, 12h16
  2. Récupérer valeurs listbox choix multiple
    Par biquet52 dans le forum IHM
    Réponses: 3
    Dernier message: 11/09/2008, 09h07
  3. DirectoryInfo.GetFiles() et filtres multiples
    Par PoZZyX dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/10/2007, 22h19
  4. permutation valeurs deux select multiple
    Par nadines dans le forum Struts 1
    Réponses: 9
    Dernier message: 16/02/2007, 17h25
  5. recuperer valeur liste choix multiple
    Par gabychon dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/06/2005, 11h47

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