web-dev-qa-db-fra.com

C # Comment cliquer sur un bouton en appuyant sur Entrée lorsque la zone de texte est active?

Je travaille avec une application WinForm en C #, après avoir tapé quelque chose dans une zone de texte, je souhaite appuyer sur la touche Entrée mais la zone de texte a toujours le focus (le curseur clignotant est toujours dans la zone de texte). Comment puis-je y parvenir?

61
Jason Stevens

L'option simple consiste simplement à définir le bouton AcceptButton du formulaire sur le bouton sur lequel vous souhaitez appuyer (généralement «OK», etc.):

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    Application.Run(new Form { AcceptButton = btn, Controls = { tb, btn } });

Si ce n'est pas une option, vous pouvez regarder l'événement KeyDown, etc., mais c'est plus de travail ...

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    tb.KeyDown += (sender,args) => {
        if (args.KeyCode == Keys.Return)
        {
            btn.PerformClick();
        }
    };
    Application.Run(new Form { Controls = { tb, btn } });
78
Marc Gravell

Pour ce faire, la méthode habituelle consiste à définir la variable Form de AcceptButton sur le bouton sur lequel vous souhaitez "cliquer". Vous pouvez le faire dans le concepteur de VS ou dans le code et la variable AcceptButton peut être modifiée à tout moment.

Cela peut ou peut ne pas s'appliquer à votre situation, mais je l'ai utilisé conjointement avec des événements GotFocus pour différents TextBoxes sur mon formulaire afin d'activer un comportement différent en fonction du lieu où l'utilisateur a appuyé sur Entrée. Par exemple:

void TextBox1_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox1;
}

void TextBox2_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox2;
}

Une chose à laquelle vous devez faire attention lorsque vous utilisez cette méthode est que vous ne laissez pas la valeur AcceptButton définie sur ProcessTextBox1 lorsque TextBox3 devient actif. Je recommanderais d'utiliser l'événement LostFocus sur TextBoxes qui définit AcceptButton ou de créer une méthode GotFocus dans laquelle tous les contrôles n'utilisant pas d'appels AcceptButton spécifiques.

31
Jon Norton
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
     if (e.KeyCode == Keys.Enter)
     {
         button.PerformClick();
         // these last two lines will stop the beep sound
         e.SuppressKeyPress = true;
         e.Handled = true;
     }
}

Liez cet événement KeyDown à la zone de texte, puis chaque fois que vous appuierez sur une touche, cet événement sera déclenché. À l'intérieur de l'événement, nous vérifions si l'utilisateur a appuyé sur "Entrée". Si tel est le cas, vous pouvez effectuer votre action. 

31
ruvi

Je suis tombé sur cette question tout en cherchant la même chose moi-même. Ce que je remarque, c'est qu'aucune des réponses répertoriées ne fournit de solution lorsque vous ne souhaitez pas cliquer sur le bouton 'Accepter le bouton' d'un formulaire lorsque vous appuyez sur entrée. 

Un cas d'utilisation simple consisterait en une zone de recherche de texte sur un écran où appuyer sur Entrée devrait «cliquer» sur le bouton «Rechercher», sans exécuter le comportement AcceptButton du formulaire.

Ce petit extrait fera l'affaire;

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        if (!textBox.AcceptsReturn)
        {
            button1.PerformClick();
        }
    }
}

Dans mon cas, ce code fait partie d'un UserControl personnalisé dérivé de TextBox et le contrôle a une propriété 'ClickThisButtonOnEnter'. Mais ce qui précède est une solution plus générale.

11
RJ Lohan

Il suffit de définir le formulaire " Bouton Accepter " La propriété correspond au bouton sur lequel vous souhaitez appuyer en appuyant sur la touche Entrée . Ou dans l'événement de chargement, écrivez this.acceptbutton = btnName;

5
user5841303

La solution idéale pour les débutants est:

  1. Dans votre concepteur, cliquez sur le champ de texte souhaité. Dans la fenêtre des propriétés (par défaut: en bas à droite), cliquez sur Thunderbolt (Événements). Cette icône est située à côté de l'icône de tri alphabétique et de l'icône de propriétés.

  2. Faites défiler jusqu'à keyDown. Cliquez sur le champ déroulant à droite. Vous remarquerez qu'il n'y a rien dedans, appuyez simplement sur Entrée. Visual Studio vous écrira le code suivant:

    private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
    {
    
    }
    
  3. Ensuite, collez simplement ceci entre les crochets:

    if (e.KeyCode == Keys.Enter)
    {
         yourNameOfButton.PerformClick();
    }
    

Cela agira comme vous auriez cliqué dessus.

3
philx_x

Ajoutez ceci au constructeur du formulaire:

this.textboxName.KeyDown += (sender, args) => {
    if (args.KeyCode == Keys.Return)
    {
        buttonName.PerformClick();
    }
};
1
Michael

Ou vous pouvez simplement utiliser ce simple code à 2 lignes :)

if (e.KeyCode == Keys.Enter)
            button1.PerformClick();
1
jake mariano

Dans Visual Studio 2017, en utilisant c #, ajoutez simplement l'attribut AcceptButton à votre bouton, dans mon exemple "btnLogIn":

this.btnLogIn = new System.Windows.Forms.Button();
//....other settings
this.AcceptButton = this.btnLogIn;
1
zdarova
0
user344760

Ceci est très valable pour WinForms. Cependant, dans WPF, vous devez faire les choses différemment, et c'est plus simple . Définissez la propriété IsDefault de Button correspondant à cette zone de texte sur true.

Une fois que vous avez terminé la saisie de la touche Entrée, n'oubliez pas de basculer les propriétés en conséquence.

0
r3st0r3

La TextBox ne recevait pas du tout la touche Entrée dans ma situation. La première chose que j'ai essayée a été de changer la touche Entrée en une touche d'entrée, mais le système émettait encore un bip lorsque vous avez appuyé sur Entrée. Donc, j'ai sous-classé et écrasé la méthode ProcessDialogKey () et envoyé mon propre événement auquel je pouvais lier le gestionnaire de clics.

public class EnterTextBox : TextBox
{
    [Browsable(true), EditorBrowsable]
    public event EventHandler EnterKeyPressed;

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            EnterKeyPressed?.Invoke(this, EventArgs.Empty);
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
}
0
Matt Gregory