Как выйти из сетки с помощью ctrl-TAB, когда сетка находится на вкладке (onkeydown работает, когда сетка не на вкладке)

Winforms .net 3.5 Ультравингрид 9.2

В моем подклассе Ultrawingrid.Ultragrid:

Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)

    If e.KeyCode = Windows.Forms.Keys.Tab andalso e.control = True then 
        SetFocusToNextControl(True)
    End if

   Mybase.OnKeyDown(e)

End Sub

Это прекрасно работает. Но когда сетка перетаскивается на вкладку TabControl, вкладка ctrl сильно отличается от приведенной выше подпрограммы. e.keycode рассматривается как контрольная клавиша {17}

Я понимаю, что по умолчанию cntrl-Tab перемещается между страницами вкладок. Мне нужно изменить это поведение. Я думаю, мне, вероятно, нужен подкласс tabControl, который будет передавать комбинацию клавиш так же, как и форма, но я признаюсь, что не знаю, как это сделать. Я попытался переопределить onkeydown подкласса tabcontrol и просто выдать return, а не базовый вызов onkeydown, если была нажата комбинация ctrl-tab, но, похоже, он также видел e.keycode в качестве клавиши управления.

FWIW Я попробовал другую комбинацию, такую ​​как ctrl-E, и получил почти тот же результат: фокус исчезал из сетки, но никуда не уходил, что я мог обнаружить. Подводная лодка все еще видела e.control как клавишу управления.

Как ни странно, ctrl-X, ctrl-A и т. Д. Работают в сетке, а комбинация ctrl-Delete, которую я добавил в подкласс для удаления строки, работает нормально.

Еще раз - сетка прямо на форме и все работает.

Я определенно выше головы над этим. Руководство очень ценится. vb или C # нормально.

TIA


person Charles Hankey    schedule 02.06.2010    source источник


Ответы (1)


Я рад, что вы задали этот вопрос ;-)

Чтобы передать Ctrl-Tab через TabControl:

Public Class MyTabControl
Inherits MicroFour.StrataFrame.UI.Windows.Forms.TabControl

Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.Tab AndAlso e.Control Then
    e.Handled = False
    e.SuppressKeyPress = False
Else
    MyBase.OnKeyDown(e)
End If

End Sub
End Class

По совету кого-то более мудрого я переместил код навигации в свой класс базовой формы (код для удаления одной строки с помощью ctrl-Delete в Ultragrid остается в onkeydown подкласса сетки)

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, _
                                       ByVal keyData As System.Windows.Forms.Keys) _
                                       As Boolean
    '-- check for unique keystrokes
    Select Case keyData
        Case Keys.Control Or Keys.Tab

            '-- created to be able to tab out of a Grid control 
            '-- Unfortunately direct at this point still moot for grids on 
            '-- tabcontrols as I have to set focus() to next control 
            '-- explicitly on leaving groupbox containing grid on tabpage

            Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
        Case Keys.Control Or Keys.Shift Or Keys.Tab
            Me.SelectNextControl(Me.ActiveControl, False, True, True, True)
        Case Keys.Control Or Keys.E

    End Select

    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

Мне нужно явно установить focus () на следующий элемент управления на выходе из группового окна, содержащего Ultragrid, поскольку он, кажется, забывает, куда он должен идти, на основе TabOrderController формы, но это небольшая цена. Я надеюсь, что в ближайшее время эта часть будет обобщена.

Опубликуем дальнейшие уточнения для всех, кого это интересует.

person Charles Hankey    schedule 02.06.2010