Вы можете использовать метод CancelEdit()
:
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
// Just an example for a "wrong value".
bool someCondition = (e.FormattedValue.ToString() == "c");
if (someCondition)
{
dgv.CancelEdit();
}
}
Обратите внимание, что для требования № 3 это вернет фокус только на ячейку, которая редактировалась, если этоновый рядЕсли этого недостаточно, и вы хотите сфокусироваться на предыдущей ячейке, несмотря ни на что, вы можете использовать что-то вроде этого: (немного странно, но работает)
// Don't forget the async modifier
// ↓↓↓↓↓
private async void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
// Just an example for a "wrong value".
bool someCondition = (e.FormattedValue.ToString() == "c");
if (someCondition)
{
dgv.CancelEdit();
await Task.Delay(50);
dgv.CurrentCell = dgv[e.ColumnIndex, e.RowIndex];
}
}