I
Hallo Leute,
ich weiß nicht, ob ich hier im Forum überhaupt richtig bin, aber ich versuche mein Glück neuerdings mit WPF. Nun möchte ich eine DataGrid an eine Liste binden, die dynamisch erweitert wird. Die Liste habe ich als eigene Klasse definiert:
public class Searchingcache
{
public string favorites { get; set; }
public string type { get; set; }
public string name { get; set; }
public string details { get; set; }
public string owner { get; set; }
public string gccode { get; set; }
public string land { get; set; }
public string datehiddengerman { get; set; }
public string datehiddenutc { get; set; }
public string lastfound { get; set; }
public bool available { get; set; }
}
List<Searchingcache> searchingcaches = new List<Searchingcache>();
Nun möchte ich, dass bei Document_Completed LoadCollectionData() ausgeführt wird,
this.dataGrid1.ItemsSource = LoadCollectionData();
in der ich die Liste definiere:
private List<Searchingcache> LoadCollectionData()
{
loaddocument = loaddocument + pagenumber;
dynamic d = webBrowser1.Document;
IHTMLElementCollection elCol = d.GetElementsByTagName("tr");
if (elCol.length == 0) return searchingcaches;
int x = (pagenumber * 20) - 20;
foreach (IHTMLElement op in elCol)
{
if (op.innerText == null) break;
if (op.innerText.StartsWith("Total") == true) continue;
if (op.innerText.StartsWith(" Description") == true) continue;
else
{
IHTMLElementCollection elCol2 = op.document.GetElementsByTagName("td");//op.GetElementsByTagName
bool searchingnotavailable = false;
if (elCol2.length == 0) return searchingcaches;
int y = 11 * (x - ((pagenumber - 1) * 20));
string searchingfavorite = elCol2.item(4 + y).InnerText;
int test = elCol2.item(6 + y).InnerHtml.IndexOf("alt") + 4;
string test2 = elCol2.item(6 + y).InnerHtml.Remove(0, test);
int test3 = test2.IndexOf("src") - 1;
string searchingtype = elCol2.item(6 + y).InnerHtml.Substring(test, test3).Replace("\"", "");
string searchingname = elCol2.item(7 + y).InnerText.Substring(0, elCol2.item(7 + y).InnerText.IndexOf("\r") - 1);
string test4 = elCol2.item(7 + y).FirstChild.GetAttribute("className");
if (test4 == "lnk ") searchingnotavailable = false;
else if (test4 == "lnk Strike") searchingnotavailable = true;
string searchingdetails = elCol2.item(7 + y).InnerText.Substring(elCol2.item(7 + y).InnerText.IndexOf("by"));
string searchingowner = searchingdetails.Substring(0, searchingdetails.IndexOf(" | "));
searchingowner = searchingowner.Replace("by ", "");
test2 = searchingdetails.Remove(0, searchingdetails.IndexOf(" | ") + 3);
string searchingcode = test2.Substring(0, test2.IndexOf(" | "));
test2 = test2.Remove(0, test2.IndexOf(" | ") + 3);
string searchingland = test2;
string searchingdatehidden = elCol2.item(10 + y).InnerText;
searchingdatehidden = searchingdatehidden.Remove(searchingdatehidden.LastIndexOf(" "));
searchingdatehidden = getdatenormal(searchingdatehidden);
string searchingdatehiddengerman = getdategerman(searchingdatehidden);
string searchingdatehiddenutc = getdateutc(searchingdatehidden);
string searchinglastfound = "";
if (elCol2.item(11 + y).InnerText != null)
{
searchinglastfound = elCol2.item(11 + y).InnerText.Replace("*", "");
searchinglastfound = getdatenormal(searchinglastfound);
if (searchinglastfound.Contains("/")) searchinglastfound = getdategerman(searchinglastfound);
}
x++;
double progress = progressBar1.Value + 1;
UpdateProgressBarDelegate updatePbDelegate = new UpdateProgressBarDelegate(progressBar1.SetValue);
Dispatcher.Invoke(updatePbDelegate, DispatcherPriority.Background, new object[] { ProgressBar.ValueProperty, progress });
if (progress % 2 == 0) label12222.Content = "Bitte warten, während easycache die Daten von Geocaching.com lädt... " + (progress / 2) + "%";
searchingcaches.Add(new Searchingcache()
{
favorites = searchingfavorite,
type = searchingtype,
name = searchingname,
details = searchingdetails,
owner = searchingowner,
gccode = searchingcode,
land = searchingland,
datehiddengerman = searchingdatehiddengerman,
datehiddenutc = searchingdatehiddenutc,
lastfound = searchinglastfound,
available = !searchingnotavailable
});
}
}
if (pagenumber == 10)
{
this.Cursor = Cursors.Arrow;
progressBar1.Value = 0;
label12222.Content = "";
return searchingcaches;
}
if (d.GetElementById("ctl00_ContentBody_pgrTop_lbGoToPage_" + (pagenumber + 1).ToString()) != null)
{
d.GetElementById("ctl00_ContentBody_pgrTop_lbGoToPage_" + (pagenumber + 1).ToString()).Click();
pagenumber++;
}
else
{
Cursor = Cursors.Arrow;
label12222.Content = "";
return searchingcaches;
}
return searchingcaches;
}
Das klappt soweit auch super, die Liste ist hinterher vollständig da.
Wenn ich nun jedoch in meinem Fenster in der DataGrid scrollen möchte, kommt folgender Fehler:
Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in PresentationFramework.dll aufgetreten.
Zusätzliche Informationen: Ein ItemsControl ist nicht konsistent mit seiner Elementquelle.
Weitere Informationen finden Sie in der inneren Ausnahme.
Warum passiert das? Ich weiß echt nicht, was ich falsch mache und ich habe auch nichts im Internet dazu gefunden...
LG, Ialokim
EDIT: Wenn es jemanden mit einem ähnlich gelagerten Problem gibt: Ich habe nach einigem Suchen nun doch eine Lösung gefunden:
dataGrid1.ItemsSource = LoadCollectionData();
dataGrid1.Items.Refresh();
Mit der zweiten Zeile klappt alles problemlos!