Arrêtez le 'Ding' en appuyant sur Entrée


124

J'ai une application Windows Forms très simple. Et, dans Windows (ou, au moins dans les applications Windows Forms), lorsque vous appuyez sur Entrée à l'intérieur d'un contrôle TextBox à une ligne, vous entendez un Ding. C'est un son déplaisant, qui indique que vous ne pouvez pas entrer de nouvelle ligne, car il s'agit d'une zone de texte sur une seule ligne.

Tout va bien. Cependant, dans mon formulaire, j'ai 1 zone de texte et un bouton de recherche. Et j'autorise l'utilisateur à effectuer une recherche en appuyant sur Entrée après avoir terminé de taper, afin qu'il n'ait pas à utiliser la souris pour cliquer sur le bouton de recherche.

Mais ce son Ding se produit. C'est vraiment agaçant.

Comment pouvons-nous faire en sorte que le son ne joue pas du tout dans mon formulaire?

@David H - Voici comment je détecte l'entrée en appuyant sur:

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Perform search now.
    }
}

Comment détectez-vous que Entrée a été enfoncée lorsque le focus est dans la zone de texte?
David Heffernan le

Dans le volet Propriétés, vous double-cliquez sur l'événement KeyDown ou KeyUp. Ensuite, en mode Code, vous tapez le code que je suis sur le point de mettre dans ma question pour yah.
bendr le

2
KeyPress est probablement le bon événement, et vous voulez définir e.Handled = true
David Heffernan

Merci, @David, je ne savais pas ça :)
bendr

7
J'aurais aimé qu'il y ait un moyen de supprimer le ding ennuyeux mais de permettre à la pression de la touche de remonter. Parfois, une pression sur une touche n'est qu'une pression sur une touche, pas besoin d'alarme.
flipdoubt

Réponses:


56

Découvrez la propriété Form.AcceptButton . Vous pouvez l'utiliser pour spécifier un bouton par défaut pour un formulaire, dans ce cas pour appuyer sur Entrée.

À partir de la documentation:

Cette propriété vous permet de désigner une action par défaut à exécuter lorsque l'utilisateur appuie sur la touche ENTRÉE dans votre application. Le bouton affecté à cette propriété doit être un IButtonControl qui se trouve sur le formulaire actuel ou situé dans un conteneur du formulaire actuel.

Il existe également une propriété CancelButton lorsque l'utilisateur appuie sur échapper.


1
Merci @mdm, cela a fonctionné le mieux pour moi. :) Je reviendrai pour voter quand j'aurai plus de représentants.
bendr le

1
@bendr j'ai le même problème .. mais j'utilise UserControl .. il n'a pas Form.AcceptButton .. comment le résoudre?
Murhaf Sousli

1
Visual Studio ne semble pas avoir de champ dans le volet Propriétés pour cela. Cela doit être fait dans le code, apparemment. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Chris

5
Cela ne fonctionnera pas pour ToolStripButtons ou si vous souhaitez utiliser la touche ENTRÉE pour valider un TextBox ou ToolStripTextBox. La meilleure approche serait la réponse de Lucio Fonseca qui a travaillé pour moi avec ToolStripTextBox.
Robert S.20

Je ne vois pas ta solution tu n'as pas un exercice pratique pour être plus éclairé
Pedro Ávila

198

Ça marche pour moi:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

    //Se apertou o enter
    if (e.KeyCode == Keys.Enter)
    {
        //enter key is down

        this.doSomething();

        e.Handled = true;
        e.SuppressKeyPress = true;

     }

 }

Le SuppressKeyPress est vraiment le truc. J'espère que cela vous aidera.


30
C'est la seule réponse valable, à mon avis. e.Handled = true;était insuffisant; c'était le SuppressKeyPressqui a fait l'affaire.
Jonathon Reinhart

12
textBox1_KeyUp va sonner dans cette situation indépendamment de Handled ou SuppressKeyPress
stackuser83

4
Fonctionne pour moi avec ToolStripTextBox.KeyDown. Aucune autre solution ne l'a fait. Merci!
Robert S.20

1
Cela n'a pas fonctionné pour moi sur mon événement textboxetKeyDown
Alex Jolig

7
Cela devrait être la réponse acceptée. La réponse actuellement acceptée nécessite un bouton standard placé sur le formulaire, ce qui est désagréable.
Javid

56

Essayer

textBox.KeyPress += new KeyPressEventHandler(keypressed);

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true; //this line will do the trick
    }
}

Correct, mais cela ne fonctionnera que si le focus est toujours sur la zone de texte. Et si l'utilisateur appuie d' Tababord?
mdm le

4
@mdm Dépend de la conception de l'interface utilisateur. Peut-être que OP ne souhaite cette action que lorsque le focus est sur la zone de texte. C'est assez courant.
David Heffernan le

2
Si l'utilisateur a appuyé sur Tab, le focus ne sera plus sur la zone de texte, le prochain Contorl qui sera focalisé est le contrôle de bouton, qui ne produit pas ce son lorsque vous appuyez sur Entrée dessus. :-)
bendr

@David, merci pour votre exemple. J'ai juste essayé. Et chaque fois que je mets e.Handled = true dans l'événement .KeyPress, aucun des autres codes ne s'exécute. La seule chose qui se passe, c'est que tout le texte de la zone de texte devient sélectionné (et je n'ai même pas de code qui sélectionne un texte)
bendr

1
La réponse de Lucio Fonseca a été la seule que j'ai trouvée pour régler le problème.
Jonathon Reinhart

15

Ajoutez simplement e.SuppressKeyPress = true;votre déclaration "si".

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //If true, do not pass the key event to the underlying control.
        e.SuppressKeyPress = true;  //This will suppress the "ding" sound.*/

        // Perform search now.
    }
}

13

Vous pouvez utiliser KeyPress au lieu de KeyUp ou KeyDown, c'est plus efficace et voici comment gérer

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            e.Handled = true;
            button1.PerformClick();
        }
    }

et dis la paix au 'Ding'


