web-dev-qa-db-fra.com

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

J'ai une application Windows Forms très simple. Et, dans Windows (ou au moins Windows Forms Applications), lorsque vous appuyez sur Entrée pendant que vous vous trouvez dans 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 d'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 fini de taper, pour ne pas utiliser pour utiliser la souris. 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 le fait d'appuyer sur Enter:

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

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.

De la docs:

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

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

51
mdm

Ç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 le vrai truc. J'espère que cela vous aidera.

177
Lucio Fonseca

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
    }
}
51
FIre Panda

Vous pouvez utiliser KeyPress au lieu de KeyUp ou KeyDown, qui est plus efficace. Voici comment gérer

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

et dire la paix au "Ding"

11
Mawardy

Ajoutez simplement e.SuppressKeyPress = true; dans votre "if".

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.
    }
}
10
brandonstrong

Utilisez SuppressKeyPress pour arrêter le traitement continu de la frappe après sa manipulation.

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

      }
   }
}
7
Snehasish

Il y a très peu de chance que quiconque parvienne à cette réponse, mais certaines autres réponses sont vraiment effrayantes. La suppression d'un événement sur KeyDown tue deux événements supplémentaires en une grève. La définition de la propriété e.Handled Sur true est inutile dans ce contexte.
Le meilleur moyen est de définir la propriété Form.AcceptButton Sur le bouton de recherche.
Il existe également un autre moyen d’utiliser la touche Enter - certaines personnes voudront peut-être qu’elle agisse comme un bouton TAB. Pour ce faire, ajoutez un nouveau Button, définissez sa propriété Location en dehors de la zone Form (c'est-à-dire (-100, -100)) - paramètre Visible propriété sur false peut désactiver Button gestionnaires dans certains cas. Définissez la propriété Form.AcceptButton Sur votre nouveau bouton. Dans le gestionnaire d'événements Click, ajoutez le code suivant
this.SelectNextControl(ActiveControl, true, true, true, true)

Maintenant, vous voudrez peut-être transférer focus que lorsque focus le sur TextBox, vous voudrez peut-être tester ActiveControl saisir ou utiliser e.Supress propriété dans les gestionnaires d'événements de contrôles non destinés à utiliser Enter comme TAB c'est tout. Vous n'avez même pas besoin de capturer e.KeyCode

2
ArtK

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

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

Suppression de la touche Appuyez d'empêcher que l'événement soit envoyé au contrôle sous-jacent. Cela devrait fonctionner si vous manipulez manuellement tout ce que la touche Entrée fera dans cette zone de texte. Désolé pour le Visual Basic.

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

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

            //Write the rest of your code
        }
    });
1
Code.Town

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 appuierez sur Entrée.

0
Zruty

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

Après avoir réfléchi à cette question pendant un bon bout de temps et voulu trouver le moyen le plus simple de le réparer, j'ai trouvé le moyen le plus simple mais le moins élégant de le résoudre.

Voici ce que j'ai fait.

  1. Mettez 2 boutons invisibles "Ok" et "Annuler" sur le formulaire.
  2. Définissez les propriétés AcceptButton et CancelButton du formulaire sur les boutons invisibles.
  3. Ajout d'aucun code 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, quand je saisissais un numéro d'enregistrement dans la position actuelle pour naviguer et appuyer sur entrer.

Conformément à la question initiale selon laquelle le programmeur souhaitait une fonction de recherche lorsque le bouton Entrée était enfoncé, je mettais simplement 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 surgir.

La seule autre manière élégante que je puisse imaginer serait d’écrire un nouveau cours de manipulation de frappe, ce qui représente beaucoup de travail pour la plupart de mes projets.

0
user2793447