2010-01-24 15 views
2

Je veux exécuter un même gestionnaire KeyDown même pour tous les contrôles disponibles sur un formulaire. de toute façon je peux accomplir cela?Existe-t-il un moyen d'avoir un gestionnaire KeyDown universel et Focus avec TabIndex dans C# .NET?

Pour être plus clair, mon intention est de détecter la touche Entrée chaque fois que l'on appuie dessus et déplacer le focus du contrôle actuel vers celui avec TabIndex suivant.

Comment puis-je accomplir cela? Remplacez la méthode ProcessCmdKey du formulaire par la méthode

+0

utilisez-vous WinForms ou WPF? –

Répondre

0

fait ProcessCmdKey ne se produit pas sous la forme liste des événements, ne pouvait donc pas l'utiliser plus tôt. ^ _^

J'ai effectué un peu et modifié pour détecter si les boutons sont disponibles et s'il y a, ça va pas déplacer le focus, appuyez sur le bouton à la place ..

Button b = this.ActiveControl as Button; 
     if (keyData == Keys.Enter && this.AcceptButton == null && this.ActiveControl != null && !this.ActiveControl.Equals(b)) 
     { 

      TextBoxBase box = this.ActiveControl as TextBoxBase; 

      if (box == null || !box.Multiline) 
      { 
       // Not a dialog, not a multi-line textbox; we can use Enter for tabbing 
       this.SelectNextControl(this.ActiveControl, true, true, true, true); 
       return true; 
      } 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 

Mais je whatif voulez-vous appuyer une fois sur le bouton, puis passer à nouveau au nouveau contrôle? Est-il possible d'invoquer cette ProcessCmdKey manuellement?

2

Vous devrez éviter d'entraver l'utilisation régulière de la touche Entrée. Cela devrait être proche:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == Keys.Enter && this.AcceptButton == null && this.ActiveControl != null) { 
    TextBoxBase box = this.ActiveControl as TextBoxBase; 
    if (box == null || !box.Multiline) { 
     // Not a dialog, not a multi-line textbox; we can use Enter for tabbing 
     this.SelectNextControl(this.ActiveControl, true, true, true, true); 
     return true; 
    } 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
}