2011-10-03 22 views
7

Tengo un DataGridView con una columna de casilla de verificación. Estoy intentando crear un botón de seleccionar/deseleccionar todo. El código para cambiar los valores es bastante fácil, pero el rendimiento es horrendo.Casilla de casilla de verificación DataGridView "seleccionar todo" rendimiento

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells["Selected"].Value = _selectAll; 
} 

_selectAll es simplemente un toggle bool variable. ¿Hay una mejor manera de hacer esto donde el rendimiento es rápido? También intenté cambiar el valor en la DataTable subyacente. Todavía toma varios segundos para unas pocas cientos filas, pero la mayoría del trabajo se realizará en miles de filas.

EDITAR & SOLUCIÓN (2011/10/4)

El problema principal era en las propiedades DGV. Una vez me puse,

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

rendimiento mejorado de manera espectacular (por MSDN DataGridView Performance). Las soluciones sugeridas a partir de esta edición también mejorarían ligeramente el rendimiento.

+1

Intente acceder a la columna por índice en lugar de por nombre. p.ej. 'dgv.Rows [i] .Cells [1] .Value = _selectAll;' –

+0

¿Tiene una cuadrícula limitada a cualquier propiedad o simplemente proporcionándola desde el código? –

+1

¿Estás seguro de que es donde está el cuello de la botella? Yo pienso que está en otro lado. –

Respuesta

6

Muchas gracias, estableciendo la propiedad AutoSizeColumnsMode

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

el rendimiento es mucho mejor ...

0

No estoy seguro si obtendrá un aumento de rendimiento o no, sino otra cosa que puede probar:

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv["Selected", i].Value = _selectAll; 
} 
0

En lugar de dar el nombre de columna gridview, u puede especificar qué columna pertenece to.This se trabaja mas rápido. Espero eso ayude.

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells[4].Value = _selectAll; 
} 
1

Bueno, este es un problema común.
En primer lugar, ¿tiene algún proceso asociado con el cambio marcado Checkbox?
Si es así, crea una variable de miembro bool.
Inicialízelo en falso antes de realizar Seleccionar todo/Deseleccionar todo.
En el evento de cambio comprobado CheckBox -> verifique el valor del parámetro bool.
Si se trata de un retorno falso del evento. No proceses nada.
Después de completar el bucle for para seleccionar Seleccionar todo/Deseleccionar todo, procese el evento de cambio marcado si es necesario.
No olvide restablecer el parámetro bool en true after for loop.

bool _allowProcessing = false; 
//SelectAll/Deselect All 
for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells[4].Value = _selectAll; 
} 
_allowProcessing = true; 
// Do some processing if required 

// Checked change event 
public void CheckBox_CheckedChange(object sender, eventArgs e) 
{ 
    if(!_allowProcessing) 
    return; 

    // Do Processing 
} 
+0

Esta parece ser la solución más completa de las sugeridas. Tenga en cuenta la edición en mi pregunta que aborda la razón principal del bajo rendimiento. – Handprint

0

me muestran otra manera de mejorar este problema.
El acceso a datagridview directamente como dgv.Rows[i].Cells["Selected"].Value hace que datagridview lentamente.

Por lo tanto, el cambio de origen de datos y la actualización de datagridview hace que el rendimiento sea mejor si su datagridview tiene un origen de datos y la fuente de datos ha verificado el estado.

foreach (var item in yourDataSource) 
{ 
    item.Checked = _selectAll; 
} 
dgv.Invalidate(); 
Cuestiones relacionadas