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(">"))
{
var str1 = haber.SelectSingleNode("description").InnerText.IndexOf(">");
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
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(">"))
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;
}