Ho trovato la soluzione di @ Killercam per funzionare, ma era un po 'rischioso se l'utente faceva doppio clic troppo velocemente. Non sono sicuro che anche gli altri abbiano trovato il caso. Ho trovato un'altra soluzione qui .
Usa i datagrid CellValueChanged
e CellMouseUp
. Changhong lo spiega
"Il motivo è che l'evento OnCellvalueChanged non si attiverà fino a quando DataGridView non riterrà che tu abbia completato la modifica. Questo ha senso per una colonna TextBox, poiché OnCellvalueChanged non si [preoccuperebbe] di attivarsi per ogni colpo di tasto, ma non [ ha senso] per un CheckBox. "
Eccolo in azione dal suo esempio:
private void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
}
}
E il codice per dire alla casella di controllo che è stato modificato quando viene cliccato, invece di aspettare che l'utente lasci il campo:
private void myDataGrid_OnCellMouseUp(object sender,DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
myDataGrid.EndEdit();
}
}
Modifica: un evento DoubleClick viene trattato separatamente da un evento MouseUp. Se viene rilevato un evento DoubleClick, l'applicazione ignorerà completamente il primo evento MouseUp. Questa logica deve essere aggiunta all'evento CellDoubleClick oltre all'evento MouseUp:
private void myDataGrid_OnCellDoubleClick(object sender,DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
myDataGrid.EndEdit();
}
}
CurrentCellDirtyStateChanged
Evento?