web-dev-qa-db-fra.com

Comment faire entrer sur une zone de texte ACTORT BOUTON TABLET

J'ai plusieurs boîtes de texte. Je voudrais rendre le bouton Entrée agir comme onglet. Donc, lorsque je serai dans une zone de texte, appuyez sur Entrée me déplacera à la suivante. Pourriez-vous s'il vous plaît dites-moi comment implémenter cette approche sans ajouter de code à l'intérieur de la classe Textbox (pas de remplacement et ainsi de suite si possible)?

20
Tomasz Smykowski

Voici le code que j'utilise habituellement. Ce doit être sur l'événement clé.

if (e.KeyData == Keys.Enter)
{
    e.SuppressKeyPress = true;
    SelectNextControl(ActiveControl, true, true, true, true);
}

MISE À JOUR

Autre moyen est l'envoi de la touche "Tab"! Et le remplacement de la méthode le rend aussi facile :)

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{            
    if (keyData == (Keys.Enter))
    {
        SendKeys.Send("{TAB}");
    }

    return base.ProcessCmdKey(ref msg, keyData);
}
21
Behzad

Vous pouvez écrire sur la clé de tout contrôle:

        if (e.KeyCode == Keys.Enter)
        {

            if (this.GetNextControl(ActiveControl, true) != null)
            {
                e.Handled = true;
                this.GetNextControl(ActiveControl, true).Focus();

            }
        }

GetNextControl ne fonctionne pas sur Vista .

Pour que cela fonctionne avec Vista, vous devrez utiliser le code ci-dessous pour remplacer la ceci.getNextControl ...:

System.Windows.Forms.SendKeys.Send("{TAB}");
11
Patrick Desjardins

Vous n'avez pas besoin de faire un "Saisir le gestionnaire d'événements"

Tout ce que vous avez à faire est de faire un événement clé "central":

exemple

private void General_KeyDown(object sender, KeyPressEventArgs e)
 {
 if (e.KeyCode == Keys.Enter)
        {

            if (this.GetNextControl(ActiveControl, true) != null)
            {
                e.Handled = true;
                this.GetNextControl(ActiveControl, true).Focus();
            }
        }
}

Ensuite, tout ce que vous avez à faire est d'aller à la concepteur Sélectionner toutes les textes de texte que vous souhaitez parcourir avec Entrée (sélectionnez-les en maintenant Ctrl enfoncé et en cliquant sur la zone de texte avec la souris) puis passez à des événements (Thunder comme bouton), événement de recherche et type à l'intérieur général_keydown. Maintenant, toutes vos boîtes de texte sélectionnées auront le même événement de Keydown :) Cela rend tout ce que Muuuuuch beaucoup plus facilement, causer une forme avec 100 textes de texte et vous souhaitez parcourir tout avec ENTER .... Faire un événement séparé pour chaque Texbox est .. . Et bien, pas une bonne façon de faire un programme, ce n'est pas soigné. J'espère que ça aidé !!

Blockquote

4
Anca

Il est important de noter que si vous obtiendrez un son "Ding" gênant ou un son d'avertissement gênant chaque fois que le contrôle s'attend à une commande de bouton associée et e.Handled = true N'est-ce pas toujours la réponse à vous débarrasser du bruit/son/ding.

Si la commande (c'est-à-dire une zone de texte à une ligne unique), vous attendez à un bouton associé pour "Entrer" votre entrée, vous devez également traiter le contrôle "manquant".

e.Handled = e.SuppressKeyPress = true;

Cela peut être utile lorsque vous vous débarrassez du son "Ding".

Pour ce que ça vaut la peine - dans ma situation, mes utilisateurs devaient utiliser la "touche Entrée", car nous passions à partir d'une application à écran terminal/vert vers une application Windows et ils ont été plus utilisés pour "entrer-ing" à travers des champs plutôt que de tabuler. .

Toutes ces méthodes fonctionnaient mais gardaient toujours le son ennuyeux jusqu'à ce que j'ai ajouté e.SuppressKeyPress.

3
Greg

Si vous définissez l'ordre de l'onglet de toutes les commandes et apportez forme.KeyPreview = TRUE, seulement besoin de cela:

    Private Sub frmStart_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Enter Then
        System.Windows.Forms.SendKeys.Send("{TAB}")
    End If
End Sub
1
FXX

Cela a fonctionné pour moi

if (e.Key == Key.Enter)
            ((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection()));
1
Cadair Idris

C'est la solution que j'utilise pour vb.net

  1. SET KeyPreview = true dans vos propriétés de formulaire.

  2. Mettez ce code dans le formulaire Cleaudown Event:

    Si (e.keydata = keys.enter) alors

    'Pour tout contrôle multilignot, vous devez quitter pour laisser la touche MULLINE' TEXTBOXTBOX INTRO 'MAINTUIRE SCHIPS.

     If ActiveControl.Name = txtMyMutilineTextBox.Name Then Exit Sub 
    
     e.SuppressKeyPress = True
     SelectNextControl(ActiveControl, True, True, True, True)
    

    Fin si

profiter !!!!

Xabier Aberasturi Larruzea

0
Xabier Aberasturi

J'utilise ce code dans l'un des événements de clé de la zone de texte

if (e.KeyData == Keys.Enter)
{
     e.SuppressKeyPress = true;
     SelectNextControl(ActiveControl, true, true, true, true);
}

Impossible de gérer cet événement keydown pour toutes les zones de texte de mon formulaire. Proposer quelque chose. Merci

0
Shahrzad Saeedi