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

Silverlight Discussion :

[C#] comment faire pour afficher correctement juste les éléments sélectionnés d'une ListBox?


Sujet :

Silverlight

  1. #1
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut [C#] comment faire pour afficher correctement juste les éléments sélectionnés d'une ListBox?
    Bonjour,

    voilà le problème auquel je suis confronté ce matin sans trouver de solution. Ma première ListBox :

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ListBox Height="151" Name="listeArretesListBoxMain" Width="1145" SelectedValuePath="libelleArrete" 
                                     SelectionMode="Multiple">
                                <ListBox.ItemTemplate>                                
                                    <DataTemplate>
                                        <TextBlock Text="{Binding libelleArrete}"/>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>

    Lors de l'affichage tout se passe bien et j'ai bien une liste issue d'une BDD PHP qui s'affiche. Le problème est le suivant : lorsque je clique sur un bouton qui a pour rôle de lancer private void button3_Click j'ai bien les message qui me signale exactement le nombre d'éléments que j'ai selectionnés mais lorsqu'il s'agit d'afficher tous les éléments avec MessageBox.Show("" + strItem + ""); le contenu strItem est vide même si foreach est parcouru le bon nombre de fois. Pouvez-vous me dire pourquoi strItem est vide à chaque affichage? Merci !!!


    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void button3_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Il y a " + listeArretesListBoxMain.SelectedItems.Count + " éléments dans la liste." );
     
                String strItem;
                foreach (Object selecteditem in listeArretesListBoxMain.SelectedItems)
                {
                    strItem = selecteditem as String;
                    MessageBox.Show("" + strItem + "");    
     
                }
            }

  2. #2
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    Salut,
    en fait ma question pourrait être la suivante : comment faire pour afficher correctement juste les éléments sélectionnés d'une ListBox?
    Merci

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 027
    Points : 5 468
    Points
    5 468
    Par défaut
    Tes items ne sont pas des Strings puisque tu fais un Binding d'une propriété.
    Ton conde devrait donc plutot être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
               foreach (Object selecteditem in listeArretesListBoxMain.SelectedItems)
                {
                    var strItem = selecteditem as TonObjet;
                    MessageBox.Show("" + strItem.libelleArrete + "");    
     
                }

  4. #4
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    Merci pour ta réponse Micka mais si je fais ça j'ai string ne contient pas une définition pour libelleArrete

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 027
    Points : 5 468
    Points
    5 468
    Par défaut
    Euh c'est parceque tu as déclaré "strItem" comme string non?

  6. #6
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    Tu as tout à fait raison j'ai déclaré : Arretes strItem et ça marche

    Merci beaucoup Micka132 !!!

  7. #7
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    j'ai un autre problème sur lequel j'ai fait plusieurs essais sans résultat ;

    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
     
    private void button3_Click(object sender, RoutedEventArgs e)
            {
                Arretes strItem;
                int[] index = new int[listeArretesListBoxMain.SelectedItems.Count];
                int cpt = 0;
     
                foreach (Object selecteditem in listeArretesListBoxMain.SelectedItems)
                {
                    strItem = selecteditem as Arretes;
                    listeArretesListBoxMain2.Items.Add(strItem.libelleArrete);
                    index[cpt] = listeArretesListBoxMain.Items.IndexOf(selecteditem);   
                    cpt++;
                }
     
                Array.Sort(index);
                Array.Reverse(index);
     
     
                for (int i = 0; i <= 2; i++)
                {
                    MessageBox.Show(index[cpt]);
                    listeArretesListBoxMain.Items.RemoveAt(index[cpt]);
                }
            }
    en fait button3_Click doit me permettre de prendre les éléments sélectionnés d'une listebox et de les afficher dans une autre Une fois affichés dans l'autre je les supprime de la premiere. Je garde leur index dans un tableau dont j'inverse l'ordre afin de les supprimer par la fin mais mon programme ne rentre pas dans la boucle.Quelqu'un peut t'il m'aider a y voir clair?

    Merci

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 027
    Points : 5 468
    Points
    5 468
    Par défaut
    Il ne rentre pas dans la seconde boucle for ?
    J'ai du mal a saisir!
    par contre il devrait y avoir une erreur, parceque cpt > index.count. (cpt non réinitialisé)

    Euh sinon c'est quoi l'interet de "supprimer à l'envers"? Ca va tellement vite que tu verras rien!

  9. #9
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    voilà l'interet :
    j'ai deux listBox une qui présente n éléments l'autre au départ est vide. En faisant une sélection sur la première listBox de 1 à n éléments et après validation seuls les éléments sélectionnés passent dans la seconde listBox. Bien sûr je ne dois plus les avoir dans la première listBox et je dois même éventuellement pourvoir faire le chemin inverse. Pour le index[cpt] tu as raison j'ai fais un copier coller et j'ai oublié de remplacer cpt par i Je suis très distrait et je n'ai pas vu cette erreur pendant plus d'une heure. Miantenant je dois attendre mon retour au bureau afin de pouvoir tester tout ça. En tout cas un regard neuf voit toujours les évidences.

    Merci beaucoup !!!

  10. #10
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    Salut Micka,

    j'ai bien changé cpt par i dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i = 0; i <= 2; i++)
                {
                    MessageBox.Show(index[cpt]);
                    listeArretesListBoxMain.Items.RemoveAt(index[cpt]);
                }
    mais ça ne marche pas. Mes arrêtés selectionnés dans la listeArretesListBoxMain ne disparaissent pas. J'ai essayé listeArretesListBoxMain.SelectedItems.RemoveAt(index[cpt]) et listeArretesListBoxMain.SelectedItems.clear() aussi sans résultat. peux tu me donner le début d'une piste. Merci !!!

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 027
    Points : 5 468
    Points
    5 468
    Par défaut
    Si tu touches aux selectedItems normal que ca n'influe pas la listbox, par contre directement sur Items là je trouve ca étrange!
    Le messageBox fonctionne bien?

    Peut être un problème de refresh de la box si ta source (la source initial qui remplis Items) n'est pas une observable collection.

  12. #12
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    j'ai refais la boucle comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i = 0; i <= 2; i++)
                {
                    MessageBox.Show("index : " + index[i] + "");
                    listeArretesListBoxMain.Items.RemoveAt(index[i]);
                }
    ca affiche le contenu de l'index une fois puis plus rien sans rien supprimer dans ma listBox MA source n'est pas une observableCollection La liste est issue d'une requete MySQL. Merci quand même !!!

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 027
    Points : 5 468
    Points
    5 468
    Par défaut
    Utilise une observableCollection à la place de la liste (qui ne peut venir directement de Mysql puisqu'on est en Silverlight!)

    Ensuite fait gaffe à ton for qui va jusqu'a 2, au lieu de cpt .
    Mais bon ca n'explique pas pourquoi il n'y a qu'un seul messagebox...
    Sauf si tu as un try catch global qui ne fait rien, et que listeArretesListBoxMain.Items.RemoveAt(index[i]); plante.
    Essaye en pas à pas pour voir ce qui se passe.

  14. #14
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    Okay j'ai compris J'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i = 0; i < monArrete.mesArretes.Length; i++)
                {
                    _MyObject.Add(new Arretes { libelleArrete = monArrete.mesArretes[i].libelleArrete });
                }
                listeArretesListBoxMain.ItemsSource = _MyObject;
    et ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (int i = 0; i <= listeArretesListBoxMain.SelectedItems.Count; i++)
                {
                    _MyObject.RemoveAt(index[i]);
                }
    Et là ça marche Je ne travaille pas directement sur ma listBox mais sur mon ObservableCollection !!! Ce fut dur à comprendre mais c'est fait En tout cas merci beaucoup pour ta disponibilité !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/07/2010, 16h10
  2. Réponses: 1
    Dernier message: 04/11/2009, 00h39
  3. Comment faire pour afficher les informations d'une base de donnée
    Par bonnet85 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/03/2008, 09h24
  4. [CKEditor] FCKeditor 2.5 : comment faire pour afficher les images ?
    Par Buldozer Ben dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 20/12/2007, 10h00
  5. Comment faire pour afficher une image ds une dbgrid
    Par totomaze dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/10/2004, 15h31

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