winform - fill datagridview c# with list
Columna de casilla de verificación DataGridView "seleccionar todo" el rendimiento (5)
Bueno, este es un problema común.
Primero, ¿tiene algún proceso asociado con el cambio marcado Checkbox?
Si es así, crea una variable de miembro bool.
Inícielo en falso antes de realizar Seleccionar todo / Deseleccionar todo.
En el CheckBox marcado cambiar evento -> verificar el valor del parámetro bool.
Si se trata de un retorno falso del evento. No proceses nada.
Después de completar el ciclo de bucle para configurar Seleccionar todo / Deseleccionar todo, procese el evento de cambio marcado si es necesario.
No olvides restablecer el parámetro bool a 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
}
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.
for (int i = 0; i < dgv.RowCount; i++)
{
dgv.Rows[i].Cells["Selected"].Value = _selectAll;
}
_selectAll es simplemente una variable de alternar bool. ¿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.
EDICIÓN Y SOLUCIÓN (2011/10/4)
El problema principal estaba en las propiedades DGV. Una vez que configuro,
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
el rendimiento mejoró dramáticamente (por rendimiento MSDN DataGridView ). Las soluciones sugeridas a partir de esta edición también mejorarían ligeramente el rendimiento.
No estoy seguro de si obtendrá un aumento de rendimiento o no, pero puede probar algo más:
for (int i = 0; i < dgv.RowCount; i++)
{
dgv["Selected", i].Value = _selectAll;
}
En lugar de dar el nombre de columna gridview, puede especificar a qué columna pertenece. Esto funcionará más rápido. Espero eso ayude.
for (int i = 0; i < dgv.RowCount; i++)
{
dgv.Rows[i].Cells[4].Value = _selectAll;
}
Muchas gracias configurando la propiedad AutoSizeColumnsMode
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
el rendimiento es mucho mejor ...
Muestro otra forma de mejorar este problema.
Accediendo 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 la vista de tabla de datos hacen que el rendimiento sea mejor si su vista de tabla de datos tiene fuente de datos y la fuente de datos ha verificado el estado.
foreach (var item in yourDataSource)
{
item.Checked = _selectAll;
}
dgv.Invalidate();