Faire une recherche dans une liste pour afficher des éléments précis
Résolu/Fermé
Hamster18
Messages postés
177
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
22 janvier 2024
-
21 mai 2019 à 20:22
Utilisateur anonyme - 27 mai 2019 à 20:14
Utilisateur anonyme - 27 mai 2019 à 20:14
A voir également:
- Faire une recherche dans une liste pour afficher des éléments précis
- Liste déroulante excel - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Comment faire une recherche à partir d'une photo - Guide
- Liste déroulante en cascade - Guide
- Gertrude a préparé la liste des affaires à prendre pour l'excursion. juliette a modifié cette liste en utilisant le mode suivi des modifications proposé par le traitement de texte. - Guide
5 réponses
Utilisateur anonyme
Modifié le 21 mai 2019 à 20:58
Modifié le 21 mai 2019 à 20:58
Bonsoir
Y'a plein de chose qui ne vont pas dans tes codes.
ici
A chaque fois que tu veux accéder à ta liste tu en crées une nouvelle, ça perd du temps et ça "bouffe" des ressources, autant la créer une fois pour toute.
Un truc du genre
Là ta liste est crée une seule fois (un seul appel à new à la construction de ton instance).
Toujours dans ce bout de code, construire des string avec des + est fait une opération de concaténation, donc du temps et des ressources, quand on travaille avec des variables OK, mais directement avec du texte, c'est gâcher...
Enfin ta liste en dur dans le code, c'est pas terrible, si tu veux ajouter une série, faut recompiler.
Tu devrais (dois même) utiliser un fichier, une base de données, csv, xml, json, "vraie" base de données tu as l'embarras du choix.
Ici tu déclarer un var et tu veux retourner une liste, c'est moyen, pas sûr que ton soucis vienne de là néanmoins ton code à l'air bon à part ce point
Ça pourrait être plus rapide, à écrire et à exécuter avec une requête Linq
Pour ton genre, à la place d'un int, tu pourrais utiliser un enum, ça rend le code plus lisible.
Y'a plein de chose qui ne vont pas dans tes codes.
ici
public List<Serie> ListSerie { get { return GetAll(); } } public List<Serie> GetAll() { return new List<Serie>() { new Serie("Grey's Anatomy","27/03/2005",true,1, "Medias/Photos/Serie_Grey-s_anatomy.jpg", 15, "Meredith Grey, fille d'un chirurgien très réputé, commence son internat de première année" + " en médecine chirurgicale dans un hôpital de Seattle. La jeune femme s'efforce de maintenir " + "de bonnes relations avec ses camarades internes, mais dans ce métier difficile la compétition" + " fait rage..."), new Serie("Lucifer", "26/01/2016", false,5, "Medias/Photos/Serie_Lucifer.png", 5, "Lassé et mécontent" + " de sa position de Seigneur des Enfers, Lucifer Morningstar démissionne et abandonne son royaume" + " pour la bouillonnante Los Angeles. Dans la Cité des anges, l'ex maître diabolique est le patron" + " d'un nightclub baptisé Lux."), new Serie("The 100", "19/03/2014",true,4, "Medias/Photos/Serie_The_100.jpg", 3, "Après une apocalypse" + " nucléaire, les 318 survivants se réfugient dans des stations spatiales et parviennent à y vivre et" + " à se reproduire, atteignant le nombre de 4000 ; 97 ans plus tard, une centaine de jeunes délinquants" + " redescendent sur Terre."), new Serie("The Walking Dead", "20/03/2011",true,8, "Medias/Photos/Serie_The_walking_dead.jpg", 9, "Après" + " une apocalypse ayant transformé la quasi-totalité de la population en zombies, un groupe d'hommes et de" + " femmes mené par l'officier Rick Grimes tente de survivre. Ensemble, ils vont devoir tant bien que mal" + " faire face à ce nouveau monde.") }; }
A chaque fois que tu veux accéder à ta liste tu en crées une nouvelle, ça perd du temps et ça "bouffe" des ressources, autant la créer une fois pour toute.
Un truc du genre
public List<Serie> ListSerie { get { mesSeries;} } private List<Serie> mesSeries = new List<Serie>() { new Serie("Grey's Anatomy","27/03/2005",true,1, "Medias/Photos/Serie_Grey-s_anatomy.jpg", 15, "Meredith Grey, fille d'un chirurgien très réputé, commence son internat de première année" + " en médecine chirurgicale dans un hôpital de Seattle. La jeune femme s'efforce de maintenir " + "de bonnes relations avec ses camarades internes, mais dans ce métier difficile la compétition" + " fait rage..."), new Serie("Lucifer", "26/01/2016", false,5, "Medias/Photos/Serie_Lucifer.png", 5, "Lassé et mécontent" + " de sa position de Seigneur des Enfers, Lucifer Morningstar démissionne et abandonne son royaume" + " pour la bouillonnante Los Angeles. Dans la Cité des anges, l'ex maître diabolique est le patron" + " d'un nightclub baptisé Lux."), new Serie("The 100", "19/03/2014",true,4, "Medias/Photos/Serie_The_100.jpg", 3, "Après une apocalypse" + " nucléaire, les 318 survivants se réfugient dans des stations spatiales et parviennent à y vivre et" + " à se reproduire, atteignant le nombre de 4000 ; 97 ans plus tard, une centaine de jeunes délinquants" + " redescendent sur Terre."), new Serie("The Walking Dead", "20/03/2011",true,8, "Medias/Photos/Serie_The_walking_dead.jpg", 9, "Après" + " une apocalypse ayant transformé la quasi-totalité de la population en zombies, un groupe d'hommes et de" + " femmes mené par l'officier Rick Grimes tente de survivre. Ensemble, ils vont devoir tant bien que mal" + " faire face à ce nouveau monde.") }; }
Là ta liste est crée une seule fois (un seul appel à new à la construction de ton instance).
Toujours dans ce bout de code, construire des string avec des + est fait une opération de concaténation, donc du temps et des ressources, quand on travaille avec des variables OK, mais directement avec du texte, c'est gâcher...
"Meredith Grey, fille d'un chirurgien très réputé, commence son internat de première année en médecine chirurgicale dans un hôpital de Seattle. La jeune femme s'efforce de maintenir de bonnes relations avec ses camarades internes, mais dans ce métier difficile la compétition fait rage..."Même résultat, plus rapide, moins de ressources.
Enfin ta liste en dur dans le code, c'est pas terrible, si tu veux ajouter une série, faut recompiler.
Tu devrais (dois même) utiliser un fichier, une base de données, csv, xml, json, "vraie" base de données tu as l'embarras du choix.
Ici tu déclarer un var et tu veux retourner une liste, c'est moyen, pas sûr que ton soucis vienne de là néanmoins ton code à l'air bon à part ce point
public List<Serie> GenreParticulier( int g) { var ListSerieParticuliere =new List<Serie>() for (int i=0; i<ListSerie.Count; i++) { if (ListSerie[i].Genre == g) { ListSerieParticuliere.Add(ListSerie[i]); } } return ListSerieParticuliere; }
Ça pourrait être plus rapide, à écrire et à exécuter avec une requête Linq
public List<Serie> GenreParticulier( int g) { return ListSerie.Where(s => s.Genre == g).ToList(); }
Pour ton genre, à la place d'un int, tu pourrais utiliser un enum, ça rend le code plus lisible.
Utilisateur anonyme
21 mai 2019 à 22:41
21 mai 2019 à 22:41
<ListBox ItemsSource="{Binding SerieParticulier, ElementName=Action}"Pourquoi y a t il un ElementName ici?
Tu es bindé sur un contrôle qui s’appelle Action?
Hamster18
Messages postés
177
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
22 janvier 2024
22 mai 2019 à 08:21
22 mai 2019 à 08:21
C'est le nom de ma window, j'ai fait
x:Name="Action"Dans la balise window de ma page.
Utilisateur anonyme
22 mai 2019 à 08:42
22 mai 2019 à 08:42
Ha, mais le code code que tu as montré plus haut
Nomme la fenêtre GenreAction, tu as 2 fenêtres?
public GenreAction() { InitializeComponent(); }
Nomme la fenêtre GenreAction, tu as 2 fenêtres?
Hamster18
Messages postés
177
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
22 janvier 2024
22 mai 2019 à 13:07
22 mai 2019 à 13:07
Comment ça 2 fenêtres ?
Hamster18
Messages postés
177
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
22 janvier 2024
24 mai 2019 à 00:33
24 mai 2019 à 00:33
Le nom de ma window est "GenreAction" (c'est celui que je lui ai donnée quand j'ai crée ma window), dessus je lui ai rajouter un nom avec
Et ce binding la fonctionne. Je pensais (peut-être à tord) comme je modifie ma liste de serie il faudrait peut être implémenter BiblioSerie par " INotifyPropertyChanged " et mettre la liste en ObservableCollection ?
x:Name="Action"pour dire lors du binding où sont binder les donnée, mais je pense pas que l'erreur vienne de la car j'ai un autre binding sur cette page marquant exactement la même chose
<StackPanel DataContext="{Binding BiblioGenre.ListGenre[0], ElementName=Action}">
Et ce binding la fonctionne. Je pensais (peut-être à tord) comme je modifie ma liste de serie il faudrait peut être implémenter BiblioSerie par " INotifyPropertyChanged " et mettre la liste en ObservableCollection ?
Déjà c'est pas comme ça qu'il faut faire, mais en plus y'a toutes les chances que ce soit ça le problème.
Imagine que je t'écrive une lettre mais que je l'envoie à Cobaye18, un cobaye c'est quasiment pareil qu'un hamster, pourtant la lettre, tu ne la recevras pas.
Il est tard et je suis fatigué, je reviendrais te faire un exemple demain, ou samedi.
Mais afin qu'il soit le plus pertinent possible, peux tu expliquer le résultat que tu souhaites?
Imagine que je t'écrive une lettre mais que je l'envoie à Cobaye18, un cobaye c'est quasiment pareil qu'un hamster, pourtant la lettre, tu ne la recevras pas.
Il est tard et je suis fatigué, je reviendrais te faire un exemple demain, ou samedi.
Mais afin qu'il soit le plus pertinent possible, peux tu expliquer le résultat que tu souhaites?
Utilisateur anonyme
25 mai 2019 à 13:02
25 mai 2019 à 13:02
Bonjour
sans indications de ta part, je fais comme je le sens
Dans un projet de test, j'ai ajouté une fenêtre qui s'appelle GenreAction
XAML
PS le compilateur n'aime pas le commentaire à cet endroit là
Et le code behind
Ensuite un enum, avec une description de chaque valeur
une classe qui permet de binder les descriptions des enums
Puis une classe Série, avec des types cohérent, une date c'est pas un string....
Une classe biblioserie
Modification du code behind
Dans la fenêtre qui appelle GenreAction
Modification du xaml
Ce qui donne
sans indications de ta part, je fais comme je le sens
Dans un projet de test, j'ai ajouté une fenêtre qui s'appelle GenreAction
XAML
<Window x:Class="Test_WPF_Cs.GenreAction" <!--son nom c'est bien "GenreAction"--> xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test_WPF_Cs" mc:Ignorable="d" Title="GenreAction" Height="450" Width="800"> <Grid> </Grid> </Window>
PS le compilateur n'aime pas le commentaire à cet endroit là
Et le code behind
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace Test_WPF_Cs { /// <summary> /// Logique d'interaction pour GenreAction.xaml /// </summary> public partial class GenreAction : Window { public GenreAction() { InitializeComponent(); } } }
Ensuite un enum, avec une description de chaque valeur
public enum Genre { Defaut = 0,//faut toujours mettre une valeur par défaut à 0, car un énum est en fait un int, qui s'initialise à 0 DrameMedical = 1, //j'ai regardé la description de Grey's Anatomy sur allocine ScienceFiction = 4,//ideme avec The 100 Fantastique = 5, //idem avec Lucifer Epouvante = 8,//Idem avec The walking dead Action = 2, //y'avait pas de série Action dans ton exemple alors j'ai choisi 2 }
une classe qui permet de binder les descriptions des enums
/// <summary> /// Permet d'afficher dans un combobox la description d'une énumération /// https://stackoverflow.com/questions/58743/databinding-an-enum-property-to-a-combobox-in-wpf /// </summary> public class EnumerationExtension : MarkupExtension { private Type _enumType; /// <summary> /// Classe permettant de binder facilement les valeurs d'une énumération en affichant la description /// </summary> /// <param name="enumType"></param> public EnumerationExtension(Type enumType) { if (enumType == null) throw new ArgumentNullException("enumType"); EnumType = enumType; } private List<int> valeursExclues = new List<int>(); /// <summary> /// Permet d'exclure des valeurs /// </summary> public string ValeursExclues { set { valeursExclues = value.Split(';').Select(x => Convert.ToInt32(x)).ToList(); } } public Type EnumType { get { return _enumType; } private set { if (_enumType == value) return; var enumType = Nullable.GetUnderlyingType(value) ?? value; if (enumType.IsEnum == false) throw new ArgumentException("Type must be an Enum."); _enumType = value; } } public override object ProvideValue(IServiceProvider serviceProvider) { var enumValues = Enum.GetValues(EnumType); return ( from object enumValue in enumValues where !valeursExclues.Contains((int)enumValue) select new EnumerationMember { Value = enumValue, Description = GetDescription(enumValue) }).ToArray(); } private string GetDescription(object enumValue) { var descriptionAttribute = EnumType .GetField(enumValue.ToString()) .GetCustomAttributes(typeof(DescriptionAttribute), false) .FirstOrDefault() as DescriptionAttribute; return descriptionAttribute != null ? descriptionAttribute.Description : enumValue.ToString(); } public class EnumerationMember { public string Description { get; set; } public object Value { get; set; } } }
Puis une classe Série, avec des types cohérent, une date c'est pas un string....
public class Serie : INotifyPropertyChanged { public Serie(string Nom, DateTime Date_de_sortie, bool En_cours, Genre Genre, string Image, int Nb_saison, string Resume) { this.Nom = Nom; this.DateDeSortie = Date_de_sortie; this.EnCours = En_cours; this.Genre = Genre; this.Images = Image; this.Resume = Resume; this.NbDeSaisons = Nb_saison; } public Serie() { } private string nom; /// <summary> /// Nom de la série /// </summary> public string Nom { get { return nom; } set { if (nom != value) { nom = value; GenerePropertyChanged("Nom"); } } } private DateTime date; /// <summary> /// Date de sortie de la série /// </summary> public DateTime DateDeSortie { get { return date; } set { if (date != value) { date = value; GenerePropertyChanged("DateDeSortie"); } } } private bool enCours; /// <summary> /// Série en cours /// </summary> public bool EnCours { get { return enCours; } set { if (enCours != value) { enCours = value; GenerePropertyChanged("EnCours"); } } } private Genre genre; /// <summary> /// Genre de la série /// </summary> public Genre Genre { get { return genre; } set { if (genre != value) { genre = value; GenerePropertyChanged("Genre"); } } } private string images; /// <summary> /// Chemins des images /// </summary> public string Images { get { return images; } set { if (images != value) { images = value; GenerePropertyChanged("Images"); } } } private string resume; /// <summary> /// Résumé de la série /// </summary> public string Resume { get { return resume; } set { if (resume != value) { resume = value; GenerePropertyChanged("Resume"); } } } private int nbSaisons; /// <summary> /// Nombre de saisons /// </summary> public int NbDeSaisons { get { return nbSaisons; } set { if (nbSaisons != value) { nbSaisons = value; GenerePropertyChanged("NbSaisons"); } } } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; private void GenerePropertyChanged(string Propriete) { if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete)); } #endregion }
Une classe biblioserie
public class BiblioSerie : INotifyPropertyChanged { public List<Serie> ListSerie { get; } = new List<Serie>() { new Serie("Grey's Anatomy", DateTime.Parse("27/03/2005"),true,Genre.DrameMedical, "Medias/Photos/Serie_Grey-s_anatomy.jpg", 15, "Meredith Grey, fille d'un chirurgien très réputé, commence son internat de première année en médecine chirurgicale dans un hôpital de Seattle. La jeune femme s'efforce de maintenir de bonnes relations avec ses camarades internes, mais dans ce métier difficile la compétition fait rage..."), new Serie("Lucifer", DateTime.Parse("26/01/2016"), false,Genre.Fantastique, "Medias/Photos/Serie_Lucifer.png", 5, "Lassé et mécontent de sa position de Seigneur des Enfers, Lucifer Morningstar démissionne et abandonne son royaume pour la bouillonnante Los Angeles. Dans la Cité des anges, l'ex maître diabolique est le patron d'un nightclub baptisé Lux."), new Serie("The 100", DateTime.Parse("19/03/2014"),true,Genre.ScienceFiction, "Medias/Photos/Serie_The_100.jpg", 3, "Après une apocalypse nucléaire, les 318 survivants se réfugient dans des stations spatiales et parviennent à y vivre et à se reproduire, atteignant le nombre de 4000 ; 97 ans plus tard, une centaine de jeunes délinquants redescendent sur Terre."), new Serie("The Walking Dead", DateTime.Parse("20/03/2011"),true,Genre.Epouvante, "Medias/Photos/Serie_The_walking_dead.jpg", 9, "Après une apocalypse ayant transformé la quasi-totalité de la population en zombies, un groupe d'hommes et de femmes mené par l'officier Rick Grimes tente de survivre. Ensemble, ils vont devoir tant bien que mal faire face à ce nouveau monde.") }; private Genre filtre; /// <summary> /// Filtre sur le genre /// </summary> public Genre Filtre { get { return filtre; } set { if (filtre != value) { filtre = value; GenerePropertyChanged("Filtre"); GenerePropertyChanged("SeriesFiltrees");//prévient le binding que cette propriété aussi a changé } } } public List<Serie> SeriesFiltrees { get { return ListSerie.Where(s => s.Genre == filtre).ToList(); } } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; private void GenerePropertyChanged(string Propriete) { if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete)); } #endregion }
Modification du code behind
public partial class GenreAction : Window { BiblioSerie biblioSerie; public GenreAction(BiblioSerie BiblioSerie) { InitializeComponent(); biblioSerie = BiblioSerie;//si tu en as besoin ailleurs dans le code behind this.DataContext = biblioSerie;//le datacontexte de la fenetre est cette instance de BiblioSerie } }
Dans la fenêtre qui appelle GenreAction
BiblioSerie biblioSerie = new BiblioSerie(); GenreAction genreAction = new GenreAction(biblioSerie); genreAction.Show();
Modification du xaml
<Window x:Class="Test_WPF_Cs.GenreAction" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test_WPF_Cs" mc:Ignorable="d" Title="GenreAction" Height="450" Width="800" DataContext="{Binding}"> <!--là on prévient et on force le fait que la fenêtre est bindée--> <Grid DataContext="{Binding .}"> <!--là on spécifie au grid que son datacontexte est le même que celui du contrôle qui le contient--> <TextBlock Text="Toutes les séries" Margin="346,20,341,357"/> <ListBox DataContext="{Binding .}" ItemsSource="{Binding ListSerie}" Margin="0,40,0,252"> <!--là on spécifie à la ListBox que son datacontexte est le même que celui du contrôle qui le contient, et que sa source d'items est la propriété ListSerie--> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Nom}" Margin="1"/> <TextBlock Text="{Binding DateDeSortie, StringFormat=d}" Margin="1"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <TextBlock Text="Filtrer les séries du genre" Margin="180,195,450,189"/> <ComboBox SelectedValue="{Binding Filtre}" ItemsSource="{Binding Source={local:Enumeration {x:Type local:Genre}}}" DisplayMemberPath="Description" SelectedValuePath="Value" Margin="346,195,291,189"/> <!--là, on binde la liste déroulante du comboBix sur la liste des descriptions de l'énumération et la valeur séléctionnée est bindée sur la propriété filtre--> <ListBox DataContext="{Binding .}" ItemsSource="{Binding SeriesFiltrees}" Margin="0,251,0,41"> <!--là on spécifie à la ListBox que son datacontexte est le même que celui du contrôle qui le contient, et que sa source d'items est la propriété SeriesFiltrees--> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Nom}" Margin="1"/> <TextBlock Text="{Binding DateDeSortie, StringFormat=d}" Margin="1"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Window>
Ce qui donne
Hamster18
Messages postés
177
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
22 janvier 2024
27 mai 2019 à 19:05
27 mai 2019 à 19:05
Un grand merci ! Merci de votre aide !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
21 mai 2019 à 22:13