Как мы можем обрабатывать DataGridView неправильно теряя фокус при использовании в форме, доступ к которой осуществляется через Interop - PullRequest
1 голос
/ 04 ноября 2011

Мы обнаружили возможную ошибку, связанную с DataGridView. DataGridView имеет свойство StandardTab, которое по умолчанию имеет значение False. Эта настройка по умолчанию означает, что клавиша TAB перемещается между ячейками в сетке. Когда он достигает последней ячейки в сетке, клавиша TAB перемещает фокус на следующий элемент управления. Это настройка, которую мы используем в нашем проекте.

DataGridView подключен к источнику привязки в нашем проекте, который может иметь или не иметь отношение.

Когда DataGridView находится в форме, отображаемой из проекта на основе COM (в нашем случае VB6), элемент управления сетки теряет фокус, когда пользователь пытается выполнить вкладку в сетке. Если вы удерживаете клавишу табуляции, фокусируйтесь на других элементах управления в форме, пока не вернетесь к сетке. Когда он возвращается в сетку, выбранная ячейка является той, в которую пользователь вкладывал вкладку.

Таким образом, пользователь может перемещаться по всем ячейкам через обходной путь через остальные элементы управления в форме при их перемещении из ячейки в ячейку. Это не для счастливых пользователей.

Я нашел вопрос MSDN на форуме , который, кажется, описывает эту проблему, но единственный ответ на него не очень полезен.

Я мог бы представить это как ошибку в Microsoft Connect, но я сомневаюсь, что они собираются это исправить. Есть ли способ решить эту проблему в коде?

1 Ответ

2 голосов
/ 04 ноября 2011

Дальнейшее изучение следующих событий / методов выявило закономерность: Leave (на элементе управления) ProcessDialogKey (на форме и на элементе управления) ProcessDataGridViewKey (на элементе управления)

Последние два события оказалисьбыть ключевым в этой проблеме.

Когда мы тестировали в 100% проекте .NET, мы обнаружили, что внутреннее табулирование будет запускать событие ProcessDataGridViewKey для запуска.Когда в последней ячейке функция ProcessDataGridView не была выполнена, но была выполнена функция ProcessDialogKey.

Когда мы тестировали в проекте Interop, события были точно такими же, но событие Leave в элементе управления происходило до того, какфункция ProcessDataGridViewKey была выполнена.Плохой сценарий уникален тем, что элемент управления не будет иметь фокус, тогда выполняется функция ProcessDataGridViewKey.

Возможно, мы сможем проверить это и заставить фокус вернуться к контролю?Оказывается, что мы можем, и вот подклассный элемент управления, который обрабатывает его, но все еще отлично работает в 100% .NET проекте.

Public Class DataGridViewCustom : Inherits DataGridView
    Protected Overrides Function ProcessDataGridViewKey(e As System.Windows.Forms.KeyEventArgs) As Boolean
        ' When the grid is hosted by a form that is being loaded through the Interop Forms Toolkit,
        ' the default behavior of using the TAB key to navigate between cells is broken 
        ' (StandardTab = False). The tab key causes the grid control to lose focus before it has a 
        ' chance to process the tab key in this event handler.
        '
        ' This handler is not executed when the TAB key is supposed to make it lose focus (i.e. when
        ' StandardTab is True or when TABbing off the last cell within the grid). In those 
        ' scenarios, the ProcessDialogKey event handler is executed, and there is no problem.
        ' Therefore, we can assume that if this event is being processed, and the grid does not have
        ' focus, we should put focus back on the control.

        ' The datagridview has different behavior for TAB and CTL-TAB, depending on how the StandardTab
        ' property is set. We don't have to worry about that becuase this method only executes when the
        ' focus is supposed to stay within the control. A different method is executed when the focus
        ' is supposed to leave the control.

        If e.KeyCode = Keys.Tab AndAlso Not Me.Focused Then Me.Focus()

        Return MyBase.ProcessDataGridViewKey(e)
    End Function
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...