Нужно программно переключаться между обоими режимами редактирования при нажатии любой ячейки в строке.Однако событие CellClick
срабатывает слишком поздно: после того, как строка уже выбрана.Наивно просто переключать EditMode
будет означать, что первый щелчок на поле выбора строки не будет работать, в то время как второй будет работать, что будет выглядеть как ошибочное поведение.
Хитрость заключается в том, чтобы делать намного больше вручную.Следующий обработчик события, при подключении к событию CellClick
, решит почти все проблемы.
Private Sub CellSelect(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles myDataGridView.CellClick
Dim dgv As DataGridView = CType(sender, DataGridView)
If dgv.Rows.Count = 0 Then
Return
End If
Dim rowToSelect As Integer = e.RowIndex
Dim columnToSelect As Integer = e.ColumnIndex
If e.RowIndex = -1 Then
rowToSelect = 0
End If
If rowToSelect >= dgv.Rows.Count Then
rowToSelect = 0
End If
If columnToSelect = -1 Then
dgv.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect
dgv.CurrentCell = Nothing
dgv.Rows(rowToSelect).Selected = True
Else
If columnToSelect >= dgv.Rows(rowToSelect).Cells.Count Then
columnToSelect = 0
End If
dgv.EditMode = DataGridViewEditMode.EditOnEnter
dgv.SelectionMode = DataGridViewSelectionMode.CellSelect
dgv.Rows(rowToSelect).Cells(columnToSelect).Selected = True
End If
End Sub
Работает путем сброса выбранной ячейки, а затем установки выбранной строки программно.Так как режим редактирования был изменен заранее, он выберет всю строку, а не только первую ячейку, даже в первый раз, когда щелкнет поле выбора строки.
Существует также целый ряд крайних случаев, когда пользователь, который щелкает достаточно быстро, может создавать события щелчка на несуществующих ячейках.Таким образом, мы предполагаем, что эти клики находятся в ячейке [0,0], поэтому, по крайней мере, наше приложение не взорвется.
Это не идеальное решение (пока).При таком решении: остается небольшой графический сбой;в течение примерно одного кадра DataGridView будет мигать между режимами редактирования, очень кратко появляясь, как будто выбранная строка.