2010-06-02 22 views
0

.NET WinForms 3.5 Ultrawingrid 9.2Comment quitter la grille avec ctrl-TAB lorsque la grille est sur une tabpage (onkeydown travaux lorsque grille pas tabpage)

Dans ma sous-classe de 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 

Cela fonctionne très bien. Mais lorsque la grille est supprimée sur un onglet TabControl, l'onglet ctrl est très différent de celui ci-dessus. e.keycode est vu comme controlkey {17}

Je réalise que par défaut cntrl-Tab se déplace entre les onglets. Je dois contourner ce comportement. Ma pensée est que j'ai probablement besoin d'une sous-classe du tabControl qui passera le keycombo à travers tout comme la forme le fait mais j'avoue n'avoir aucune idée de la façon d'accomplir cela. J'ai essayé de surcharger l'onkeydown d'une sous-classe tabcontrol et juste d'émettre un return et not et base appel à onkeydown si le combo ctrl-tab a été pressé mais il a semblé voir le e.keycode comme clé de contrôle. FWIW J'ai essayé une combinaison différente, comme ctrl-E, et j'ai obtenu à peu près le même résultat avec un focus qui disparaissait de la grille, mais qui n'allait nulle part que je pouvais détecter. Le sous-marin voyait toujours l'e.control comme clé de contrôle.

Bizarrement, ctrl-X, ctrl-A etc. fonctionnent tous dans la grille et un combo ctrl-Delete que j'ai mis dans la sous-classe pour supprimer une ligne fonctionne bien.

Encore une fois - grille directement sur la forme et tout fonctionne.

Je suis définitivement au-dessus de ma tête sur celui-ci. Orientation très appréciée. vb ou C# bien.

TIA

Répondre

0

Je suis heureux que vous ayez posé cette question ;-)

Pour passer l'onglet ctrl-à travers le 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 

Sur les conseils de quelqu'un plus sage que je suis déplacé le code de navigation à ma classe de baseform (le code pour supprimer une rangée avec ctrl-Supprimer dans Ultragrid reste dans onkeydown de sous-classe de la grille)

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 

Je dois définir explicitement le focus() au contrôle suivant sur la sortie de la boîte de groupe contenant l'Ultragrid car il semble oublier où il est censé aller en fonction du TabOrderController du formulaire, mais c'est un petit prix à payer . J'espère que cette partie sera bientôt générique.

Afficher d'autres améliorations pour toute personne intéressée.