Objet sender lors de l'appelle SelectionChanged() d'une ListBox [Résolu]

Messages postés
7
Date d'inscription
mardi 3 avril 2012
Dernière intervention
6 avril 2012
- 3 avril 2012 à 15:51 - Dernière réponse :
Messages postés
7
Date d'inscription
mardi 3 avril 2012
Dernière intervention
6 avril 2012
- 4 avril 2012 à 10:35
Bonjour,

Voilà j'ai un petit soucis concernant ma ListBox.
J'ai actuellement une ListBox que je rempli à l'aide d'une requête LINQ sur une base de données XML. Le problème est que lorsque je sélectionne un champ dans la ListBox, l'évènement SelectionChanged est bien catché mais l'objet sender qui est censé me donné les items sélectionnés est null.

Quand je remplissais ma ListBox en dur via le xaml ça marche, mais dès que je veux faire un truc plus propre et plus adapté à mes besoins, ça me balance une exception.

Pour le xaml :
<ListBox Height="22" HorizontalAlignment="Left" Margin="626,43,0,0" Name="Genre" VerticalAlignment="Top" Width="75" SelectionChanged="Genre_SelectionChanged" ItemsSource="{Binding}">
        </ListBox>


Pour ce qui est du cs :
       var genre_query =
                from en in aud.Elements("Entry")
                where en.Element("Genre").Value != null
                select en;
            foreach (var en in genre_query)
            {
                Genre.Items.Add(en.Element("Genre").Value);
            }

private void Genre_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {


            ListBoxItem test = ((sender as ListBox).SelectedItem as ListBoxItem);
                var Query =
                    from en in aud.Elements("Entry")
                    where en.Element("Genre").Value == test.Content.ToString()
                    select en;
                Musique.DataContext = Query;
        }


Je récupère une NullReferenceException sur 'test' puisqu'il s'avère être null dans la fonction de l'event.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
- 3 avril 2012 à 16:18
3
Merci
Salut,

Déjà petite remarque : test correspond à SelectedItem, et non au sender, ce n'est donc pas ce dernier qui est null (tu aurais d'ailleurs une exception levée).

Ton souci vient, je pense, de ton cast avec le mot-clé as. A la différence d'un cast "à l'ancienne", qui lève une exception sur un cast erroné, le as va simplement te renvoyer null. En gros ton SelectedItem n'est pas du type ListBoxItem.

Pour être sûr, tu peux essayer de caster ton sender normalement, puis de regarder le type de l'objet retourné par son accesseur SelectedItem (méthode GetType()). A l'aide du pas à pas, s'entend.

Merci cs_jopop 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_jopop
Meilleure réponse
Messages postés
7
Date d'inscription
mardi 3 avril 2012
Dernière intervention
6 avril 2012
- 3 avril 2012 à 22:18
3
Merci
Problème résolu, je pense que c'était bien du à un cast un peu foireux, du coup je suis juste pas passé par une variable intermédiaire

private void Genre_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
                var Query =
                    from en in aud.Elements("Entry")
                    where en.Element("Genre").Value == (sender as ListBox).SelectedItem.ToString()
                    select en;
                Musique.DataContext = Query;
        }

Merci eveyhyuu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de eveyhyuu
Messages postés
7
Date d'inscription
mardi 3 avril 2012
Dernière intervention
6 avril 2012
- 3 avril 2012 à 17:20
0
Merci
Hum effectivement je vois ce que tu soulève comme problème et je vais du coup chercher de ce côté, mais ce qui me paraissait étrange c'est qu'en indiquant la list d'items directement dans le xaml, tout fonctionne, avec ce même cast.

Du coup je me dit que le soucis peut venir du fait qu'il ne sélectionne aucun item (enfin c'était ma première idée du moins). Du coup je veux bien comprendre que mon cast est foireux mais du coup je comprend pas pourquoi ca fonctionne en dur mais pas comme ca :/
Commenter la réponse de eveyhyuu
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
- 3 avril 2012 à 17:43
0
Merci
J'en sais pas plus que toi, je fais une supposition avec les billes que j'ai (perso j'utilise pas le XAML, pas le LINQ ni même les ListBox).

Tente de voir comme j'ai dit, sait-on jamais. Sinon reviens avec le code "en dur" qui fonctionne, on pourra peut-être trouver le pourquoi du comment par comparaison.
Commenter la réponse de cs_jopop
Messages postés
7
Date d'inscription
mardi 3 avril 2012
Dernière intervention
6 avril 2012
- 3 avril 2012 à 18:00
0
Merci
<ListBox Height="22" HorizontalAlignment="Left" Margin="626,43,0,0" Name="Genre" VerticalAlignment="Top" Width="75" SelectionChanged="Genre_SelectionChanged" ItemsSource="{Binding}">
<ListBoxItem>Rock</ListBoxItem>
<ListBoxItem>Metal</ListBoxItem>
<ListBoxItem>Classique</ListBoxItem>
<ListBoxItem>Autre</ListBoxItem>
        </ListBox>

private void Genre_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {


            ListBoxItem test = ((sender as ListBox).SelectedItem as ListBoxItem);
                var Query =
                    from en in aud.Elements("Entry")
                    where en.Element("Genre").Value == test.Content.ToString()
                    select en;
                Musique.DataContext = Query;
        }


Voilà le code qui fonctionne quand il est mis en dur, ce que je cherche à obtenir c'est d'avoir cette même liste mais en utilisant les genres existant dans la BDD

Pour ce qui est du type je vais tester ca et je reviens vers toi
Commenter la réponse de eveyhyuu
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
- 4 avril 2012 à 08:35
0
Merci
Cool !

Juste par curiosité tu devrais quand même regardé le type de l'objet retourné par SelectedItem. A vue de nez il devrait être du même type que en.Element("Genre").Value
Commenter la réponse de cs_jopop
Messages postés
7
Date d'inscription
mardi 3 avril 2012
Dernière intervention
6 avril 2012
- 4 avril 2012 à 10:35
0
Merci
Oui je me suis dit la même chose hier soir en regardant du côté de la méthode Add de la ListBox qui prend en paramètre un objet, donc pas forcément un ListBoxItem, du coup je pense effectivement que le SelectedItem est du type de l'item.

Un énorme merci pour tes réponses qui m'ont bien aidées :)
Commenter la réponse de eveyhyuu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.