I want to display >50000 rows in a table. Which is the best control to use: a DataGrid or a ListView (in details view)? Which of these controls will have the better performance?
Use a FastObjectListView
from the ObjectListView project.
50,000 rows is nothing, with automatic sorting, filtering, find-by-typing and loads of other goodness :)
Don't. If you want to do something like this, load the first 500 rows and the last 100. When the user scrolls down a hundred rows, load the next batch automatically. On Ctrl+End, display the last 100 and preload the earlier batch in case the user scrolls up.
Play with the numbers until you get something that feels smooth for the user without actually loading 50K rows
As Hans says in a comment to the original question, they're both going to have abysmal performance, surpassed only by the displeasure that your users will surely experience at the insanity of so many lines of data being displayed at the same time.
But if this is unavoidable in your application (and you provide a very good search function), then you should strongly consider using the virtual mode option, regardless of which control you decide to use. This means that you must provide your own data-management operations, rather than relying on the control to do it for you. The advantage is that things are much faster. As the documentation says:
Virtual mode is designed for use with very large stores of data. When the
VirtualMode
property is true, you create aDataGridView
with a set number of rows and columns and then handle the CellValueNeeded event to populate the cells. Virtual mode requires implementation of an underlying data cache to handle the population, editing, and deletion of DataGridView cells based on actions of the user. For more information about implementing virtual mode, see How to: Implement Virtual Mode in the Windows Forms DataGridView Control.
Or, for the ListView control:
Setting the
VirtualMode
property to true puts theListView
into virtual mode. In Virtual mode, the normal Items collection is unused. Instead, ListViewItem objects are created dynamically as the ListView requires them.Virtual mode can be useful under many circumstances. If a
ListView
object must be populated from a very large collection already in memory, creating aListViewItem
object for each entry can be wasteful. In virtual mode, only the items required are created. In other cases, the values of theListViewItem
objects may need to be recalculated frequently, and doing this for the whole collection would produce unacceptable performance. In virtual mode, only the required items are calculated.In order to use virtual mode, you must handle the RetrieveVirtualItem event, which is raised every time the
ListView
requires an item. This event handler should create theListViewItem
object that belongs at the specified index. In addition, the VirtualListSize property must be set to the size of the virtual list.Handling the SearchForVirtualItem event enables searching in virtual mode. If this event is not handled, the FindItemWithText and FindNearestItem methods will return null.
You can handle the CacheVirtualItems event in order to maintain a cache of
ListViewItem
objects. If the calculation or lookup to create aListViewItem
object is expensive, maintaining a cache can improve performance.If the View property is set to Tile, the value will automatically be changed to LargeIcon when
VirtualMode
is set to true.In virtual mode, the Items collection is disabled. Attempting to access it results in an InvalidOperationException. The same is true of the CheckedItems collection and the SelectedItems collection. If you want to retrieve the selected or checked items, use the SelectedIndices and CheckedIndices collections instead.