Znalazłem rozwiązanie @ Killercam, które działa, ale było trochę podejrzane, jeśli użytkownik kliknął dwukrotnie zbyt szybko. Nie jestem pewien, czy inni też to stwierdzili. Znalazłem inne rozwiązanie tutaj .
Używa datagridów CellValueChangedi CellMouseUp. Changhong wyjaśnia to
„Przyczyną tego jest to, że zdarzenie OnCellvalueChanged nie zostanie uruchomione, dopóki DataGridView nie uzna, że zakończyłaś edycję. To ma sens dla kolumny TextBox, ponieważ OnCellvalueChanged nie [kłopocze] się uruchamianiem dla każdego uderzenia klawisza, ale nie [ ma sens] dla CheckBox. "
Oto jego przykład w akcji:
private void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
}
}
I kod informujący pole wyboru, że edycja jest zakończona po kliknięciu, zamiast czekać, aż użytkownik opuści pole:
private void myDataGrid_OnCellMouseUp(object sender,DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
myDataGrid.EndEdit();
}
}
Edycja: zdarzenie DoubleClick jest traktowane oddzielnie od zdarzenia MouseUp. Jeśli wykryte zostanie zdarzenie DoubleClick, aplikacja całkowicie zignoruje pierwsze zdarzenie MouseUp. Ta logika musi zostać dodana do zdarzenia CellDoubleClick oprócz zdarzenia MouseUp:
private void myDataGrid_OnCellDoubleClick(object sender,DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
myDataGrid.EndEdit();
}
}
CurrentCellDirtyStateChangedwydarzenie?