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

winforms .net 3.5 Ultrawingrid 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-Tab выглядит совсем не так, как в подпункте выше. Код e.key рассматривается как ключ управления {17}

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

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

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

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

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

ТИА

1 Ответ

0 голосов
/ 02 июня 2010

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

Чтобы пропустить 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 остается в одном из подклассов сетки)

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 () для следующего элемента управления в Leave ofгрупповое поле, содержащее Ultragrid, так как кажется, забывает, куда он должен идти, основываясь на TabOrderController формы, но это небольшая цена, которую нужно заплатить.Я надеюсь, что эта часть будет обобщена в ближайшее время.

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

...