none
ListBox avec obj RRS feed

  • Question

  • Bonjour, j'aurais encore une question ... je débute en c# et wpf.

    J'ai donc crée une listBox contenant tous les joueurs de mon equipe:

        public class Joueur{
    public string IdJoueur { get; set; }
            public string NomJoueur { get; set; }
            public string PrenomJoueur { get; set; }
            public Joueur(string id, string nom, string prenom)
            {
                IdJoueur = id;
                NomJoueur = nom;
                PrenomJoueur = prenom;
            }
    
            public string affichageJoueur(string idJoueur)
            {
                string retour = "Chargement en cours...";
                try
                {
                    XElement ficheJoueur = XElement.Load("ListeJoueurs.xml");
                    var recup =     from nm in ficheJoueur.Elements("Employee")
                                    where (string)nm.Element("EmpId") == idJoueur
                                    select nm;
                    foreach (XElement xEle in recup)
                    retour+=xEle.ToString();
    
                }
                catch (Exception ex)
                {
                    retour = "Une erreur est survenue:\n" + ex.Message;
                }
                return retour;
    }}

    Et ensuite je liste via un fichier xml pour l'instant (je ferais par la suite en bdd) grâce a ceci:

     List <Joueur> results = new List<Joueur>{};
                try
                {
                    XElement ListeDonnee = XElement.Load("ListeJoueurs.xml");
                    IEnumerable<XElement> Joueurs = ListeDonnee.Elements();
                    foreach (var joueur in Joueurs)
                     results.Add(new Joueur(joueur.Element("EmpId").Value,joueur.Element("Prenom").Value,joueur.Element("Prenom").Value));
                    statusOf = "Listing effectué";
                }
                catch (Exception ex)
                {
    
                    statusOf = "Erreur: " + ex.Message;
                }

    results etant en binding avec ma listbox.

    Le soucis est qu'il m'affiche ceci:

    WpfApplication.Joueur (4 fois etant donné que j' en ai enregistré que 4).

    Ma question est donc de savoir comment je peux afficher simplement le nom du gars tous en gardant le tableau vu que lorsque je clique sur un element je recupere la proprieté idJoueur pour afficher ses infos ...

    Je sais pas si c'est assez claire??

    Deuxieme question : j'aimerai pouvoir formater un peu (ou designer si vous preferez) en gros j'aimerai faire en sorte d'avoir une cellule contenant la photo avec le nom afficher en grand au dessus et les infos sur le coté... bref faire une mise en page, pouvez m'expliquer un peu la philosophie pour faire cela!!

    Encore un tous grand merci!

    samedi 6 septembre 2014 11:21

Réponses

  • Pouah la claque ... J'ai encore beaucoup de chemin a faire (ca ne fait que 2 semaines).. Peux tu m'en dire plus sur les collections ou un bon lien pour comprendre ca ?

    Peux tu aussi m'expliquer cette ligne ainsi que ces différents liens dans les différentes classes pour etre sur que j'ai bien saisi le mecanisme:

     <TextBlock Text="{Binding Path=NomJoueur, FallbackValue=FirstName}" />

    Ensuite pourquoi cette balise? Quel est son role:

    <DataTemplate x:Key="templateJoueur">

    As tu un bon tuto, site pour développer une application dans les règles ( système de page etc) j'ai en vu quelques uns sur le web mais je ne sais pas vraiment sur lequel me lancer!! En tous cas un tous grand merci!!

    Une dernière question: comment je peux afficher une image depuis un xml??

    Bien sur je pose mes questions ici mais je creuse de mon coté aussi !

    • Marqué comme réponse LedNics lundi 8 septembre 2014 14:59
    lundi 8 septembre 2014 08:39
  • C'est le prix a payer pour être un crack !!!!
    • Marqué comme réponse LedNics lundi 8 septembre 2014 14:59
    lundi 8 septembre 2014 13:30

Toutes les réponses

  • Bonjour à tous! Voila j'ai trouvé une solution qui me semble bien fonctionnel dans mon cas, maintenant j'aimerai savoir si c'est la meilleur ou si c'est tourner autour du trou avant de sauter:

     public MainWindow()
            {
                InitializeComponent();
                InfoStatus.DataContext = this;
               // List <Joueur> results = new List<Joueur>{};
                Dictionary<string, Joueur> results = new Dictionary<string, Joueur>();
                try
                {
                    XElement ListeDonnee = XElement.Load("ListeJoueurs.xml");
                    IEnumerable<XElement> Joueurs = ListeDonnee.Elements();
                    foreach (var joueur in Joueurs)
                        results.Add(joueur.Element("EmpId").Value, new Joueur(joueur.Element("EmpId").Value, joueur.Element("Nom").Value, joueur.Element("Prenom").Value));
                        statusOf = "Listing effectué";
                }
                catch (Exception ex)
                {
    
                    statusOf = "Erreur: " + ex.Message;
                }
                Binding Listbinding = new Binding();
                Binding Statusbinding = new Binding();
                Listbinding.Source = results;
                Statusbinding.Source = statusOf;
                this.lbContactsList.SetBinding(ItemsControl.ItemsSourceProperty, Listbinding);
                this.InfoStatus.SetBinding(ItemsControl.ItemsSourceProperty, Statusbinding);
               
            }
            private void lbContactsList_SelectedIndexChanged(object sender, System.EventArgs e)
            {
                MessageBox.Show("ton message");
            }
            //Lorsque l'on clique sur un nom.
            private void lbContactsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                try
                {
                    Joueur recupJoueur = new Joueur();
                    this.MonContenu.Text = recupJoueur.affichageJoueur(recupJoueur.getId(lbContactsList.SelectedItem));
                }
                catch (Exception ex)
                {
                    MessageBox.Show("message :" + ex.Message);
                }
            }

    La class joueur:

     public class Joueur
        {
            public string IdJoueur { get; set; }
            public string NomJoueur { get; set; }
            public string PrenomJoueur { get; set; }
            public Joueur() { }
            public Joueur(string id, string nom, string prenom)
            {
                IdJoueur = id;
                NomJoueur = nom;
                PrenomJoueur = prenom;
            }
            public string getId(object e)
            {
                var type = e.GetType();
                var key = type.GetProperty("Key");
                var keys = key.GetValue(e, null);
                return keys.ToString();
            }
            public string affichageJoueur(string idJoueur)
            {
                string retour = "Chargement en cours...";
                try
                {
                    XElement ficheJoueur = XElement.Load("ListeJoueurs.xml");
                    var recup =     from nm in ficheJoueur.Elements("Employee")
                                    where (string)nm.Element("EmpId") == idJoueur
                                    select nm;
                    foreach (XElement xEle in recup)
                    retour+=xEle.ToString();
    
                }
                catch (Exception ex)
                {
                    retour = "Une erreur est survenue:\n" + ex.Message;
                }
                return retour;
            }
        }

    Voila merci les amis!! 

    (didju je suis super content d'avoir trouver ahahaha)

    dimanche 7 septembre 2014 06:35
  • Bonjour,

    Voici comment j'aurais fait.

    Beaucoup de chose a dire:

    Tout d'abord, le XAML doit faire toute l'UI sans que le code behind ne s'en occupe. Donc, la partie Binding dans le constructeur a été effacée car inutile.

    Ensuite, le mariage parfait entre une listbox et une collection est surement l'observable collection. Pourquoi ? Car elle prend en charge tous les changements dans la liste et rafraichie l'UI toute seule. Donc, les add, remove et autre sont gérés.

    Pour un design plus sexy dans la list, j'ai ajouté un datatemple dans le XAML. Bindé sur les propriétés d'un objets Joueur, il permet de faire un design sympa et de mappé exactement a ton objet.

    Du coup, j'ai simplifié au maximum l'objet Joueur.

    Enfin, j'ai modifié la méthode sur la sélèction des items dans la listbox. Il suffit juste de récupérer les bonnes infos et le tour est joué.

    Voici donc le code:

     <Grid HorizontalAlignment="Left" Height="558" Margin="7,7,0,0" VerticalAlignment="Top" Width="200">
            <Grid.Resources>
                <DataTemplate x:Key="templateJoueur">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="60"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Border Margin="5" BorderBrush="Black" BorderThickness="1">
                            <Image Source="{Binding Path=Image}" Stretch="Fill" Width="50" Height="50" />
                        </Border>
                        <StackPanel Grid.Column="1" Margin="5">
                            <StackPanel Orientation="Horizontal" TextBlock.FontWeight="Bold" >
                                <TextBlock Text="{Binding Path=NomJoueur, FallbackValue=FirstName}" />
                                <TextBlock Text="{Binding Path=PrenomJoueur, FallbackValue=LastName}" Padding="3,0,0,0"/>
                            </StackPanel>
                            <TextBlock Text="{Binding Path=Age, FallbackValue=Age}" />
                            <TextBlock Text="{Binding Path=Role, FallbackValue=Role}" />
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </Grid.Resources>
            <ListBox x:Name="lbContactsList" SelectionChanged="lbContactsList_SelectionChanged" ItemsSource="{Binding Results}" HorizontalAlignment="Left" Height="508" Margin="0,10,0,0" VerticalAlignment="Top" Width="200" ItemTemplate="{StaticResource templateJoueur}">
            </ListBox>
            
            <StatusBar x:Name="sb" HorizontalAlignment="Left" Height="25" Margin="0,523,-374,0" VerticalAlignment="Top" Width="574" Background="{x:Null}" Foreground="#FF2B2A2A">
                <TextBlock Height="25" x:Name="InfoStatus" TextWrapping="Wrap" Text="{Binding StatuOf}" Width="574" Foreground="#FF616060"/>
            </StatusBar>
        </Grid>
    public partial class MainWindow : Window
        {
            public string StatuOf {get;set;}
            public ObservableCollection<Joueur> Results { get; set; }
    
            public MainWindow()
            {
                InitializeComponent();
                Results = new ObservableCollection<Joueur>();
                DataContext = this;
    
                try
                {
                    for (int i = 0; i < 10; i++)
                        Results.Add(new Joueur(i.ToString(), "Nom" + i, "prenom" + i, 39));
    
                    StatuOf = "Listing effectué";
                }
                catch (Exception)
                {
                    StatuOf = "erreur";
                }
            }
    
            private void lbContactsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                MessageBox.Show("Joueur: Nom-" + ((Joueur)((ListBox)e.Source).SelectedItem).NomJoueur);
            }
        }
    
        public class Joueur
        {
            public string IdJoueur { get; set; }
            public string NomJoueur { get; set; }
            public string PrenomJoueur { get; set; }
            public string Image { get; set; }
            public int Age { get; set; }
    
            public Joueur(string id, string nom, string prenom, int age)
            {
                IdJoueur = id;
                NomJoueur = nom;
                PrenomJoueur = prenom;
                Age = age;
            }
        }

    Et le résultat:

    Cordialement

    Cédric


    dimanche 7 septembre 2014 07:30
  • Pouah la claque ... J'ai encore beaucoup de chemin a faire (ca ne fait que 2 semaines).. Peux tu m'en dire plus sur les collections ou un bon lien pour comprendre ca ?

    Peux tu aussi m'expliquer cette ligne ainsi que ces différents liens dans les différentes classes pour etre sur que j'ai bien saisi le mecanisme:

     <TextBlock Text="{Binding Path=NomJoueur, FallbackValue=FirstName}" />

    Ensuite pourquoi cette balise? Quel est son role:

    <DataTemplate x:Key="templateJoueur">

    As tu un bon tuto, site pour développer une application dans les règles ( système de page etc) j'ai en vu quelques uns sur le web mais je ne sais pas vraiment sur lequel me lancer!! En tous cas un tous grand merci!!

    Une dernière question: comment je peux afficher une image depuis un xml??

    Bien sur je pose mes questions ici mais je creuse de mon coté aussi !

    • Marqué comme réponse LedNics lundi 8 septembre 2014 14:59
    lundi 8 septembre 2014 08:39
  • Bonjour,

    bon, la c'est vrai que dans mon exemple, il y a beaucoup de concepts différents.

    Le mieux si tu débute c'est ce livre:

    WPF 4 Unleashed - Adam Nathan

    Pour moi, c'est le meilleur. Beaucoup d'exemples et des concepts simples bien détaillés.

    Cédric

    lundi 8 septembre 2014 08:46
  • 900 pages en anglais ...chaud mais on va tenter!
    lundi 8 septembre 2014 10:38
  • C'est le prix a payer pour être un crack !!!!
    • Marqué comme réponse LedNics lundi 8 septembre 2014 14:59
    lundi 8 septembre 2014 13:30
  • Ahahah ok merci ! Je reviens vers ce forum si jamais j'ai des soucis de compréhension dans ce bouquin (deja commandé plus qu'a attendre :()
    lundi 8 septembre 2014 14:59