Fermare il "Ding" quando si preme Invio


124

Ho un'applicazione Windows Form molto semplice. E, in Windows (o, almeno in applicazioni Windows Form), quando si preme Invio all'interno di un controllo TextBox a riga singola, si sente un Ding. È un suono sgradevole, che indica che non puoi inserire una nuova riga, perché è un TextBox a riga singola.

Va tutto bene. Tuttavia, nel mio modulo, ho 1 TextBox e un pulsante di ricerca. E sto permettendo all'utente di effettuare una ricerca premendo Invio dopo che hanno finito di digitare, in modo da non devono utilizzare il mouse per fare clic sul pulsante di ricerca.

Ma questo suono Ding si verifica. È molto fastidioso.

Come possiamo fare in modo che il suono non venga riprodotto affatto nel mio modulo?

@David H - Ecco come rilevo l'invio premendo:

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

Come rilevi che è stato premuto Invio quando il focus è nella casella di testo?
David Heffernan

Nel riquadro delle proprietà, fai doppio clic sull'evento KeyDown o KeyUp. Quindi, in Vista codice, digiti il ​​codice che sto per inserire nella mia domanda per te.
bendr

2
KeyPress è probabilmente l'evento giusto e vuoi impostare e.Handled = true
David Heffernan

Grazie, @David, non lo sapevo :)
bendr

7
Vorrei che ci fosse un modo per sopprimere il fastidioso ding ma permettere alla pressione del tasto di ribollire. A volte la pressione di un tasto è solo una pressione di un tasto, non c'è bisogno di allarme.
flipdoubt

Risposte:


56

Controlla la proprietà Form.AcceptButton . Puoi usarlo per specificare un pulsante predefinito per un modulo, in questo caso per premere invio.

Dai documenti:

Questa proprietà consente di designare un'azione predefinita che si verifica quando l'utente preme il tasto INVIO nell'applicazione. Il pulsante assegnato a questa proprietà deve essere un IButtonControl che si trova nel modulo corrente o che si trova all'interno di un contenitore nel modulo corrente.

C'è anche una proprietà CancelButton per quando l'utente preme escape.


1
Grazie @mdm, ha funzionato al meglio per me. :) Tornerò a votare quando avrò più rep.
bendr

1
@ bendr ho lo stesso problema .. ma sto usando UserControl .. non ha Form.AcceptButton .. come risolverlo?
Murhaf Sousli

1
Visual Studio non sembra avere un campo nel riquadro Proprietà per questo. A quanto pare deve essere fatto in codice. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Chris

5
Questo non funzionerà per ToolStripButtons o se si desidera utilizzare il tasto INVIO per convalidare un TextBox o ToolStripTextBox. L'approccio migliore sarebbe la risposta di Lucio Fonseca che ha funzionato per me con ToolStripTextBox.
Robert S.

Non vedo la tua soluzione, non hai un esercizio pratico per essere più illuminato
Pedro Ávila

198

Per me funziona:

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;

     }

 }

SuppressKeyPress è il vero trucco. Spero che ti aiuti.


30
Questa è l'unica risposta valida, secondo me. e.Handled = true;era insufficiente; è stato SuppressKeyPressil trucco.
Jonathon Reinhart

12
textBox1_KeyUp verrà eseguito in questa situazione indipendentemente da
Handled

4
Funziona per me con ToolStripTextBox.KeyDown. Nessun'altra soluzione ha funzionato. Grazie!
Robert S.

1
Non ha funzionato per me sul mio evento textboxeKeyDown
Alex Jolig il

7
Questa dovrebbe essere la risposta accettata. La risposta attualmente accettata richiede un pulsante standard posizionato sul modulo che è sgradevole.
Javid

56

Provare

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
    }
}

Corretto, ma funzionerà solo se il focus è ancora sul TextBox. E se l'utente premesse per Tabprimo?
mdm

4
@mdm Dipende dal design dell'interfaccia utente. Forse OP vuole questa azione solo quando il focus è sulla casella di testo. È abbastanza comune.
David Heffernan

2
Se l'utente preme Tab, lo stato attivo non sarà più sulla casella di testo, il successivo Contorl che verrà messo a fuoco è il controllo pulsante, che non emette quel suono quando si preme Invio su di esso. :-)
bendr

@ David, grazie per il tuo esempio. L'ho appena provato. E ogni volta che metto e.Handled = true nell'evento .KeyPress, nessuno degli altri codici viene eseguito. L'unica cosa che accade è che tutto il testo nella
casella di

1
La risposta di Lucio Fonseca è stata l'unica che ho trovato per prendersi cura del problema.
Jonathon Reinhart

15

Aggiungi semplicemente la e.SuppressKeyPress = true;tua dichiarazione "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.
    }
}

13

Puoi usare KeyPress invece di KeyUp o KeyDown è più efficiente ed ecco come gestirlo

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

e dire pace al "Ding"


