Details
Ich habe eine WPF Datagrid, die aus Linq-SQL-Abfrage Datenkontext-Datenelement lädt. Die Ergebnismenge enthält rund 200k Zeilen und es ist sehr langsam, sie zu laden, sortieren, filtern usw. Was ist die einfache und einfache Möglichkeit, die Geschwindigkeit zu verbessern?
Ein paar Dinge, die ich gesehen habe, sind Scrollview, Datenvirtualisierung usw. sprechen auch über Paging, Profiling usw.
Daten laden: 200.000 Zeilen sind eine Menge Daten, die niemand (Benutzer) an einem Ort sehen möchte. Es wird definitiv die Benutzerfreundlichkeit Ihrer Benutzeroberfläche reduzieren. Am besten filtern Sie Ihre Daten, um die Menge zu reduzieren (z. B. geschlossene Bestellungen nicht anzeigen, sondern nur offene anzeigen). Wenn Sie dies nicht können, sollten Sie Virtualisierung verwenden. Ich habe keine Anwendungen gesehen, die Seitenumbrüche verwenden, um Daten anzuzeigen (natürlich außer im Web). Meistens ist es nicht so ein guter Ansatz. Aber wenn Sie über eine Art von Daten sprechen, die wie Suchmaschinen Ergebnisse sind, müssen Sie sie verwenden. Bedenken Sie jedoch, dass die meisten Nutzer in Suchmaschinen-Suchergebnissen die Seite 10 nicht überschreiten werden.
Filtering: Ich würde vorschlagen, es auf Ihrer Server-Seite für eine so große Menge an Daten (SQL Server hier) zu tun, oder wie gesagt, zuerst die gesamten 200k filtern, um die Menge auf der Serverseite zu reduzieren und dann filtern Sie es (für den Benutzer), um etwas auf der Client-Seite zu finden. Vielleicht finden Sie auch den folgenden Link hilfreich:
Sortierung: Auch hier würde ich eine Server-Client-Lösung vorschlagen, aber Sie könnten auch folgende Links hilfreich finden:
Viele Benutzer verwenden nicht den Standardwert SortMemberPath
von WPF-Datagrid, nur weil sie reflection für jeden einzelnen Datensatz verwenden. Dadurch wird die Leistung des Sortierprozesses stark reduziert.
Hosein
Hier ist ein sehr gutes Beispiel für Datenvirtualisierung (nicht UI-Virtualisierung):
Obwohl es die LINQ IQueryable-Objekte nicht direkt unterstützt, können Sie dieses Beispiel jedoch so verwenden, wie es ist. Natürlich arbeite ich jetzt daran, es zu verbessern, um mit IQueryable-Objekten direkt zu arbeiten. Ich denke, es ist nicht so schwer.
Wow, 200K Zeilen sind eine Menge Daten. Paging klingt wie eine gute Idee. Versuchen Sie zu entscheiden, wie viele Zeilen pro Seite Sie möchten, sagen Sie 50. Wenn Sie den Bildschirm das erste Mal zeigen, zeigen Sie nur die ersten 50 an. Dann geben Sie dem Benutzer die Möglichkeit, zwischen den Seiten zu wechseln.
Das Sortieren kann jedoch auf diese Weise komplizierter sein.
Virtualisierung kann eine andere Option sein, leider muss ich noch mit Virtualisierung arbeiten.
Manchmal müssen nur ~ 30 sichtbare Zeilen geladen werden, und wenn diese Zeilen + jede Spalte wegen ihrer Anzahl und Komplexität der einzelnen Zellen (ihre Vorlage oder die Anzahl ihrer wpf-Elemente) teuer zu laden ist, dann keine Die obigen Kommentare machen wirklich einen Unterschied. Jede Zeile wird ihre Zeit zum Laden brauchen!
Es hilft, jede Zeile auf der Benutzeroberfläche zu staffeln oder zu laden, so dass der Benutzer sieht, dass der Benutzer etwas tut und nicht nur für ~ 10 + Sekunden einfriert. Der Einfachheit halber wird vorausgesetzt, dass das Datagrid ItemSource="{Binding Rows}" und Rows IEnumerable ist, wobei Row eine Klasse ist, die Sie erstellt haben: Fügen Sie eine Eigenschaft IsVisible zu Row hinzu (Vergessen Sie nicht, die Eigenschaftsänderung zu ändern)
Sie könnten so etwas tun:
%Vor%oh, und vergessen Sie nicht, in XAML auszulösen:
%Vor%Die Frage, die Sie stellen sollten, ist:
Tags und Links wpf .net c# visual-studio-2008 wpfdatagrid