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?
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 eineDataGridView
mit einer festgelegten Anzahl von Zeilen und Spalten und behandeln dann dasCellValueNeeded
-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 dieListView
in den virtuellen Modus versetzt. Im virtuellen Modus wird die normaleItems
- Sammlung nicht verwendet. Stattdessen werdenListViewItem
-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 einesListViewItem
-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 derListViewItem
-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 dieListView
ein Element erforderlich ist. Dieser Ereignishandler sollte dasListViewItem
-Objekt erstellen, das zum angegebenen Index gehört. Darüber hinaus muss dieVirtualListSize
-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 MethodenFindItemWithText
undFindNearestItem
den Wert null zurück.Sie können das
CacheVirtualItems
-Ereignis behandeln, um einen Cache vonListViewItem
-Objekten zu verwalten. Wenn die Berechnung oder Suche zum Erstellen einesListViewItem
-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, wennVirtualMode
auf true gesetzt ist.Im virtuellen Modus ist die Sammlung
Items
deaktiviert. Der Versuch, darauf zuzugreifen, führt zu einerInvalidOperationException
. Dasselbe gilt für dieCheckedItems
-Sammlung und dieSelectedItems
-Sammlung. Wenn Sie die ausgewählten oder geprüften Elemente abrufen möchten, verwenden Sie stattdessen die SammlungenSelectedIndices
undCheckedIndices
.
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 :)
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