Oprettet søn. d. 04. december 2011 kl. 22:10:02

BenedikteJ
BenedikteJ (2.765 point. Point ude: 30)

Rss Reader med tråde

Jeg er ved at kode en Rss reader der fungerer på følgende måde:
Brugeren skriver en url ind i et tekstfelt. Når brugeren klikker på knappen dertil, henter programmet rss feeds ned i et listview der viser titel og url til de forskellige.
Når brugeren klikker på en titel, skal beskrivelsen af det pågældende feed vises i en tekstboks nedenfor. Men hvordan?

Min kode ser således ud:

public Form1()
        {
            InitializeComponent();
        }

        private void btnGem_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(txtUrl.Text);
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            var reader = new XmlTextReader((string)e.Argument);
            var feed = SyndicationFeed.Load(reader);
            var items = new List<ListViewItem>();
            foreach (var item in feed.Items)
            {
                var listItem = new ListViewItem();
                listItem.Text = item.Title.Text;
               
                foreach (var link in item.Links)
                {
                    listItem.SubItems.Add(link.Uri.AbsoluteUri);
                }
                items.Add(listItem);
            }
            e.Result = items.ToArray();
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            lstView.Items.AddRange((ListViewItem[])e.Result);
        }

        private void lstView_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtDesc.Text = ????;
        }

        private void lstView_DoubleClick(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start(lstView.SelectedItems[0].SubItems[1].Text);
        }

Skrevet man. d. 05. december 2011 kl. 13:57:56| #1

platik
platik (8.300 point)
Den nemme måde:

Ændre denne metode:

      private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            var reader = new XmlTextReader((string)e.Argument);
            var feed = SyndicationFeed.Load(reader);
            var items = new List<ListViewItem>();
            foreach (var item in feed.Items)
            {
                var listItem = new ListViewItem();
                listItem.Text = item.Title.Text;
               
                foreach (var link in item.Links)
                {
                    listItem.SubItems.Add(link.Uri.AbsoluteUri);
                }
                listItem.Tag = item;
                items.Add(listItem);
            }
            e.Result = items.ToArray();
        }

Og denne:

private void lstView_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtDesc.Text = ((SyndicationItem)lstView.SelectedItems[0].Tag).Summary.Text;
        }

Overstående er ikke testet. Så der er muligvis stadig lidt småfejl :-)

Skrevet man. d. 05. december 2011 kl. 14:32:55| #2

BenedikteJ
BenedikteJ (2.765 point)
Det fungerer første gang jeg klikker på en titel i lstview, men anden gang smider den en exception:

"InvalidArgument=Value of '0' is not valid for 'index'.
Parameter name: index"

Skrevet man. d. 05. december 2011 kl. 14:46:55| #3

platik
platik (8.300 point)
Ah den starter åbenbart med at fravælge den anden. Trigger eventet inden den vælger en ny og trigger eventet igen.

private void lstView_SelectedIndexChanged(object sender, EventArgs e)
{
    if (lstView.SelectedItems.Count > 0)
        txtDesc.Text = ((SyndicationItem)lstView.SelectedItems[0].Tag).Summary.Text;
}

Hvis det er muligt at vælge flere listview items på en gang bør du nok overveje hvad der så skal ske.

Skrevet man. d. 05. december 2011 kl. 14:49:37| #4

platik
platik (8.300 point)
Måske dette i stedet, i tilfælde af man ikke har valgt nogen. (Fravælger den der ellers var valgt uden at vælge en ny.)

private void lstView_SelectedIndexChanged(object sender, EventArgs e)
{
    if (lstView.SelectedItems.Count > 0)
        txtDesc.Text = ((SyndicationItem)lstView.SelectedItems[0].Tag).Summary.Text;
    else
        txtDesc.Text = string.Empty;
}

Skrevet man. d. 05. december 2011 kl. 15:07:26| #5

BenedikteJ
BenedikteJ (2.765 point)
Det ser ud til at fungere efter hensigten.
Tak for hjælpen - smid et svar og du får point.

Skrevet man. d. 05. december 2011 kl. 15:49:31| #6


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Print fra Windows Service på Win2008

Oprettet den 24. maj 2012 kl. 11.17
jps6kb giver 200 point for svar | Giv et svar »

Udskrive en Breadcrumb (Jeg er her >>)

Oprettet den 18. maj 2012 kl. 12.04
Qbruger giver 200 point for svar | Giv et svar »

Hjælp til at lokalisere fejl i CMS (synkron.via) dll

Oprettet den 16. maj 2012 kl. 19.31
jokkejensen giver 200 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger