2011-06-09 14 views
84

Tengo una aplicación de formularios de Windows muy simple. Y, en Windows (o, al menos, en las aplicaciones de Windows Forms), cuando presiona Enter mientras está dentro de un Control de cuadro de texto de línea única, oye un Ding. Es un sonido desagradable, que indica que no puede ingresar una nueva línea, porque es un TextBox de una línea.Detener el 'Ding' al presionar Enter

Esto está todo bien. Sin embargo, en mi Formulario, tengo 1 TextBox y un botón de búsqueda. Y estoy permitiendo que el usuario Realice una búsqueda al presionar Entrar después de que haya terminado de escribir, para que no tenga para usar el mouse y hacer clic en el botón Buscar.

Pero se produce este sonido Ding. Es muy molesto.

¿Cómo podemos hacer que el sonido no se reproduzca en mi formulario?

@ David H - Así es como estoy detectar el ingreso en apremiante:

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

¿Cómo detecta que se ha pulsado Enter cuando el foco está en el cuadro de texto? –

+0

En el Panel de propiedades, haga doble clic en el evento KeyDown o KeyUp. Luego, en la Vista de código, escribe el código que voy a poner en mi pregunta para yah. – bendr

+2

KeyPress es probablemente el evento correcto, y desea establecer e.Handled = true –

Respuesta

44

Comprueba las propiedades Form.AcceptButton. Puede usarlo para especificar un botón predeterminado para un formulario, en este caso para presionar enter.

A partir de los documentos:

Esta propiedad permite designar una acción predeterminada que ocurra cuando el usuario presiona la tecla ENTER en su aplicación . El botón asignado a esta propiedad debe ser un IButtonControl que está en el formulario actual o ubicado dentro de un contenedor en el formulario actual.

También hay un CancelButton propiedad para cuando el usuario presiona escapar.

+0

Gracias @mdm, esto funcionó lo mejor para mí. :) Volveré a votar cuando tenga más representantes. – bendr

+1

@bendr tengo el mismo problema ... pero estoy usando UserControl ... no tiene Form.AcceptButton ... ¿cómo solucionarlo? –

+0

¡Esto funciona perfectamente! ¡Gracias! – C4u

48

Trate

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

Correcto, pero solo funcionará si el foco aún está en el TextBox. ¿Qué pasa si el usuario presiona 'Tab' primero? – mdm

+3

@mdm Depende del diseño de la interfaz de usuario. Quizás OP solo quiere esta acción cuando el foco está en el cuadro de texto. Eso es bastante común. –

+2

Si el usuario presionó Tab, el foco ya no estará en el TextBox, el siguiente Contorl que se enfocará es el Control de botón, que no emite ese sonido cuando presiona Enter en él. :-) – bendr

0

Establezca la propiedad IsDefault del botón de búsqueda a true. Esto lo convertirá en un botón predeterminado y se hará clic automáticamente cuando se presione Enter.

+0

De los documentos que ha vinculado a 'Para especificar el botón predeterminado de un formulario, establezca la propiedad AcceptButton del formulario en el botón deseado. – mdm

+0

Sí, lo he investigado yo mismo. Parece que ambos enfoques son intercambiables. 'AcceptButton' parece más elegante, pero estoy acostumbrado a' IsDefault'. – Zruty

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

Esta es una respuesta redundante con solo código, sin explicación. Además, todo el código 'Multiline' es completamente irrelevante. –

1

Me tropecé con esta publicación al tratar de manejar un KeyDown que funcionó para mí.

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

suprimiendo la pulsación de la tecla se detiene el caso de ser enviado al control subyacente. Esto debería funcionar si está manejando manualmente todo lo que la tecla Intro hará dentro de ese cuadro de texto. Perdón por el Visual Basic.

142

funciona para mí:

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; 

    } 

} 

El SuppressKeyPress es la realidad truco. Espero que te ayude

+24

Esta es la única respuesta válida, en mi opinión. 'e.Handled = true;' era insuficiente; fue el 'SuppressKeyPress' el que hizo el truco. –

