Avatar billede BenedikteJ Nybegynder
04. december 2011 - 22:10 Der er 5 kommentarer og
1 løsning

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);
        }
Avatar billede platik Nybegynder
05. december 2011 - 13:57 #1
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 :-)
Avatar billede BenedikteJ Nybegynder
05. december 2011 - 14:32 #2
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"
Avatar billede platik Nybegynder
05. december 2011 - 14:46 #3
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.
Avatar billede platik Nybegynder
05. december 2011 - 14:49 #4
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;
}
Avatar billede BenedikteJ Nybegynder
05. december 2011 - 15:07 #5
Det ser ud til at fungere efter hensigten.
Tak for hjælpen - smid et svar og du får point.
Avatar billede platik Nybegynder
05. december 2011 - 15:49 #6
Velbekomme.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester