WPF DataGrid es muy lento para procesar

He intentado usar tanto de una manera personalizada, DataGrid, así como el stock uno en WPF. He intentado rellenar manualmente, así como a través de enlaces. En ambos casos son lentos.

Tengo un scenerio donde el usuario hace clic en un botón y un DataGrid aparece con los datos adecuados. Actualmente estoy en la prueba de concepto y modo de sólo utilizando datos de la muestra. Tengo un conjunto de datos con una tabla que tiene 10 filas en él.

Si no me adjuntar todos los datos en el DataGrid cuando hago clic en el botón el vacío DataGrid muestra prácticamente al instante, un usuario no puede percibir un retraso. Tan pronto como puedo agregar 10 filas de datos, de 6 columnas, la demora es de aproximadamente 2 segundos, muy perceptible para el usuario.

Incluso he intentado llenar con datos vacía, sólo para conseguir una rejilla vacía a aparecer y es igual de lento.

for (int i = 0; i < 10; i++)
    _dataGrid.Items.Add("");

Puedo poner un temporizador para contar los pasos desde cuando se pulsa el botón a cuando todo el código se ejecuta a dibujar el control DataGrid y es alrededor de 20 milisegundos, por lo que el código se ejecuta muy rápido, pero en la pantalla es donde el grande que es el lag. He intentado un GridView y se hace más veloz en la pantalla.

He escuchado varios informes de lento DataGrid dibujo con escenarios complejos y el uso de 1000 filas, pero esto es tan simple como se pone, 6 columnas por 10 filas llenas de vacíos de datos.

De sólo lectura de la pantalla es un GridView igualmente opción viable para el control DataGrid?


Actualización

Aquí es la creación de mis columnas.

                DataGridTextColumn column = new DataGridTextColumn();
                column.ColumnWidthChanged += new ColumnWidthChangedEventHandler(column_ColumnWidthChanged);

                column.Header = entity.GetPropertyValue("ColumnLabel");
                column.Binding = new Binding(entity.GetPropertyValue("Tag"));
                column.Width = new DataGridLength(entity.GetPropertyDouble("DisplaySize"));
                _dataGrid.Columns.Add(column);

Este es un ¿cómo puedo enlazar el conjunto de datos con 10 filas en él.

                _dataGrid.ItemsSource = ds.Tables[0].DefaultView;
                _dataGrid.DataContext = ds.Tables[0];

No está seguro de lo que puedo hacer de manera diferente.

  • quizá su hardware?
  • He probado la aplicación en otro sistema y que era lento así. El problema es que en algún punto de vista tiene varios DataGrid en ellos, por lo que el retraso sólo aumenta por cada DataGrid.
  • yo uso el estándar de wpf datagrid con la dinámica de las columnas y más de 10000rows y no tienen ningún problema con eso. ¿cuál es tu itemssource? un datatable o somekind de colección? esperemos que no se agregar los elementos en un foreach como tú post??
  • He probado el bucle for como en el post para ver si se podía hacer una diferencia, yo no estaba seguro de si la unión era el problema. En el caso real que tengo un conjunto de datos que estoy de unión. Voy a actualizar el post.
  • Muy estrechamente relacionado con: stackoverflow.com/questions/697701/wpf-datagrid-performance/…

9 Kommentare

  1. 33

    Se tiene:

    • Habilitado VirtualizingStackPanel.VirtualizationMode para un Grid? si no intenta establecer.
    • Conjunto VirtualizingStackPanel.IsVirtualizing=»true» para que DataGrid
    • Envuelto en una Cuadrícula por un StackPanel contenedor? Si la respuesta es sí tratar de quitar.
    • Envuelto en una red externa de control ScrollViewer? Si la respuesta es sí tratar de quitar.

    Un punto más,
    podría enlazar toda la colección de elementos a la vez en lugar de la adición de cada elemento en la red.Artículos de colección?

    • Trató de pegar mi XAML, pero no salió bien, voy a tratar de actualizar mi pregunta original. El control DataGrid está contenida dentro de un DockPanel. No a la ScrollViewer y yo no hacer referencia a VirtualizingStackPanel.VirtualizationMode.
    • Intenta establecer VirtualizingStackPanel.VirtualizationMode para el Reciclaje, por ejemplo: <Rejilla VirtualizingStackPanel.VirtualizationMode=»Reciclaje» … />
    • Gracias por la sugerencia, pero no parece haber ayudado.
    • Seguramente has intentado añadir esta propiedad para control DataGrid no una Cuadrícula? También intenta establecer VirtualizingStackPanel.IsVirtualizing=»true» para que DataGrid
    • Sí, yo había probado en un DataGrid, agregó IsVirtualizing así y que en realidad se parecía a reducir la velocidad. Estoy realmente perplejo. El código se ejecuta muy rápido, es solo el update que es lento.
    • Gracias hombre por el post, yo no creo que la inserción de datagrid en la pila del panel puede resultar en una velocidad de procesamiento mucho. En mi caso, la diferencia en la pila del panel y el exterior era casi 100 veces.

  2. 25

    Un consejo general para DataGrid problemas de rendimiento: he tenido un problema con el control DataGrid en el cual se llevó a literalmente segundos para actualizar después de un cambio de tamaño de ventana, columna, tipo, etc. y bloqueado hasta la ventana de la interfaz de usuario mientras se estaba haciendo (1000 filas, 5 columnas).

    Llegó a un problema (bug?) con WPF tamaño de los cálculos. Yo lo tenía en una cuadrícula con las RowDefinition Height="Auto" que fue el causante de que el sistema de representación a intentar y volver a calcular el tamaño de la cuadrícula de datos en tiempo de ejecución para medir el tamaño de cada columna y fila, presumiblemente mediante la cumplimentación de la totalidad de la red (como yo lo entiendo). Se supone que es para manejar esto de manera inteligente, de alguna manera, pero en este caso no fue así.

    Una comprobación rápida para ver si esto es un problema relacionado es el de establecer la Height y Width propiedades del DataGrid a un tamaño fijo para la duración de la prueba, y probar de nuevo. Si su rendimiento es restaurado, una permanente revisión puede ser entre estas opciones:

    • Cambiar los tamaños de los elementos que contiene a ser relativa (*) o
      valores fijos
    • Conjunto MaxHeight y MaxWidth del DataGrid a un valor fijo más grande
      de lo que se podía obtener en condiciones normales de uso
    • Trate de otro tipo de contenedor con diferentes cambio de tamaño de la estrategia deGrid,
      DockPanel, etc)
    • Yo tenía el mismo problema con un DataGrid contenida en una Cuadrícula de diseño de la estrella de tamaño de fila. Configuración de MaxHeight como se sugiere funciona como un encanto.
  3. 12

    Un blog He encontrado en Google me dio una especie de solución. Como el autor dice, he desactivado GroupStyle, y la velocidad de renderizado problema fue resuelto. Pero necesitaba la agrupación. El autor dijo

    VirtualizingPanel.IsVirtualizingWhenGrouping

    se agrega .NET 4.5. Así que me puse a true. Ahora la representación es rápido con la agrupación. El problema es… que el desplazamiento es desigual. No inaceptablemente desigual, pero notablemente desigual. He tenido un problema similar cuando traté de crear una vista de árbol con 2000+ nodos expandidos. Sin virtualización, la representación fue lento, pero el desplazamiento fue suave. Con la virtualización, la representación fue rápida, pero el desplazamiento era desigual.

    ¿Por qué no podemos tener ambas…

    • Esta única línea resuelto mi problema exacto – ¡muchas gracias! Yo jugueteaba con el asyn Tarea para la que yo estoy usando para cargar los datos cuando finalmente me di cuenta de que la representación era el verdadero problema. Añadido VirtualizingPanel.IsVirtualizingWhenGrouping="True" y la población de mi DataGrid ist ahora de alrededor de 10 segundos a menos de un segundo.
    • También trabajó para mí! Bajó de 10 a 30 segundos, a menos de 1.
    • También para mí fue esta la solución! Muchas gracias!
    • ¿Cuál es la solución cuando no se utiliza la agrupación?
  4. 11

    En mi caso tuve un problema con DataGridCell ControlTemplate que frenó la representación camino hacia abajo.

    Ser conscientes de que la relación velocidades de carga para un gran conjunto de datos son muy diferentes para el uso de TextBlock (que no es de texto seleccionable) o TextBox en modo ReadOnly:

    El tiempo de carga de 59 segundos:

    <Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <TextBox IsReadOnly="True" Text="{Binding Mode=OneWay}"/> 
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    El tiempo de carga de 21 segundos:

    <Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                         <ContentPresenter Content="{Binding}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    El tiempo de carga de 16 segundos:

    <Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <TextBlock Text="{Binding}"></TextBlock>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  5. 5

    Bien un poco añadiendo más (sé que es muy viejo el tema, pero aun así, se ayuda a alguien)…

    Traté de

    EnableColumnVirtualization="True" VirtualizingPanel.VirtualizationMode="Recycling"
    EnableRowVirtualization="True" 

    para DataGrid(AutoGenerateColumns="True") de la unión a DataTable.DefaultView() y Ningún efecto en la velocidad, todavía era horrible para la Velocidad así como para la navegación entre las filas. Que, se me ocurrió la solución para establecer la Altura y la Anchura de DataGrid. Además también he puesto

    RowHeight="23" 
    ScrollViewer.HorizontalScrollBarVisibility="Visible"
    ScrollViewer.VerticalScrollBarVisibility="Visible"

    Esto hace que mi página de llenar muy rápido… en Lugar de 2 min, ahora se tarda apenas 10-12 segundos.

    Espero que ayude a alguien.

    Nota: estoy usando .Net 4.5

  6. 2

    Para mí fue:

    <Setter Property='ScrollViewer.CanContentScroll' Value='False' />

    Esto quité el estilo y la representación se convirtió rápidamente.

    • Para aclarar, establecer ScrollViewer.CanContentScroll a true como un valor de false va a deshabilitar la virtualización.
    • Con CanContentScroll en falso yo tenía 20 años el tiempo de carga… en verdad, el tiempo de carga es instantáneo. Pero el desplazamiento suave se ha ido.
  7. 2

    Yo estaba teniendo grandes problemas con 1000 filas, 5 columnas donde el tiempo de render estaba tomando 7-10 segundos, pero la solución se encuentra en https://www.elegant-software.net/2014/05/performance-of-the-wpf-datagrid.html hizo la rejilla de carga al instante!

    <DataGrid
       EnableRowVirtualization="True"
       EnableColumnVirtualization="True">
    • Como una rápida actualización sobre esto – En mi escenario, había una casilla de verificación al final de cada fila para que los usuarios seleccionen la que las filas que sea necesario y una vez completado, se presentará el seleccionado, pero he encontrado en la fila de virtualización estaba habilitado, debido a su naturaleza de procesamiento únicamente lo que está en la pantalla, no contar las filas seleccionadas que no eran visibles en la pantalla, que llevó a un par de cuestiones. Para combatir esto, he añadido/quitado el seleccionado IDs a un hashset variable cuando la fila seleccionada, y un seguimiento de ellos de esta manera
  8. 1

    Tengo una Surface Pro 3, sobre la que mi datagrid, con cerca de 200 filas y 10 columnas, era muy lento en el desplazamiento, desigual y vacilante.

    Pensé que era de la red, pero que era en realidad la tarjeta gráfica no ser capaz de mantener con – espere – un efecto de sombra paralela en el datagrid sí misma, aunque el fondo del control se establece en un color sólido.

    Me comentó el efecto y se fue de 4 a 5 veces más rápido.

    Espero que esto ayude.

  9. 0

    Tengo el mismo problema con el enlazado de Datos de la cuadrícula, y me doy cuenta de que en la primera carga es rápido, pero en secand y lo siguiente es que es lento. Así que cuando puedo añadir en el código

    DataGrid.ItemsSource = Nothing y, a continuación, TableAdapter.Fill(Mydataset.MyStoredProcedure,....) DataGrid.ItemsSource=Mydataset.MyStoredProcedure se convirtió muy RÁPIDO

    • lo siento, quisiera saber más detalles?
    • Necesitamos más detalles como se puede ver, parece que hay un montón de problemas de rendimiento con el control datagrid.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea