Search code examples
c#listviewhttpwebrequest

How to prevent it from being added 2 times in listview


I ama getting data from news website with webrequest and show my listview. When user click button , first of all I am getting all news and show my listview, after e.g 15 min user click button again. I am checking my news list if news is exits, I am showing messagebox "There is no fresh news". but if there is a news put all news list in listview again. For example. first lisview count is 75 . and there is 2 fresh news, normally my listview should 77. but listview shows 152. Where is my mistake. can you help me ?

my button click event

private void btnHurriyet_Click(object sender, EventArgs e)
    {
        Hurriyet hurriyet = new Hurriyet();

        List<ListViewItem> list = hurriyet.GetTagsHurriyet();


        foreach (var item in list)
        {

            listView1.Items.Add(item);
        }
    }

this is my class

public static Dictionary<string, Hurriyet> HurriyetHaberList = new Dictionary<string, Hurriyet>();

    public List<ListViewItem> GetTagsHurriyet()
    {

        XmlDocument xdoc = new XmlDocument();

        xdoc.Load("http://www.hurriyet.com.tr/rss/gundem");

        XmlElement el = (XmlElement)xdoc.SelectSingleNode("/rss");

        if (el != null)
        {
            el.ParentNode.RemoveChild(el);
        }

        XmlNode Haberler = el.SelectSingleNode("channel");


        List<ListViewItem> listViewItems = new List<ListViewItem>();

        bool degismiMi = false;

        foreach (XmlNode haber in Haberler.SelectNodes("item"))
        {

            Hurriyet h = new Hurriyet();

            ListViewItem li = new ListViewItem();

            //li.Text = haber.SelectSingleNode("title").InnerText;
            h.Title = haber.SelectSingleNode("title").InnerText;



            if (haber.SelectSingleNode("description").InnerText.Contains("&gt;"))
            {
                var str1 = haber.SelectSingleNode("description").InnerText.IndexOf("&gt;");
                var str2 = haber.SelectSingleNode("description").InnerText.Substring(str1 + 4);

                //li.SubItems.Add(str2);
            }
            else
            {
                //li.SubItems.Add(haber.SelectSingleNode("description").InnerText);
                h.Description = haber.SelectSingleNode("description").InnerText;
            }

            h.Link = haber.SelectSingleNode("link").InnerText;
            //li.SubItems.Add(haber.SelectSingleNode("link").InnerText);

            var format = DateTime.Parse(haber.SelectSingleNode("pubDate").InnerText.ToString());


            //li.SubItems.Add(format.ToString());
            h.PubDate = format;


            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(haber.SelectSingleNode("link").InnerText);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            StreamReader stream = new StreamReader(response.GetResponseStream());

            string final_response = stream.ReadToEnd();


            string begenningKeyword = "<meta name=\"keywords\" content=\"";



            var tags = final_response.IndexOf(begenningKeyword);
            var final_response2 = final_response.Substring(tags + begenningKeyword.Length);
            var tagsBol = final_response2.IndexOf("\" />");

            var lastTags = final_response2.Substring(0, tagsBol);
            int yer1;

            if (lastTags != string.Empty)
            {
                h.Tags = lastTags;
                //li.SubItems.Add(lastTags);
            }

            else
            {
                yer1 = final_response.IndexOf("tagsContainer");

                if (yer1 == -1)
                {
                    continue;
                }
                else
                {
                    yer1 = final_response.IndexOf("tagsContainer");
                    int yer2 = final_response.IndexOf("</div>", yer1);

                    var tagDiv = final_response.Substring(yer1, yer2 - yer1);

                    List<string> listele = new List<string>();

                    for (int i = 0; i < tagDiv.Length; i++)
                    {
                        var firstSpan = tagDiv.IndexOf("<span>");
                        var firstSpan2 = tagDiv.IndexOf("<span itemprop=\"keywords\">");

                        if (firstSpan != -1)
                        {
                            var secondSpan = tagDiv.IndexOf("</a>", firstSpan);
                            var lastSpan = tagDiv.Substring(firstSpan, secondSpan - firstSpan);

                            var remo = lastSpan.Replace("<span>", "");
                            var remo2 = remo.Replace("</span>", "");

                            listele.Add(remo2);

                            tagDiv = tagDiv.Replace(lastSpan, "");
                        }
                        else if (firstSpan2 != -1)
                        {
                            var secondSpan = tagDiv.IndexOf("</a>", firstSpan2);
                            var lastSpan = tagDiv.Substring(firstSpan2, secondSpan - firstSpan2);

                            var remo = lastSpan.Replace("<span itemprop=\"keywords\">", "");
                            var remo2 = remo.Replace("</span>", "");

                            listele.Add(remo2);

                            tagDiv = tagDiv.Replace(lastSpan, "");
                        }
                        else
                            break;

                    }

                    string c = string.Empty;
                    foreach (var item in listele)
                    {
                        c += item + ",";
                    }

                    //li.SubItems.Add(c.Substring(0, c.Length - 1));
                    h.Tags = c.Substring(0, c.Length - 1);
                }
            }

            if (HurriyetHaberList.ContainsKey(haber.SelectSingleNode("link").InnerText) == false)
            {
                HurriyetHaberList.Add(haber.SelectSingleNode("link").InnerText, h);
                degismiMi = true;
                //listViewItems.Insert(0,li);
            }
        }


        if (!degismiMi)
        {
            MessageBox.Show("Haberlerde değişiklik olmadı");
        }

        else
        {
            listViewItems.Clear();

            foreach (var item in HurriyetHaberList.OrderByDescending(x => x.Value.PubDate).ToList())
            {
                ListViewItem lstItem = new ListViewItem();
                lstItem.Text = item.Value.Title;
                lstItem.SubItems.Add(item.Value.Description);
                lstItem.SubItems.Add(item.Value.Link);
                lstItem.SubItems.Add(item.Value.PubDate.ToString());
                lstItem.SubItems.Add(item.Value.Tags);

                listViewItems.Add(lstItem);

            }
        }

        return listViewItems;
    }

