webentwicklung-frage-antwort-db.com.de

Was ist besser zu verwenden: ein DataGrid oder ListView für die Anzeige großer Datenmengen?

Ich möchte> 50000 Zeilen in einer Tabelle anzeigen. Welches ist das beste Steuerelement: ein DataGrid oder eine ListView (in der Detailansicht)? Welche dieser Steuerungen hat die bessere Leistung?

23
alex dee

Wie Hans in einem Kommentar zu der ursprünglichen Frage sagt, werden beide beide eine katastrophale Leistung erbringen, die nur durch den Unmut übertroffen wird, den Ihre Benutzer sicherlich im Wahnsinn erleben werden, wenn so viele Datenzeilen gleichzeitig angezeigt werden.

Wenn dies in Ihrer Anwendung jedoch unvermeidlich ist (und Sie eine sehr gute Suchfunktion bereitstellen), sollten Sie unbedingt die Option virtual mode verwenden, unabhängig davon, welche Steuerung Sie verwenden möchten . Dies bedeutet, dass Sie Ihre eigenen Datenverwaltungsvorgänge bereitstellen müssen, anstatt sich auf die Steuerung zu verlassen, um dies für Sie auszuführen. Der Vorteil ist, dass es viel schneller geht. Wie die Dokumentation sagt:

Der virtuelle Modus ist für die Verwendung mit sehr großen Datenbeständen ausgelegt. Wenn die VirtualMode-Eigenschaft true ist, erstellen Sie eine DataGridView mit einer festgelegten Anzahl von Zeilen und Spalten und behandeln dann das CellValueNeeded-Ereignis , um die Zellen zu füllen. Der virtuelle Modus erfordert die Implementierung eines zugrunde liegenden Datencaches, um die Auffüllung, das Bearbeiten und das Löschen von DataGridView-Zellen basierend auf den Aktionen des Benutzers auszuführen. Weitere Informationen zum Implementieren des virtuellen Modus finden Sie unter Gewusst wie: Implementieren des virtuellen Modus im DataGridView-Steuerelement von Windows Forms .

Oder für das ListView-Steuerelement :

Wenn Sie die VirtualMode-Eigenschaft auf true setzen, wird die ListView in den virtuellen Modus versetzt. Im virtuellen Modus wird die normale Items - Sammlung nicht verwendet. Stattdessen werden ListViewItem -Objekte dynamisch erstellt, wenn sie für die ListView erforderlich sind.

Der virtuelle Modus kann unter vielen Umständen nützlich sein. Wenn ein ListView-Objekt aus einer sehr großen Sammlung bereits im Speicher gefüllt werden muss, kann das Erstellen eines ListViewItem-Objekts für jeden Eintrag eine Verschwendung darstellen. Im virtuellen Modus werden nur die erforderlichen Elemente erstellt. In anderen Fällen müssen die Werte der ListViewItem-Objekte häufig neu berechnet werden. Wenn Sie dies für die gesamte Auflistung tun, führt dies zu einer inakzeptablen Leistung. Im virtuellen Modus werden nur die erforderlichen Elemente berechnet.

Um den virtuellen Modus verwenden zu können, müssen Sie das RetrieveVirtualItem -Ereignis behandeln, das jedes Mal ausgelöst wird, wenn für die ListView ein Element erforderlich ist. Dieser Ereignishandler sollte das ListViewItem-Objekt erstellen, das zum angegebenen Index gehört. Darüber hinaus muss die VirtualListSize-Eigenschaft auf die Größe der virtuellen Liste festgelegt werden.

Die Behandlung des SearchForVirtualItem-Ereignisses ermöglicht die Suche im virtuellen Modus. Wenn dieses Ereignis nicht behandelt wird, geben die Methoden FindItemWithText und FindNearestItem den Wert null zurück.

Sie können das CacheVirtualItems -Ereignis behandeln, um einen Cache von ListViewItem-Objekten zu verwalten. Wenn die Berechnung oder Suche zum Erstellen eines ListViewItem-Objekts teuer ist, kann die Verwaltung eines Cache die Leistung verbessern.

Wenn die View-Eigenschaft auf Tile gesetzt ist, wird der Wert automatisch in LargeIcon geändert, wenn VirtualMode auf true gesetzt ist.

Im virtuellen Modus ist die Sammlung Items deaktiviert. Der Versuch, darauf zuzugreifen, führt zu einer InvalidOperationException . Dasselbe gilt für die CheckedItems -Sammlung und die SelectedItems -Sammlung. Wenn Sie die ausgewählten oder geprüften Elemente abrufen möchten, verwenden Sie stattdessen die Sammlungen SelectedIndices und CheckedIndices .

28
Cody Gray

Verwenden Sie eine FastObjectListView aus dem ObjectListView -Projekt. 

50.000 Zeilen sind nichts, mit automatischer Sortierung, Filterung, Suche nach Typisierung und vielen anderen Gütern :)

13
Grammarian

Nicht Wenn Sie so etwas tun möchten, laden Sie die ersten und die letzten 100 Zeilen. Wenn der Benutzer hundert Zeilen nach unten scrollen soll, wird der nächste Stapel automatisch geladen. Zeigen Sie unter Strg + Ende die letzten 100 an und laden Sie den früheren Stapel vorab, falls der Benutzer einen Bildlauf durchführt.

Spielen Sie mit den Zahlen, bis Sie etwas erhalten, das sich für den Benutzer glatt anfühlt, ohne tatsächlich 50.000 Zeilen zu laden

0
Sylverdrag