DataGridView: режим выбора EditOnEnter, позволяющий удалять строки - PullRequest
0 голосов
/ 25 мая 2018

По умолчанию DataGridView установлен в режим редактирования EditOnKeystrokeOrF2.Это означает, что для изменения значения комбинированного списка в этом представлении требуется два или три щелчка (на расстоянии дальше, чем интервал двойного щелчка пользователя).Поскольку это довольно странно для объекта пользовательского интерфейса, вы склонны думать, что элемент управления не работает.

К счастью, вы можете изменить режим выбора на EditOnEnter.Это сразу же выберет ячейку при щелчке по ней, а не сначала выберет строку, уменьшив количество кликов на 1. Однако DataGridViews реализованы несколько странно.В каждой строке есть ячейка «-1 th », которую нельзя выбрать вручную.

Когда эта ячейка '-1 th ' выбрана, в обычном режиме выбора выбирается строка, но в режиме "EditOnEnter" ячейка 1 st в строке выбран вместо.Если DataGridView настроен на включение удаления строки с помощью клавиши «Del», то использование EditOnEnter делает невозможным использование этой функции.

Как мне заставить обоих работать?Т.е. у меня нет представления, в котором пользователь может нажимать до 6 раз (пользователи, как правило, щелкают быстрее, когда им приходится делать это много раз), чтобы открыть окно, в то же время позволяя выбрать строкуиспользовать специальный столбец -1 th ?

1 Ответ

0 голосов
/ 25 мая 2018

Нужно программно переключаться между обоими режимами редактирования при нажатии любой ячейки в строке.Однако событие 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 будет мигать между режимами редактирования, очень кратко появляясь, как будто выбранная строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...