0

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 看起来与上面的 sub 非常不同。e.keycode 被视为 controlkey {17}

我意识到默认情况下 cntrl-Tab 在标签页之间移动。我需要覆盖这种行为。我的想法是我可能需要一个 tabControl 的子类,它会像表单一样通过 keycombo,但我承认对于如何完成它一无所知。我试图覆盖 tabcontrol 子类的 onkeydown,如果按下 ctrl-tab 组合,则只发出一个 return 而不是对 onkeydown 的基本调用,但它似乎也将 e.keycode 视为 controlkey。

FWIW 我尝试了一个不同的组合,比如 ctrl-E 并得到了几乎相同的结果,焦点从网格中消失但没有去任何我能检测到的地方。潜艇仍然将 e.control 视为 controlkey。

奇怪的是,ctrl-X、ctrl-A 等都在网格中工作,我在子类中放置的用于删除行的 ctrl-Delete 组合工作正常。

再一次 - 直接在表格上网格,这一切都有效。

在这个问题上,我绝对超出了我的想象。非常感谢指导。vb 或 c# 很好。

TIA

4

1 回答 1

0

我很高兴你问了这个问题;-)

通过 TabControl 传递 ctrl-tab :

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

根据更明智的人的建议,我已将导航代码移至我的基本类(在 Ultragrid 中使用 ctrl-Delete 删除单行的代码仍保留在网格子类的 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 的组框的 Leave 上的下一个控件,因为它似乎忘记了基于表单的 TabOrderController 应该去哪里,但这是一个很小的代价。我希望尽快将这部分通用化。

将为有兴趣的人发布进一步的改进。

于 2010-06-02T17:37:12.317 回答