0

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-tab は上記のサブとは大きく異なって見えます。e.keycode は controlkey {17} と見なされます

デフォルトでは cntrl-Tab がタブページ間を移動することを認識しています。この動作をオーバーライドする必要があります。私の考えでは、フォームと同じようにキーコンボを渡す tabControl のサブクラスがおそらく必要ですが、それを達成する方法については無知であることを告白します。tabcontrol サブクラスの onkeydown をオーバーライドしようとしましたが、ctrl-tab コンボが押された場合に onkeydown への return と not と base 呼び出しを発行しましたが、e.keycode が controlkey としても表示されるようでした。

FWIW ctrl-E などの別の組み合わせを試してみたところ、フォーカスがグリッドから消えてしまいましたが、検出できる場所には行かず、ほぼ同じ結果が得られました。サブはまだ e.control を controlkey として認識していました。

奇妙なことに、ctrl-X、ctrl-A などはすべてグリッドで機能し、行を削除するためにサブクラスに入れた ctrl-Delete コンボは正常に機能します。

繰り返しますが、フォーム上に直接グリッドを配置すると、すべて機能します。

私は間違いなくこれについて頭を悩ませています。ガイダンスは大歓迎です。vb または c# で問題ありません。

ティア

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

フォームの TabOrderController に基づいて移動する場所を忘れているように見えるため、Ultragrid を含むグループボックスの Leave の次のコントロールに focus() を明示的に設定する必要がありますが、これはわずかな代償です。その部分がすぐに一般化されることを願っています。

興味のある人のために、さらなる改良を投稿します。

于 2010-06-02T17:37:12.317 に答える