2
Ha funzionato perfettamente per me. e. Gestito apparentemente disabilita il "Ding". Impostare il pulsante "Invia" (nel mio caso) come predefinito, non avrebbe funzionato per me perché volevo gestire il tasto "Invio" in modo diverso per le altre caselle di testo nel modulo. <br/> <br/> A proposito : Per questo progetto sto usando VB. quindi invece di lanciare e.KeyChar, lo converto: if e.KeyChar = ChrW (Keys.Enter Then ....
Mark Ainsworth

1
All'interno del KeyDown, utilizzo e.Handlede e.SuppressKeyPressnon ha funzionato per me - ancora suonava. Ma cambiarlo come suggerito qui per usare KeyPress' event and e.Handled` lo ha fatto bene.
Jinlye

Questa dovrebbe essere la risposta corretta, grazie
Firas Shrourou

7

Utilizzare SuppressKeyPressper interrompere l'elaborazione continua della sequenza di tasti dopo averla gestita.

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

Mi sono imbattuto in questo post mentre cercavo di gestire un KeyDown che ha funzionato per me.

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

La soppressione della pressione del tasto interrompe l'invio dell'evento al controllo sottostante. Questo dovrebbe funzionare se stai gestendo manualmente tutto ciò che il tasto Invio farà all'interno di quella casella di testo. Mi dispiace per il Visual Basic.


2

C'è pochissima possibilità che qualcuno arrivi a questa risposta, ma alcune altre risposte sono davvero spaventose. La soppressione dell'evento su KeyDownuccide 2 eventi aggiuntivi in ​​un colpo. L'impostazione della e.Handledproprietà su trueè inutile in questo contesto.
Il modo migliore è impostare la Form.AcceptButtonproprietà sul pulsante di ricerca effettivo.
C'è anche un altro modo di utilizzare la Enterchiave: alcune persone potrebbero volere che funga da TABpulsante. Per farlo, aggiungine una nuova Button, imposta la sua Locationproprietà fuori Formdall'area (cioè (-100, -100)) l'impostazione della Visibleproprietà su falsepotrebbe disabilitare i Buttongestori in alcuni casi. Imposta la Form.AcceptButtonproprietà sul nuovo pulsante. Nel Clickgestore eventi aggiungere il codice seguente
this.SelectNextControl(ActiveControl, true, true, true, true)

Ora, potresti voler trasferire focussolo quando focusè attivo TextBoxpotresti voler testare il ActiveControltipo o usare la e.Supressproprietà nei gestori di eventi dei controlli non pensati per l'uso Entercome TAB Questo è tutto. Non hai nemmeno bisogno di catturaree.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
        }
    });

Questo è quello che cerco.
Sid

1

In WinForms il tasto Invio provoca un suono Ding perché la proprietà del modulo AcceptButton non è specificata. Se non hai bisogno di un AcceptButton, il suono del ding può essere soppresso impostando il modulo KeyPreview su true e immettendo il seguente evento KeyPress:

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

Indipendentemente dal controllo attivo, non ci sarà più alcun suono quando si preme il tasto Invio. Poiché l'ordine di elaborazione degli eventi chiave è KeyDown, KeyPress e KeyUp il tasto Invio continueranno a funzionare per gli eventi KeyDown per i controlli.


0

Imposta la proprietà IsDefault del tuo pulsante di ricerca su true. Questo lo renderà un pulsante predefinito e verrà cliccato automaticamente quando si preme Invio.


Dai documenti a cui ti sei collegatoTo specify the default button of a form, set the AcceptButton property of the form to the desired button.
mdm

Sì, ho indagato io stesso. Sembra che entrambi gli approcci siano intercambiabili. AcceptButtonsembra più elegante, ma sono abituato a IsDefaultme stesso.
Zruty

0

Bene, ho convissuto con questo problema abbastanza a lungo e l'ho cercato qui.

Dopo aver pensato a questo per un po 'di tempo e aver desiderato il modo più semplice per risolverlo, ho escogitato il modo più semplice ma non così elegante per risolverlo.

Ecco cosa ho fatto.

  1. Metti 2 pulsanti invisibili "Ok" e "Annulla" nel modulo.
  2. Impostare la proprietà AcceptButton e CancelButton nel form sui pulsanti invisibili.
  3. Nessun codice aggiunto ai pulsanti!

Ciò ha risolto tutti i problemi secondari elencati in questo thread, incluso ToolStripMenu. La mia più grande lamentela era BindingNavigator, quando inserivo un numero di record nella posizione corrente per navigare e premevo invio.

Come per la domanda originale in cui il programmatore voleva una funzione di ricerca quando è stato premuto il pulsante Invio, ho semplicemente inserito il codice di ricerca nel pulsante OK invisibile!

Finora questo sembra risolvere tutti i problemi ma, come tutti sappiamo con Visual Studio, probabilmente salterà fuori qualcosa.

L'unico altro modo elegante a cui potrei pensare sarebbe scrivere una nuova classe di gestione delle battiture che è un modo per lavorare molto per la maggior parte dei miei progetti.


0

Puoi impostare la tua casella di testo su più righe su true, quindi gestire la pressione del tasto Invio.

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

ho cambiato le proprietà della casella di testo per una casella di testo multilinea e funziona per me.


La risposta è stata già dichiarata di seguito il 22 febbraio. Devi occuparti anche di [entra];)
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
Questa è una risposta ridondante con solo codice, nessuna spiegazione. Inoltre, tutto il Multilinecodice è completamente irrilevante.
Jonathon Reinhart
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.