Biding liste objet datagrid
Fermé
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
-
19 mars 2021 à 20:23
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 20 mars 2021 à 13:06
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 20 mars 2021 à 13:06
A voir également:
- Biding liste objet datagrid
- Liste déroulante excel - Guide
- Vente objet occasion entre particulier - Guide
- Liste déroulante en cascade - Guide
- Liste de diffusion whatsapp - 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
10 réponses
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
19 mars 2021 à 20:33
19 mars 2021 à 20:33
Bonjour
merci de lire ce petit tuto afin d'utiliser correctement les balises de code.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Pour le xaml, il faut choisir xml.
Après on pourra commencer à essayer de t'aider
merci de lire ce petit tuto afin d'utiliser correctement les balises de code.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Pour le xaml, il faut choisir xml.
Après on pourra commencer à essayer de t'aider
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
19 mars 2021 à 20:48
19 mars 2021 à 20:48
Tu peux montrer le code behind?
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
19 mars 2021 à 20:49
19 mars 2021 à 20:49
voila
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using System.Collections.ObjectModel; using System.ComponentModel; namespace TP2_JeuxSociete { /// <summary> /// Classe qui représente un jeu de société. /// Les données initiales proviennent de https://boardgamegeek.com /// </summary> public class JeuSociete { public string Nom { get; set; } public int MinimumJoueurs { get; set; } public int MaximumJoueurs { get; set; } public int MinimumAge { get; set; } public int MaximumAge { get; set; } // On met un maximum de 99 ans quand il n'y a pas réellement de limite. public List<CategorieJeu> LstCategorie { get; set; } private const string NOM_FICHIER = "ListeJeuSociete.json"; public JeuSociete() { } /// <summary> /// Fait la lecture du fichier de données et retourne une liste de jeux. /// </summary> /// <remarks> /// Si le fichier est inexistant, vide ou corrompu, la méthode retourne une liste vide. /// </remarks> /// <returns>Une liste de jeux.</returns> public static List<JeuSociete> ChargerListeJeux() { string[] lignes = System.IO.File.ReadAllLines(@"ListeJeuSociete.txt"); List<JeuSociete> lstJeux = new List<JeuSociete>(); foreach (string ligne in lignes) { List<CategorieJeu> LstCat = new List<CategorieJeu>(); string[] champsLigne = ligne.Split(':'); string NomJ = champsLigne[0]; int MinimunJoueursJ = Int32.Parse(champsLigne[1]); int MaximumJoueursJ = Int32.Parse(champsLigne[2]); int MinimumAgeJ = Int32.Parse(champsLigne[3]); int MaximumAgeJ = Int32.Parse(champsLigne[4]); string[] CategoriesJ = champsLigne[5].Split(','); foreach (string categorie in CategoriesJ) { LstCat.Add(new CategorieJeu(categorie)); } lstJeux.Add(new JeuSociete(NomJ, MinimunJoueursJ, MaximumJoueursJ, MinimumAgeJ, MaximumAgeJ)); } return lstJeux; } /// <summary> /// Enregistre la liste de jeux reçue dans le fichier de données. /// </summary> /// <remarks> /// Le contenu existant est écrasé à l'écriture. /// Si le fichier n'existe pas, il sera créé. /// </remarks> /// <param name="lst">La liste des jeux qui doit être enregistrée dans le fichier.</param> public static void EnregistrerListeJeux(List<JeuSociete> lst) { using (StreamWriter sw = new StreamWriter("ListeJeuSociete.txt")) { foreach (JeuSociete element in lst) { StringBuilder ligne = new StringBuilder(); ligne.Append(element.Nom + ":" + element.MinimumJoueurs + ":" + element.MaximumJoueurs + ":" + element.MinimumAge + ":" + element.MaximumAge + ":"); for (int i = 0; i < element.LstCategorie.Count; i++) { if (i < element.LstCategorie.Count - 1) ligne.Append(element.LstCategorie[i].Nom + ","); else ligne.Append(element.LstCategorie[i].Nom); } sw.WriteLine(ligne); } } } /// <summary> /// Contructeur de la classe JeuSociete /// </summary> /// <param name="nom">Le nom du jeu.</param> /// <param name="minJoueurs">Le nombre minimal de joueurs.</param> /// <param name="maxJoueurs">Le nombre maximal de joueurs.</param> /// <param name="minAge">Le minimum d'age requis pour jouer.</param> /// <param name="maxAge">Le maximum d'age recommandé pour jouer.</param> /// <remarks> /// La gestion des catégories d'un jeu se fait par les méthodes de la classe. /// </remarks> /* public JeuSociete(string nom, int minJoueurs, int maxJoueurs, int minAge, int maxAge, List<CategorieJeu> lstCat) { Nom = nom; MinimumJoueurs = minJoueurs; MaximumJoueurs = maxJoueurs; MinimumAge = minAge; MaximumAge = maxAge; // LstCategorie = lstCat; }*/ public JeuSociete(string nom, int minJoueurs, int maxJoueurs, int minAge, int maxAge) { Nom = nom; MinimumJoueurs = minJoueurs; MaximumJoueurs = maxJoueurs; MinimumAge = minAge; MaximumAge = maxAge; LstCategorie = new List<CategorieJeu>(); } /// <summary> /// Permet d'ajouter une catégorie au jeu (si cette catégorie est valide). /// </summary> /// <param name="nouvelleCategorie">La nouvelle catégorie.</param> public void AjouterCategorie(CategorieJeu nouvelleCategorie) { if (CategorieJeu.EstValide(nouvelleCategorie.Nom)) { LstCategorie.Add(nouvelleCategorie); } } /// <summary> /// Permet de retirer une catégorie d'un jeu. /// </summary> /// <param name="ancienneCategorie"></param> public void RetirerCategorie(CategorieJeu ancienneCategorie) { LstCategorie.Remove(ancienneCategorie); } /// <summary> /// Permet de vérifier si le jeu est d'une catégorie précise. /// </summary> /// <param name="categorie">La catégorie à vérifier.</param> /// <returns>True si le jeu est de la catégorie à vérifier, false sinon.</returns> public bool EstDeCategorie(CategorieJeu categorie) { return LstCategorie.Contains(categorie); } public static void ChargerFichier() { StreamReader fichierEtudiants; // using System.IO; string json; fichierEtudiants = new StreamReader(File.OpenRead(NOM_FICHIER)); json = fichierEtudiants.ReadLine(); fichierEtudiants.Close(); MainWindow.jeu = JsonConvert.DeserializeObject<ObservableCollection<JeuSociete>>(json); } } }
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
19 mars 2021 à 20:51
19 mars 2021 à 20:51
le main window est là
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.Navigation; using System.Windows.Shapes; using System.Collections.ObjectModel; namespace TP2_JeuxSociete { /// <summary> /// Logique d'interaction pour MainWindow.xaml /// </summary> public partial class MainWindow : Window { public static ObservableCollection<JeuSociete> jeu = new ObservableCollection<JeuSociete>(); public UserControl ContenuEcran { get; set; } public UCJeuSociete Jeu = new UCJeuSociete(); public UCFormulaire formulaire = new UCFormulaire(); public MainWindow() { InitializeComponent(); JeuSociete.ChargerFichier(); dgListeJeux.ItemsSource = jeu; } } }
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
19 mars 2021 à 20:51
19 mars 2021 à 20:51
Ok, celui de mainwindows aussi
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
19 mars 2021 à 20:52
19 mars 2021 à 20:52
je viens de l'envoyer
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
Modifié le 19 mars 2021 à 21:06
Modifié le 19 mars 2021 à 21:06
Ok,
alors, dans MainWindows jeu n'est pas une propriété, c'est un champ.
Le binding fonctionne avec des propriétés.
En plus, c'est un champ static, et il est préférable d'utiliser une propriété d'instance.
Dans la classe JeuDeSociete, il faudrait modifier un peu ChargerFichier
E un peu le code behind de Mainwindow
Par contre juste avec ça, je ne voies pas comment le binding peut marcher pour le 2eme tabitem.
Je pense qu'il serait mieux, de binder la fenêtre entière sur elle-même et coder le xaml pour "répartir" le binding.
PS j'ai tapé directement dans le fil, il n'est pas impossible que j'ai laissé trainé une coquille par ci par là
alors, dans MainWindows jeu n'est pas une propriété, c'est un champ.
Le binding fonctionne avec des propriétés.
En plus, c'est un champ static, et il est préférable d'utiliser une propriété d'instance.
Dans la classe JeuDeSociete, il faudrait modifier un peu ChargerFichier
public static ObservableCollection<JeuSociete> ChargerFichier()//la méthode est du type de la collection { StreamReader fichierEtudiants; // using System.IO; string json; fichierEtudiants = new StreamReader(File.OpenRead(NOM_FICHIER)); json = fichierEtudiants.ReadLine(); fichierEtudiants.Close(); return JsonConvert.DeserializeObject<ObservableCollection<JeuSociete>>(json);//ici elle retourne la liste }
E un peu le code behind de Mainwindow
public partial class MainWindow : Window { public ObservableCollection<JeuSociete> jeu {get; set} //jeu est une propriété public UserControl ContenuEcran { get; set; } public UCJeuSociete Jeu = new UCJeuSociete(); public UCFormulaire formulaire = new UCFormulaire(); public MainWindow() { InitializeComponent(); jeu = JeuSociete.ChargerFichier();//on affecte jeu dgListeJeux.ItemsSource = jeu; } }
Par contre juste avec ça, je ne voies pas comment le binding peut marcher pour le 2eme tabitem.
Je pense qu'il serait mieux, de binder la fenêtre entière sur elle-même et coder le xaml pour "répartir" le binding.
public partial class MainWindow : Window { public ObservableCollection<JeuSociete> jeu {get; set} public UserControl ContenuEcran { get; set; } public UCJeuSociete Jeu = new UCJeuSociete(); public UCFormulaire formulaire = new UCFormulaire(); public MainWindow() { InitializeComponent(); jeu = JeuSociete.ChargerFichier();//on affecte jeu this.DataContext = this; //là } }
Title="MainWindow" Height="450" Width="800" DataContext="{Binding}"> <--On indique ici que tout le contexte de la fenêtre sera bindé--> <Grid x:Name="gPrincipal" DataContext="{Binding .}"><--le point signale que le grid a le même contexte que son parent--> <TabControl TabStripPlacement="Top" DataContext="{Binding .}"> <TabItem Header="Liste Jeux" DataContext="{Binding .}"> <DataGrid x:Name="dgListeJeux" VerticalAlignment="Top" HorizontalAlignment="Left" AutoGenerateColumns="False" RowBackground="Khaki" AlternatingRowBackground="Lavender" ItemsSource = "{Binding jeu}"> <-- et là, on spécifie le contexte du datagrid-->
PS j'ai tapé directement dans le fil, il n'est pas impossible que j'ai laissé trainé une coquille par ci par là
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
19 mars 2021 à 21:28
19 mars 2021 à 21:28
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
19 mars 2021 à 21:39
19 mars 2021 à 21:39
As tu mis un point d'arrêt juste après la désérialisation du json pour voir si cette valeur est correcte?
Car là, à brule pourpoint, je ne voie pas ce qui cloche
Car là, à brule pourpoint, je ne voie pas ce qui cloche
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
19 mars 2021 à 21:47
19 mars 2021 à 21:47
okay je vais t'expliquer j'ai un fichier json qui contient les données et les valeurs que tu vois dans la datagrid sont celles qui sont dans mon fichier.json et il me reste à afficher la liste des catégorie d'un même jeu dans mon datagrid et au lieu d'afficher cette liste il affiche (collection ) je t'envoie une capture d'écran de mon fichier c'est juste une partie avec les champs
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
19 mars 2021 à 21:49
19 mars 2021 à 21:49
il n'affiche pas les valeurs de LstCategorie
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
20 mars 2021 à 00:23
20 mars 2021 à 00:23
Ha oui.
Tu peux écrire une colonne contenant une listbox pour cette liste
Tu peux écrire une colonne contenant une listbox pour cette liste
<DataGrid x:Name="dgListeJeux" VerticalAlignment="Top" HorizontalAlignment="Left" AutoGenerateColumns="False" RowBackground="Khaki" AlternatingRowBackground="Lavender"> <DataGrid.Columns> <DataGridTextColumn Header="Nom" Width="75" Binding="{Binding Nom}" x:Name="nom"/> <DataGridTextColumn Header="MinimumJoueurs" Width="120" Binding="{Binding MinimumJoueurs}"/> <DataGridTextColumn Header=" MaximumJoueurs" Width="120" Binding="{Binding MaximumJoueurs}"/> <DataGridTextColumn Header=" MinimumAge" Width="90" Binding="{Binding MinimumAge}"/> <DataGridTextColumn Header=" MaximumAge" Width="90" Binding="{Binding MaximumAge}"/> <--ici là--> <DataGridTemplateColumn Header="Catégories"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ListBox ItemsSource="{Binding LstCategorie}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns>
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
20 mars 2021 à 04:10
20 mars 2021 à 04:10
j'ai ajouté la listBox sauf que regarde ce que ça donne comme résultat il n'affiche pas bien le contenu comme il faut
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
20 mars 2021 à 08:18
20 mars 2021 à 08:18
Il est vrai que j'ai essayé avec une liste de string.
En supposant que ta classe CategorieJeu dispose d'une propriété qui s'appelle Nom
En supposant que ta classe CategorieJeu dispose d'une propriété qui s'appelle Nom
<ListBox ItemsSource="{Binding LstCategorie}" DisplayMemberPath="Nom"/>
danny243
Messages postés
74
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
16 octobre 2021
20 mars 2021 à 13:02
20 mars 2021 à 13:02
merci beaucoup ça marche
Whismeril
Messages postés
19024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2024
928
20 mars 2021 à 13:06
20 mars 2021 à 13:06
De rien
19 mars 2021 à 20:36
19 mars 2021 à 20:37
19 mars 2021 à 20:40
19 mars 2021 à 20:45
19 mars 2021 à 20:45