Screenshot

enter image description here


Solution

  • The problem is that your code

    hurriyet.GetTagsHurriyet();
    

    Delivers all 77 Items and this result is than added to your list Control with the below code

    foreach (var item in list)
    {
        listView1.Items.Add(item);
    }
    

    You need to clear your listView1 or make sure that the method GetTagsHurriyet() only returns new items.

    So either do the following:

    private void btnHurriyet_Click(object sender, EventArgs e)
    {
        Hurriyet hurriyet = new Hurriyet();
        List<ListViewItem> list = hurriyet.GetTagsHurriyet();
    
        listView1.Items.Clear(); //<-- added line
        foreach (var item in list)
        {
            listView1.Items.Add(item);
        }
    }
    

    Or in your GetTagsHurriyet() method only fill the list if your dictionary says it is new:

    if (HurriyetHaberList.ContainsKey(haber.SelectSingleNode("link").InnerText) == false)
    {
        HurriyetHaberList.Add(haber.SelectSingleNode("link").InnerText, h);
        degismiMi = true;
        //listViewItems.Insert(0,li);
    
        //add items to listViewItems here and drop the code below
    }
    

    Edit: Based on the comment below:

    Something like this: (Didnt test the code, removed some comments to make it smaller also changed some stuff here and there)

    private void btnHurriyet_Click(object sender, EventArgs e)
    {
        Hurriyet hurriyet = new Hurriyet();
        List<ListViewItem> list = hurriyet.GetTagsHurriyet();
    
        if (!list.Any())
            MessageBox.Show("Haberlerde değişiklik olmadı");
        else
        {
            foreach (var item in list)
                listView1.Items.Add(item);
        }
    }
    
    public static Dictionary<string, Hurriyet> HurriyetHaberList = new Dictionary<string, Hurriyet>();
    public List<ListViewItem> GetTagsHurriyet()
    {
        XmlDocument xdoc = new XmlDocument();
        xdoc.Load("http://www.hurriyet.com.tr/rss/gundem");
        XmlElement el = (XmlElement)xdoc.SelectSingleNode("/rss");
    
        if (el != null)
            el.ParentNode.RemoveChild(el);
    
        XmlNode Haberler = el.SelectSingleNode("channel");
        List<Hurriyet> newHurriyets = new List<Hurriyet>();
    
        bool degismiMi = false;
        foreach (XmlNode haber in Haberler.SelectNodes("item"))
        {
            var link = haber.SelectSingleNode("link").InnerText;
            if (HurriyetHaberList.ContainsKey(link))
                continue;
    
            Hurriyet h = new Hurriyet();
    
            h.Title = haber.SelectSingleNode("title").InnerText;
            if (!haber.SelectSingleNode("description").InnerText.Contains("&gt;"))
                h.Description = haber.SelectSingleNode("description").InnerText;
    
            h.Link = link;
    
            var format = DateTime.Parse(haber.SelectSingleNode("pubDate").InnerText.ToString());
            h.PubDate = format;
    
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link);
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (StreamReader stream = new StreamReader(response.GetResponseStream()))
            {
                string final_response = stream.ReadToEnd();
                string begenningKeyword = "<meta name=\"keywords\" content=\"";
    
                var tags = final_response.IndexOf(begenningKeyword);
                var final_response2 = final_response.Substring(tags + begenningKeyword.Length);
                var tagsBol = final_response2.IndexOf("\" />");
    
                var lastTags = final_response2.Substring(0, tagsBol);
                int yer1;
    
                if (!string.IsNullOrEmpty(lastTags))
                    h.Tags = lastTags;
                else
                {
                    yer1 = final_response.IndexOf("tagsContainer");
    
                    if (yer1 == -1)
                        continue;
    
                    yer1 = final_response.IndexOf("tagsContainer");
                    int yer2 = final_response.IndexOf("</div>", yer1);
    
                    var tagDiv = final_response.Substring(yer1, yer2 - yer1);
    
                    List<string> listele = new List<string>();
                    for (int i = 0; i < tagDiv.Length; i++)
                    {
                        var firstSpan = tagDiv.IndexOf("<span>");
                        var firstSpan2 = tagDiv.IndexOf("<span itemprop=\"keywords\">");
    
                        if (firstSpan != -1)
                        {
                            var secondSpan = tagDiv.IndexOf("</a>", firstSpan);
                            var lastSpan = tagDiv.Substring(firstSpan, secondSpan - firstSpan);
                            var remo = lastSpan.Replace("<span>", "");
                            var remo2 = remo.Replace("</span>", "");
                            listele.Add(remo2);
    
                            tagDiv = tagDiv.Replace(lastSpan, "");
                        }
                        else if (firstSpan2 != -1)
                        {
                            var secondSpan = tagDiv.IndexOf("</a>", firstSpan2);
                            var lastSpan = tagDiv.Substring(firstSpan2, secondSpan - firstSpan2);
                            var remo = lastSpan.Replace("<span itemprop=\"keywords\">", "");
                            var remo2 = remo.Replace("</span>", "");
                            listele.Add(remo2);
    
                            tagDiv = tagDiv.Replace(lastSpan, "");
                        }
                        else
                            break;
                    }
    
                    h.Tags = string.Join(",", listele);
                }
            }
    
            HurriyetHaberList.Add(link, h);
            newHurriyets.Add(h);
        }
    
        List<ListViewItem> listViewItems = new List<ListViewItem>();
        foreach (var item in newHurriyets.OrderByDescending(x => x.PubDate))
        {
            ListViewItem lstItem = new ListViewItem();
            lstItem.Text = item.Title;
            lstItem.SubItems.Add(item.Description);
            lstItem.SubItems.Add(item.Link);
            lstItem.SubItems.Add(item.PubDate.ToString());
            lstItem.SubItems.Add(item.Tags);
    
            listViewItems.Add(lstItem);
        }
    
        return listViewItems;
    }