У меня есть проблема, которую я не знаю, как решить. У меня есть DataGridView (EditMode = EditProgrammatically
). Эта сетка имеет один столбец флажка и один или несколько столбцов текстового поля. Функциональность следующая (или должна быть как минимум):
- Когда вы нажимаете на флажок, флажок должен быть переключен
- Если выбрана строка (или несколько строк), и вы нажимаете пробел, флажки должны быть переключены.
У меня есть два обработчика событий:
private void grid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex == useColumn.Index)
{
if (ModifierKeys != Keys.Shift && ModifierKeys != Keys.Control)
{
ToggleRows(grid.SelectedRows);
}
}
}
private void RowSelectorForm_KeyDown(object sender, KeyEventArgs e)
{
if (grid.Focused && e.KeyCode == Keys.Space)
{
ToggleRows(grid.SelectedRows);
e.Handled = true; // Not sure if this is needed or even does anything
e.SuppressKeyPress = true; // Or this for that matter...
}
}
Это почти работает. Проблема в том, когда вы нажимаете пробел и клетка флажка активна. Когда ячейка текстового поля активна, она работает так, как должна. Проблема в том, что когда вы нажимаете пробел и ячейка флажка активна, оба события запускаются. Это означает, что он сначала выбирает, а затем отменяет выбор (или наоборот). Таким образом, флажки в конечном итоге, как они были. Как я могу предотвратить это?
Я думал об использовании флага, но не уверен, где я могу его поставить, поскольку я не могу точно знать, было ли это двойным событием или это был только пользователь, использующий пробел и затем щелкающий мышью. Так что это не может быть использовано, я думаю. Есть ли другое событие, которое я должен использовать? Есть ли способ узнать, была ли ячейка нажата мышью или пробелом? Есть ли способ отключить автоматическое переключение флажка при нажатии пробела? Что я могу сделать?
Примечание : причина для RowSelectorForm_KeyDown, а не просто grid_KeyDown, заключалась в том, что я пытался использовать KeyPreview, а затем подавлять нажатие клавиши, если оно было пробелом и сетка была сфокусирована. Но этот SuppressKeyPress, похоже, вообще ничего не делает = / Может быть, я просто неправильно понял ...