2
Cela a parfaitement fonctionné pour moi. e.Handled désactive apparemment le «Ding». Faire du bouton «Soumettre» (dans mon cas) la valeur par défaut n'aurait pas fonctionné pour moi car je voulais gérer la touche «Entrée» différemment pour les autres zones de texte du formulaire. <br/> <br/> Au fait : Pour ce projet, j'utilise VB. donc au lieu de lancer e.KeyChar, je le convertis: if e.KeyChar = ChrW (Keys.Enter Then ....
Mark Ainsworth

1
Dans le KeyDown, en utilisant e.Handledet e.SuppressKeyPressne fonctionnait pas pour moi - toujours sonnant. Mais le changer comme suggéré ici pour utiliser l' KeyPress' event and e.Handled` l'a bien fait.
Jinlye

Cela devrait être la bonne réponse, merci
Firas Shrourou

7

Utilisez SuppressKeyPresspour arrêter le traitement continu de la frappe après l'avoir manipulée.

public class EntryForm: Form
{
   public EntryForm()
   {
   }

   private void EntryTextBox_KeyDown(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         e.Handled = true;
         e.SuppressKeyPress = true;
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
          e.Handled = true;
          e.SuppressKeyPress = true;
          // do some stuff

      }
   }

   private void EntryTextBox_KeyUp(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
         // do some stuff

      }
   }
}

2

Je suis tombé sur ce post en essayant de gérer un KeyDown qui a fonctionné pour moi.

If e.KeyCode = Keys.Enter Then
   e.SuppressKeyPress = True
   btnLogIn.PerformClick()
End If

Suppression de la touche Appuyez sur arrête l'envoi de l'événement au contrôle sous-jacent. Cela devrait fonctionner si vous gérez manuellement tout ce que la touche Entrée fera dans cette zone de texte. Désolé pour Visual Basic.


2

Il y a très peu de chances que quiconque parvienne à cette réponse, mais certaines autres réponses sont vraiment effrayantes. La suppression d'un événement sur KeyDowntue 2 événements supplémentaires en un seul coup. Définir la e.Handledpropriété sur trueest inutile dans ce contexte.
Le meilleur moyen est de définir la Form.AcceptButtonpropriété sur le bouton de recherche réel.
Il existe également une autre façon d'utiliser la Enterclé - certaines personnes peuvent vouloir qu'elle agisse comme un TABbouton. Pour ce faire, ajoutez une nouvelle propriété Button, définissez sa Locationpropriété en dehors de la Formzone (c'est-à-dire (-100, -100)) - la Visiblepropriété de définition sur falsepeut désactiver les Buttongestionnaires dans certains cas. Définissez la Form.AcceptButtonpropriété sur votre nouveau bouton. Dans le Clickgestionnaire d'événements, ajoutez le code suivant
this.SelectNextControl(ActiveControl, true, true, true, true)

Désormais, vous souhaiterez peut-être transférer focusuniquement lorsque focuscela est activé, TextBoxvous souhaiterez peut-être tester le ActiveControltype ou utiliser la e.Supresspropriété dans les gestionnaires d'événements de contrôles non destinés à être utilisés Entercomme TAB c'est tout. Vous n'avez même pas besoin de capturere.KeyCode


1
$("#txtSomething").keypress(function (e) {
        if (e.which == 13) {

            e.Handled = true; //This will prevent the "ding" sound

            //Write the rest of your code
        }
    });

C'est ce que je recherche.
Sid

1

Sur WinForms, la touche Entrée provoque un son Ding car la propriété de formulaire AcceptButton n'est pas spécifiée. Si vous n'avez pas besoin d'un AcceptButton, le son de ding peut être supprimé en définissant le formulaire KeyPreview sur true et en entrant l'événement KeyPress suivant:

private void Form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
        e.Handled = true;
}

Quel que soit le contrôle actif, il n'y aura plus de bruit sourd lorsque vous appuyez sur la touche Entrée. Puisque l'ordre de traitement des événements clés est KeyDown, KeyPress et KeyUp, la touche Entrée fonctionnera toujours pour les événements KeyDown des contrôles.


0

Définissez la propriété IsDefault de votre bouton de recherche sur true. Cela en fera un bouton par défaut et il sera automatiquement cliqué lorsque vous appuyez sur Entrée.


À partir des documents To specify the default button of a form, set the AcceptButton property of the form to the desired button.
auxquels

Oui, j'ai enquêté moi-même. Il semble que les deux approches sont interchangeables. AcceptButtonsemble plus élégant, mais je suis habitué à IsDefaultmoi-même.
Zruty

0

Eh bien, j'ai vécu assez longtemps avec ce problème et je l'ai cherché ici.

Après avoir réfléchi à cela pendant un certain temps et recherché le moyen le plus simple de le réparer, j'ai trouvé le moyen le plus simple mais pas si élégant de le réparer.

Voici ce que j'ai fait.

  1. Mettez 2 boutons invisibles "Ok" et "Annuler" sur le formulaire.
  2. Définissez la propriété AcceptButton et CancelButton sur le formulaire sur les boutons invisibles.
  3. Aucun code ajouté aux boutons!

Cela a résolu tous les problèmes secondaires répertoriés dans ce fil, y compris le ToolStripMenu. Ma plus grande plainte était le BindingNavigator, lorsque je saisissais un numéro d'enregistrement dans la position actuelle pour naviguer et appuyais sur Entrée.

Selon la question originale dans laquelle le programmeur voulait une fonction de recherche lorsque le bouton Entrée était enfoncé, j'ai simplement mis le code de recherche dans le bouton OK invisible!

Jusqu'à présent, cela semble résoudre tous les problèmes, mais comme nous le savons tous avec Visual Studio, quelque chose va probablement se produire.

La seule autre manière élégante possible à laquelle je pourrais penser serait d'écrire une nouvelle classe de gestion des frappes, ce qui représente beaucoup de travail pour la plupart de mes projets.


0

Vous pouvez définir votre zone de texte multiligne sur true, puis gérer la touche Entrée.

private void yourForm_Load(object sender, EventArgs e)
    {
        textBox1.Multiline = true;
    }

//then write your TextBox codes
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // doSomething();
    }
}

0

J'ai changé les propriétés de zone de texte pour une zone de texte multiligne et cela fonctionne pour moi.


La réponse a déjà été indiquée ci-dessous le 22 février. Vous devez vous occuper de [enter] aussi;)
Goodies

-2
void RTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == Keys.Enter)
    {
        //do ...
        bool temp = Multiline;
        Multiline = true;
        e.Handled = true;
        Multiline = temp;
    }
}

1
C'est une réponse redondante avec seulement du code, aucune explication. En outre, tout le Multilinecode est complètement hors de propos.
Jonathon Reinhart
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.