Saltar al contenido

¿Cómo detectar el cambio de evento DataGridView CheckBox?

Solución:

Para manejar el DatGridViews CheckedChanged evento primero debe obtener el CellContentClick al fuego (que no tiene el CheckBoxes el estado actual!) luego llame CommitEdit. Esto a su vez disparará el CellValueChanged evento que puede utilizar para hacer su trabajo. Este es un descuido de Microsoft. Haz algo como lo siguiente …

private void dataGridViewSites_CellContentClick(object sender, 
    DataGridViewCellEventArgs e)
{
    dataGridViewSites.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

/// <summary>
/// Works with the above.
/// </summary>
private void dataGridViewSites_CellValueChanged(object sender, 
    DataGridViewCellEventArgs e)
{
    UpdateDataGridViewSite();
}

Espero que esto ayude.

PD Consulte este artículo https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.currentcelldirtystatechanged(v=vs.110).aspx

Encontré que la solución de @Killercam funcionaba, pero era un poco dudosa si el usuario hacía doble clic demasiado rápido. No estoy seguro si otros han encontrado ese caso tampoco. Encontré otra solución aquí.

Utiliza la cuadrícula de datos CellValueChanged y CellMouseUp. Changhong explica que

“El motivo es que el evento OnCellvalueChanged no se activará hasta que DataGridView crea que ha completado la edición. Esto tiene sentido para una columna TextBox, ya que OnCellvalueChanged no lo haría [bother] disparar por cada pulsación de tecla, pero no [make sense] para un CheckBox “.

Aquí está en acción a partir de su ejemplo:

private void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
    {
        // Handle checkbox state change here
    }
}

Y el código para indicarle a la casilla de verificación que ha terminado de editar cuando se hace clic en él, en lugar de esperar hasta que el usuario abandona el campo:

private void myDataGrid_OnCellMouseUp(object sender,DataGridViewCellMouseEventArgs e)
{
    // End of edition on each click on column of checkbox
    if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
    {
        myDataGrid.EndEdit();
    }
}

Editar: un evento de DoubleClick se trata por separado de un evento de MouseUp. Si se detecta un evento de DoubleClick, la aplicación ignorará el primer evento MouseUp por completo. Esta lógica debe agregarse al evento CellDoubleClick además del evento MouseUp:

private void myDataGrid_OnCellDoubleClick(object sender,DataGridViewCellEventArgs e)
{
    // End of edition on each click on column of checkbox
    if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
    {
        myDataGrid.EndEdit();
    }
}

La solución de jsturtevants funcionó muy bien. Sin embargo, opté por hacer el procesamiento en el evento EndEdit. Prefiero este enfoque (en mi aplicación) porque, a diferencia del evento CellValueChanged, el evento EndEdit no se activa mientras se completa la cuadrícula.

Aquí está mi código (parte del cual es robado de jsturtevant:

private void gridCategories_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == gridCategories.Columns["AddCategory"].Index)
    {
        //do some stuff
    }
}



private void gridCategories_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex == gridCategories.Columns["AddCategory"].Index)
    {
        gridCategories.EndEdit();
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *