Quiero mostrar> 50000 filas en una tabla. ¿Cuál es el mejor control para usar: un DataGrid o un ListView (en la vista de detalles)? ¿Cuál de estos controles tendrá el mejor rendimiento?¿Qué es mejor usar: un DataGrid o ListView para mostrar grandes cantidades de datos?
Respuesta
Como dice Hans en un comentario a la pregunta original, ambos van a tener un rendimiento abismal, superado solo por el disgusto que sus usuarios seguramente experimentarán ante la locura de tantas líneas de datos que se muestran al mismo hora.
Pero si esto es inevitable en su aplicación (y le proporcionan una buena función de búsqueda muy ), entonces usted debería considerar seriamente utilizar la opción virtual de modo, independientemente de la que el control que decida utilizar. Esto significa que debe proporcionar sus propias operaciones de administración de datos, en lugar de confiar en que el control lo haga por usted. La ventaja es que las cosas son mucho más rápidas. Como dice documentation:
El modo virtual está diseñado para su uso con grandes cantidades de datos. Cuando la propiedad
VirtualMode
es verdadera, crea unDataGridView
con un número establecido de filas y columnas y luego maneja elCellValueNeeded
event para rellenar las celdas. El modo virtual requiere la implementación de un caché de datos subyacente para manejar la población, la edición y la eliminación de las celdas de DataGridView en función de las acciones del usuario. Para obtener más información sobre la implementación del modo virtual, vea How to: Implement Virtual Mode in the Windows Forms DataGridView Control.
O, para la ListView
control:
Al establecer la propiedad
VirtualMode
a la verdadera pone elListView
en modo virtual. En el modo virtual, la colecciónItems
normal no se utiliza. En cambio, los objetosListViewItem
se crean dinámicamente cuando ListView los requiere.El modo virtual puede ser útil en muchas circunstancias. Si un objeto
ListView
debe rellenarse a partir de una gran colección que ya está en la memoria, crear un objetoListViewItem
para cada entrada puede ser un desperdicio. En el modo virtual, solo se crean los elementos necesarios. En otros casos, los valores de los objetosListViewItem
pueden necesitar ser recalculados con frecuencia, y hacer esto para toda la colección produciría un rendimiento inaceptable. En el modo virtual, solo se calculan los elementos necesarios.Para utilizar el modo virtual, debe manejar el
RetrieveVirtualItem
event, que se activa cada vez queListView
requiere un elemento. Este controlador de eventos debe crear el objetoListViewItem
que pertenece al índice especificado. Además, elVirtualListSize
property se debe establecer en el tamaño de la lista virtual.El manejo de
SearchForVirtualItem
event permite la búsqueda en modo virtual. Si no se maneja este evento, los métodosFindItemWithText
yFindNearestItem
devolverán nulo.Puede manejar el
CacheVirtualItems
event para mantener un caché de objetosListViewItem
. Si el cálculo o la búsqueda para crear un objetoListViewItem
es costoso, mantener un caché puede mejorar el rendimiento.Si el
View
property se establece en Mosaico, el valor cambiará automáticamente a LargeIcon cuandoVirtualMode
se establezca en verdadero.En modo virtual, la colección
Items
está deshabilitada. Intentar acceder a ella da como resultado unInvalidOperationException
. Lo mismo es cierto para la colecciónCheckedItems
y la colecciónSelectedItems
. Si desea recuperar los elementos seleccionados o marcados, use las coleccionesSelectedIndices
yCheckedIndices
en su lugar.
He hecho algunas investigaciones sobre esta solución y he encontrado que el modo virtual no existe en WPF:/hay alguna manera de hacer esta solución en WPF – Akrem
@Akrem : Eso es interesante. Su pregunta no dijo nada sobre WPF. De hecho, lo etiqueté como 'winforms' porque parecía que hablabas de los controles de WinForms, no de los de WPF. Supongo que fue un error. No, no tengo idea sobre WPF. Si etiquetó la pregunta WPF, no la habría respondido. –
@Cody Gray: la pregunta fue hecha por alex dee pero tengo el mismo problema en WPF. No quería hacer una nueva pregunta sobre lo mismo (¿o debo hacerlo?) – Akrem
Do not. Si desea hacer algo como esto, cargue las primeras 500 filas y las últimas 100. Cuando el usuario se desplaza por un centenar de filas, cargue el siguiente lote automáticamente. En Ctrl + Fin, muestra los últimos 100 y precarga el lote anterior en caso de que el usuario se desplace hacia arriba.
Juego con los números hasta que llegue algo que se siente suave para el usuario sin tener que cargar 50K filas
Esto es, por supuesto, lo que el modo virtual le permite implementar. Definitivamente no lo hagas manualmente capturando eventos 'KeyDown' o algo así. Eso es demasiado frágil. Existen muchas maneras para que los usuarios desplacen los controles.Y tampoco es propicio para implementar una función de búsqueda, que es * absolutamente vital * para los datos de esta cantidad. –
@Cody: ¡Genial! No estaba al tanto del modo virtual. Estoy de acuerdo que es claramente el camino a seguir. Para la función de búsqueda, no entiendo el problema. ¿No debería implementarse en el db mismo y no en el DGV? – Sylverdrag
utilizar un FastObjectListView
del proyecto ObjectListView.
50.000 filas no es nada, con la clasificación automática, filtrado, encontrar por escribir y un montón de otra bondad :)
- 1. Qué tipo de datos de columna debo usar para almacenar grandes cantidades de texto o html
- 2. ¿Cuál es la mejor manera de devolver grandes cantidades de datos binarios de un servicio web?
- 3. Almacenar grandes cantidades de datos: ¿DB o sistema de archivos?
- 4. ¿Cuál es la mejor manera de dibujar un gráfico con grandes cantidades de datos?
- 5. Mejor almacén de datos para grandes cantidades de datos con gran cantidad de lecturas y escrituras
- 6. Procesando grandes cantidades de datos usando multiprocesamiento
- 7. ¿Cuál es la mejor manera de sincronizar grandes cantidades de datos en todo el mundo?
- 8. Ideas de diseño para mostrar grandes cantidades de datos en una tabla html
- 9. Eliminar atómico para grandes cantidades de archivos
- 10. Práctica recomendada para almacenar grandes cantidades de datos con J2ME
- 11. ¿La mejor práctica para el servicio WCF con grandes cantidades de datos?
- 12. ¿Qué es mejor usar: Convert.ToX o X.Parse (...)?
- 13. Restful API - manejo de grandes cantidades de datos
- 14. Exportar grandes cantidades de datos al cliente en asp.net
- 15. Archivar grandes cantidades de datos antiguos en SQL Server
- 16. Listview vs datagrid
- 17. ¿Cuál es la alternativa a los cursores para recuperar grandes cantidades de datos de una base de datos?
- 18. patrón de 3 niveles y grandes cantidades de datos
- 19. ASP.NET MVC: devolver grandes cantidades de datos de FileResult
- 20. OutOfMemory al leer grandes cantidades de datos usando Hibernate
- 21. Dibujando grandes cantidades de píxeles en OpenGL
- 22. jQuery y anexar grandes cantidades de HTML
- 23. ¿Qué usar en Django: ListView o list_detail?
- 24. ¿Qué protocolo (FTP o HTTP) es mejor para descargar/cargar archivos pequeños o grandes?
- 25. MongoDB Enfoques para almacenar grandes cantidades de datos de métricas/análisis
- 26. Buscar grandes cantidades de texto constantemente actualizado en mysql
- 27. Can bittorrent peers handle seeding grandes cantidades de torrents inactivos
- 28. ¿Cómo debo almacenar cantidades extremadamente grandes de datos de tráfico para una fácil recuperación?
- 29. manera mas potente para almacenar grandes cantidades de cadenas estáticas
- 30. problema mmap, asigna grandes cantidades de memoria
¿Por qué no mostrar los datos paginado en lugar de mostrar> 50000 filas todos juntos. –
No hay 'mejor' con números como este. Mejor es 50 filas, la cantidad de filas que puede esperar que un humano lea sin querer desinstalar su programa. –
Pruebe ambas soluciones y vea los resultados. Hace poco utilicé DataGridView para mostrar más de 300k filas (si un usuario hace una selección de datos como esta) y no he notado ningún problema de rendimiento (si deshabilita la conversión de columnas). Por supuesto, hay algunas demoras, pero para tanta carga de datos, es aceptable. Todo depende de tu proyecto. – mj82