Дальнейшее изучение следующих событий / методов выявило закономерность: 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