2011-05-22 31 views
20

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?

+0

¿Por qué no mostrar los datos paginado en lugar de mostrar> 50000 filas todos juntos. –

+27

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. –

+3

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

Respuesta

25

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 un DataGridView con un número establecido de filas y columnas y luego maneja el CellValueNeeded 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 el ListView en modo virtual. En el modo virtual, la colección Items normal no se utiliza. En cambio, los objetos ListViewItem 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 objeto ListViewItem para cada entrada puede ser un desperdicio. En el modo virtual, solo se crean los elementos necesarios. En otros casos, los valores de los objetos ListViewItem 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 que ListView requiere un elemento. Este controlador de eventos debe crear el objeto ListViewItem que pertenece al índice especificado. Además, el VirtualListSize 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étodos FindItemWithText y FindNearestItem devolverán nulo.

Puede manejar el CacheVirtualItems event para mantener un caché de objetos ListViewItem. Si el cálculo o la búsqueda para crear un objeto ListViewItem es costoso, mantener un caché puede mejorar el rendimiento.

Si el View property se establece en Mosaico, el valor cambiará automáticamente a LargeIcon cuando VirtualMode se establezca en verdadero.

En modo virtual, la colección Items está deshabilitada. Intentar acceder a ella da como resultado un InvalidOperationException. Lo mismo es cierto para la colección CheckedItems y la colección SelectedItems. Si desea recuperar los elementos seleccionados o marcados, use las colecciones SelectedIndices y CheckedIndices en su lugar.

+0

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

+0

@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. –

+0

@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

0

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

+3

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. –

+0

@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

12

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 :)

Cuestiones relacionadas