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 CellValueChanged
i 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();
}
}
CurrentCellDirtyStateChanged
wydarzenie?