WPF Datagrid: Lazy Laden / Infinite Scroll

9

Ich fülle das Datagrid mit 250 Zeilen. Wenn der Benutzer mit der Bildlaufleiste nach unten scrollt (z. B. unter 75%), möchte ich die nächsten 250 Zeilen aus der Datenbank abrufen und so weiter. Die Idee ist, dass das Grid Millionen von Ergebnissen haben kann und wir nicht alle laden wollen, bis der Benutzer sie anfordert. Gibt es dafür einen Mechanismus?

EDIT: Weil es eine Menge Verwirrung zu geben scheint: Ich suche nicht nach den Standardlösungen für die Datenvirtualisierung, ich benutze bereits sie . Aber alle erfordern, dass Sie die Anzahl der "virtuellen Zeilen" im Voraus angeben, und diese Abfrage ist für mich zu teuer. Der Grund, warum sie es benötigen, ist, weil es so viel einfacher ist, die aktuelle Seite / Offset / etc zu berechnen, wenn Sie die gesamten Elemente im Raster kennen. Aber es ist eine sehr teure SQL-Abfrage, um diesen Betrag zu berechnen, also möchte ich zu einer anderen Lösung migrieren, wo ich die COUNT () Abfrage überspringen kann.

    
Muis 28.09.2011, 10:22
quelle

2 Antworten

1

Es sieht so aus, als ob die Virtualisierungseigenschaft von DataGrid Ihnen nicht helfen würde, da ein vollständiger Datensatz in ItemsSource benötigt wird.

So, um ein Daten-Lazy-Laden zu haben (Siehe einen Artikel Datenvirtualisierung ) Sie können mit < a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.scrollchanged.aspx"> ScrollViewer.ScrollChanged Ereignis und wenden einen klassischen serverseitigen Paging-Ansatz an . Grundsätzlich müssen Sie solche Zeichen wie Page Size , Page Number , Sort Order definieren und berechnen. Auf diese Weise können Sie von einer Datenbank einen benötigten Datensatz anfordern und auf der Benutzeroberfläche anzeigen. Jedes Mal, wenn sich Current Page Number oder Sort Order ändert, musst du Daten anfordern und ItemsSource des Rasters aktualisieren, vielleicht musst du auch die Scroll-Position wiederherstellen, aber ich bin mir nicht sicher.

  • Anzahl der sichtbaren Objekte berechnen
  • Führen Sie eine Datenanforderung an die Datenbank aus, um eine parametrisierte Abfrage mit Parametern wie PageNumber, PagiSize
  • zu verwenden
  • Aktualisieren Sie DataGrid ItemsSource durch eine gerade geladene Datenelemente

Ich glaube, eine Hauptherausforderung wäre, einen Wert von Page Size, Current Page Number zu berechnen. Ich glaube, Logical Scrolling Modus würde Ihnen dabei helfen.

    
sll 28.09.2011 15:35
quelle
0

Setzen Sie die Eigenschaft EnableRowVirtualization von DataGrid auf true

Zeilen werden daher geladen, wenn der Benutzer scrollt, sodass nur die sichtbaren Zeilen tatsächlich geladen werden

    
Damascus 28.09.2011 10:35
quelle