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?
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 } });
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 TextBox
es 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 TextBox
es 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.
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.
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.
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;
La solution idéale pour les débutants est:
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.
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)
{
}
Ensuite, collez simplement ceci entre les crochets:
if (e.KeyCode == Keys.Enter)
{
yourNameOfButton.PerformClick();
}
Cela agira comme vous auriez cliqué dessus.
Ajoutez ceci au constructeur du formulaire:
this.textboxName.KeyDown += (sender, args) => {
if (args.KeyCode == Keys.Return)
{
buttonName.PerformClick();
}
};
Ou vous pouvez simplement utiliser ce simple code à 2 lignes :)
if (e.KeyCode == Keys.Enter)
button1.PerformClick();
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;
Vous pouvez le piéger lors de l'événement keyup http://www.itjungles.com/dotnet/c-how-to-easily-detect-enter-key-in-textbox-and-execute-a-method
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.
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);
}
}