+8

textBox1_KeyUp ding en esta situación independientemente de Handled o SuppressKeyPress – stackuser83

+0

No me sucede. Pero es posible que debas hacerlo para detener el ding. En mi caso, utilicé la última versión de visualStudio. [] s. –

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

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

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

Esto es lo que estoy buscando. – Sid

6

Puede utilizar KeyPress en lugar de KeyUp o KeyDown su más eficiente y es cómo manejar

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

y decir la paz a que aquí el 'Ding'

+1

Esto funcionó perfectamente para mí. e.Handled aparentemente desactiva el 'Ding'. Hacer que el botón 'Enviar' (en mi caso) sea el predeterminado, no habría funcionado para mí porque quería manejar la tecla 'Intro' de manera diferente para otros cuadros de texto en el formulario.

Por cierto: para este proyecto estoy usando VB. entonces en vez de lanzar e.KeyChar, lo convierto: if e.KeyChar = ChrW (Keys.Enter Then .... –

+0

me alegra que funcionó bien :) – Mawardy

+1

Dentro del 'KeyDown', usando' e. Handled' y 'e.SuppressKeyPress' no funcionaron para mí, siguen dinging. Pero cambiarlo como se sugiere aquí para usar el evento 'KeyPress 'y' e.Handled' lo hizo muy bien. – Jinlye

0

Bueno, yo vivía con este problema el tiempo suficiente y lo buscó aquí.

Después de pensar en esto por bastante tiempo y querer la forma más sencilla de solucionarlo, se me ocurrió la manera más fácil pero no tan elegante de solucionarlo.

Esto es lo que hice.

  1. Pon 2 botones invisibles "Ok" y "Cancelar" en el formulario.
  2. Establezca la propiedad AcceptButton y CancelButton en el formulario en los botones invisibles.
  3. ¡No se ha agregado ningún código a los botones!

Esto resolvió todos los problemas secundarios enumerados en este hilo, incluido el ToolStripMenu. Mi mayor queja fue el BindingNavigator, cuando ingresaba un número de registro en la posición actual para navegar y presioné Enter.

Según la pregunta original en la que el programador quería una función de búsqueda cuando se presionó el botón enter simplemente puse el código de búsqueda en el botón invisible OK.

Hasta ahora esto parece resolver todos los problemas, pero como todos sabemos con Visual Studio, probablemente algo salga a la luz.

La única otra forma elegante posible en la que podría pensar sería escribir una nueva clase de manejo de pulsaciones de teclas que sea mucho trabajo para la mayoría de mis proyectos.

4

Simplemente agregue e.SuppressKeyPress = true; en su declaración "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. 
    } 
} 
5

Uso SuppressKeyPress para detener la continuación de la tramitación de la pulsación de tecla después de su manipulación.

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 

     } 
    } 
} 
1

Hay una muy pocas posibilidades de que alguien salga a esta respuesta, pero algunas otras respuestas son realmente miedo. Suprimir evento en KeyDown mata a 2 eventos adicionales en un ataque. Establecer e.Handled propiedad a true es inútil en este contexto.
La mejor manera es establecer la propiedad Form.AcceptButton en el botón de búsqueda real.
También hay otra forma de utilizar la clave Enter - algunas personas pueden querer que actúe como el botón TAB. Para hacer eso, añadir una nueva Button, establezca su propiedad Location fuera del área Form (es decir (-100, -100)) - establecer Visible propiedad a false puede desactivar Button manipuladores en algunos casos. Establezca la propiedad Form.AcceptButton en su nuevo botón.En Click controlador de eventos añadir siguiente código
this.SelectNextControl(ActiveControl, true, true, true, true)

Ahora, es posible que desee transferir focus sólo cuando focus en TextBox es posible que desee cualquier tipo de prueba ActiveControl o utilizar e.Supress propiedad de controladores de eventos de los controles no pretende use Enter como TAB Eso es todo. Ni siquiera necesita capturar e.KeyCode

Cuestiones relacionadas