WPF Datagrid / Datatable: Große Anzahl von Zeilen
Ich habe ein Datagrid verbunden Datatable, der laden muss eine sehr große Menge von Zeilen.
Dinge zu beschleunigen, lade ich 10% von den Zeilen, und das Formular anzeigen. Die meisten der Zeit, die der Benutzer braucht nur die 10% (sind Sie die letzten Einträge). In einem hintergrund-thread geladen werden, die restlichen 90% der Zeilen in einer anderen datatable (SecondData). Dann habe ich merge die beiden datatables:
FirstData.BeginLoadData()
FirstData.Merge(SecondData, False)
FirstData.EndLoadData()
Dies funktioniert gut, aber der Merge-Vorgang dauert sehr lange. Wenn ich den Vorgang umkehren (Verschmelzung SecondData mit FirstData), dauert es viel weniger Zeit. Aber dann muss ich wieder zuordnen itemsource (SecondData) an das Datagrid-Steuerelement, und der Benutzer verliert die aktuelle Scroll-position, ausgewählten Zeile, etc.
Ich auch versucht, indem die Zeilen direkt an FirstData aus dem hintergrund-thread, und es scheint zu funktionieren. Aber wenn ich scrollen Datagrid danach, bekomme ich freezes und "DataTable internen index ist beschädigt", nach, dass.
Was wäre der richtige Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein etwas gehackt zusätzliche version, die zeigt, wie laden Sie ein DataGrid bei der Bindung an eine DataView mit noch BeginInvoke.
Der code immer noch Lasten jeweils eine Zeile in der DataGrid-Komponente.
Sie müssen ändern, wie gebraucht; ich bin laden aus der AdventureWorks-Beispieldatenbank unter Verwendung der Geladenen Ereignis.
Hier ist, wie ViewModel funktioniert:
Hier ist das Fenster:
Hier ist das Fenster des code-behind-mit der Geladenen Veranstaltung:
Hier das ViewModel:
Wenn Sie verwenden Sie die BeginInvoke-Methode eines Fensters oder Steuerelements Eigenschaft Dispatcher, es
fügt die Stellvertretung, die Dispatcher, die Ereignis-queue; jedoch, erhalten Sie die Möglichkeit, geben Sie ein
niedrigere Priorität für Sie. Durch die Ausführung einer Methode, die Lasten nur ein Element in einer Zeit, die Fenster
Gelegenheit auszuführen, die zu einer anderen mit höherer Priorität Ereignisse in zwischen den Elementen. Dies ermöglicht es der
control oder Fenster angezeigt werden und sofort gerendert und lädt jedes Element ein zu einer Zeit.
Hier ist ein Beispielcode lädt eine ListBox.
Sie können diese anpassen, um Ihre DataGrid.
In diesem Beispiel habe ich ein ViewModel enthält eine ObservableCollection, die enthält ein Objekt ein.
Wenn Sie Probleme haben, die Umwandlung zu Ihrem DataGrid werde ich überarbeiten.
Hier ist Fenster XAML:
Hier ist das Fenster des code-behind-mit der Geladenen Veranstaltung:
Hier ist das ViewModel:
Und die Definition der Person für die Vollständigkeit: