locked
Bouton "Afficher Plus" pour Afficher plus d'items RRS feed

  • Question

  • Bonjour à tous,

    Je viens vous demander de l'aide car je suis face à des problèmes qui sont au dessus de mes capacités.

    Pour faire simple, mon application est un lecteur de flux RSS.

    Dans un item, j'ai 2 éléments : le titre et la date de publication.

    Je récupère les 7 premiers items dans ma listbox grâce à Take().

    J'aimerai que lorsque je clique sur un bouton, les 7 items suivants s'affichent dans la listbox à la suite des 7 premiers.

    //On va remplir notre listbox avec les différents Items parcourus dans le XML listBox1.ItemsSource = from x in xmlItems.Descendants("item").Take(7) select new RSSitem //On crée un nouvel élément RSSitem { // Pour chaque élément RSS on va extraire les informations suivante que l'on va placer // dans l'élément que l'on vient de créer. Date = x.Element("pubDate").Value, Title = x.Element("title").Value, //valeur de l'élément <title> Url = x.Element("link").Value, };

    Merci de votre aide,

    Shunzey

    mercredi 27 juin 2012 15:48

Réponses

  • Tu veux qu'ils s'affichent à la suite, ce n'est donc pas vraiment ca.

    Il faut :

    que tu utilises une observableCollection déjà pour commencer et tu écrives :

    ObservableCollection<RSSItem> Collections{get;set;}

    dans ton constructeur:

    Collections=new ObservableCollection<RSSItem>();
    
    AddItem(0);
    
    listBox1.ItemsSource=Collections;

    Puis :

    void AddItem(int offset)
    
    {
    
    var newitems= from
     x in
     xmlItems.Descendants("item").Skip(offset*7).Take(7)
    select
    new
    RSSitem
    //On crée un nouvel élément RSSitem
    {
    // Pour chaque élément RSS on va extraire les informations suivante
     que l'on va placer
    // dans l'élément que l'on vient de créer.
    Date
    =
     x.Element("pubDate").Value,
    Title
    =
     x.Element("title").Value,
    //valeur de l'élément <title>
    Url
    =
     x.Element("link").Value,
    };
    
    foreach(var newitem in newitems)
    
    {
    
    Collections.Add(newitem);
    
    }
    
    
    }


    A toi d'appeler AddItem(1), AddItem(2), etc... qd besoin





    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue



    • Modifié rudyhuynMVP jeudi 28 juin 2012 11:51
    • Marqué comme réponse Shunzey jeudi 28 juin 2012 17:33
    jeudi 28 juin 2012 11:50
  • Non tu ne parais pas "bête", on est là pour s'entraider :)

    Ensuite concernant ton soucis, c'est de la pagination côté serveur qu'il faut faire dans ce cas (et donc passer des paramètres type "page" et/ou "nombre à récupérer"), parceque si ton flux ne permet pas cela tu devra de toute façon continuer à tout récupérer en une fois.

    Maintenant si c'est juste pour un rendu "visuel", dans ce cas tu dois simplement récupérer le flux (comme tu le fait déjà mais sans l'attribuer à la ListBox et sans le Take()), le stocker dans une ObservableCollection, et utiliser la logique qu'a donné Rudy pour le chargement progressif.


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    • Marqué comme réponse Shunzey jeudi 28 juin 2012 17:33
    jeudi 28 juin 2012 15:00

Toutes les réponses

  • Bonjour,

    Il faut que tu conserve (dans une propriété par exemple) le nombre d'item chargés et ensuite tu utilise .Skip() pour passer directement à l'item souhaité :

    listBox1.ItemsSource = from x in xmlItems.Descendants("item").Skip(number).Take(7)
    


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    jeudi 28 juin 2012 07:56
  • Tu veux qu'ils s'affichent à la suite, ce n'est donc pas vraiment ca.

    Il faut :

    que tu utilises une observableCollection déjà pour commencer et tu écrives :

    ObservableCollection<RSSItem> Collections{get;set;}

    dans ton constructeur:

    Collections=new ObservableCollection<RSSItem>();
    
    AddItem(0);
    
    listBox1.ItemsSource=Collections;

    Puis :

    void AddItem(int offset)
    
    {
    
    var newitems= from
     x in
     xmlItems.Descendants("item").Skip(offset*7).Take(7)
    select
    new
    RSSitem
    //On crée un nouvel élément RSSitem
    {
    // Pour chaque élément RSS on va extraire les informations suivante
     que l'on va placer
    // dans l'élément que l'on vient de créer.
    Date
    =
     x.Element("pubDate").Value,
    Title
    =
     x.Element("title").Value,
    //valeur de l'élément <title>
    Url
    =
     x.Element("link").Value,
    };
    
    foreach(var newitem in newitems)
    
    {
    
    Collections.Add(newitem);
    
    }
    
    
    }


    A toi d'appeler AddItem(1), AddItem(2), etc... qd besoin





    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue



    • Modifié rudyhuynMVP jeudi 28 juin 2012 11:51
    • Marqué comme réponse Shunzey jeudi 28 juin 2012 17:33
    jeudi 28 juin 2012 11:50
  • Exact, j'avais pas fait attention à "à la suite", avec ma solution on réinitialise la liste, j'avais juste bon pour le Skip() ;)

    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    jeudi 28 juin 2012 12:11
  • Merci à vous deux.

    J'ai bien compris la méthode.

    MAIS, j'utilise à la base les méthode "DownloadStringAsync" et "DownloadStringCompleted".

    J'avais :

    void WcDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
           // Si une erreur s'est produite pendant le téléchargement, on ne renvoit rien
                if (e.Error != null) return;
    
                // On va transformer le résultat en éléments XML
                XElement xmlItems = XElement.Parse(e.Result);
    
                //On va remplir notre listbox avec les différents Items parcourus dans le XML
                listBox1.ItemsSource = from x in xmlItems.Descendants("item").Take(7)
                                       select new RSSItem //On crée un nouvel élément RSSitem
                                       {
                                           // Pour chaque élément RSS on va extraire les informations suivante que l'on va placer
                                           // dans l'élément que l'on vient de créer.
                                           Date = x.Element("pubDate").Value,
                                           Title = x.Element("title").Value, //valeur de l'élément <title>
                                           Url = x.Element("link").Value,
                                           //Image = new Uri(x.Element("enclosure").Attribute("url").Value),
                                       };
           }
    

    Si je la remplace par la méthode AddItem(int offset), je ne sais pas quel paramètre il faut pour "Parse" dans "XElement xmlItems = XElement.Parse(e.Result)"

    Le xml en string mais où dois-je le choper ?

    Je dois paraître bête.

    jeudi 28 juin 2012 14:50
  • Non tu ne parais pas "bête", on est là pour s'entraider :)

    Ensuite concernant ton soucis, c'est de la pagination côté serveur qu'il faut faire dans ce cas (et donc passer des paramètres type "page" et/ou "nombre à récupérer"), parceque si ton flux ne permet pas cela tu devra de toute façon continuer à tout récupérer en une fois.

    Maintenant si c'est juste pour un rendu "visuel", dans ce cas tu dois simplement récupérer le flux (comme tu le fait déjà mais sans l'attribuer à la ListBox et sans le Take()), le stocker dans une ObservableCollection, et utiliser la logique qu'a donné Rudy pour le chargement progressif.


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    • Marqué comme réponse Shunzey jeudi 28 juin 2012 17:33
    jeudi 28 juin 2012 15:00
  • Merci à vous. J'me suis débrouillé en écoutant vos méthodes, ça fonctionne !
    jeudi 28 juin 2012 17:35