2009-02-04 12 views
12

He leído en otro lugar aquí que para capturar el trazo "Enter" en un cuadro de texto y usarlo como si presionara un botón, debo establecer la propiedad KeyPreview del formulario en verdadero y verificar el valor de KeyDown.¿Cómo determinar qué control en la forma tiene foco?

Quiero ser capaz de utilizar esta funcionalidad en varios controles TextBox que están asociados con un botón diferente.

Mi pregunta es ¿cómo puedo saber qué control causó el evento KeyPress? El remitente aparece como el formulario en sí.

G

Respuesta

5

he encontrado una solución que parece estar funcionando.

private void DeviceForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13 && tstxtDeviceFilter.Focused) 
     { 
      filterByDeviceSN(); 
     } 
    } 

¡No puedo evitar pensar que debe haber una mejor manera!

--edit - Editar - Editar - Editar - EDIT--

Bueno, después de ver las sugerencias a continuación (gracias) que he encontrado una manera 'mejor' para mí en este circunstancia.

this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown); 

    private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13) 
     { 
      filterByDeviceSN(); 
     } 
    } 

Obviamente al atrapar el evento en el cuadro de texto en sí más que la forma no tiene que preocuparse por el enfoque. ¡Una vez más me siento tonto por no pensar en eso por tanto tiempo!

4

Cada formulario tiene una propiedad para un botón "Aceptar" & botón "Cancelar", estos son los botones que se "presiona" cuando el usuario presiona enter y escapa respectivamente.

Puede cambiar el botón predeterminado como cada control recibe el foco (que puede tener uno consiguió lanzador evento de foco por botón, y compartirlo con un conjunto de cuadros de texto)

Si hace esto, entonces la apariencia de los botones cambian dando al usuario una señal visual que le dice qué botón es el predeterminado.

Como alternativa, si no desea hacerlo, puede usar la propiedad "ActiveControl" y probar para ver a qué conjunto de cuadros de texto pertenece.

¿Te has preguntado, ¿cuál debería ser el botón predeterminado si no es uno de estos cuadros de texto?

+0

Gracias BW, esta es información útil que debe saber. Creo que iré con mi propia respuesta en este caso, ya que solo estoy interesado en presionar las teclas "Enter" en el cuadro de texto único y solo cuando tiene el foco. Gracias, gracias! –

+0

El comentario de G me indicó dónde estaba yendo mal, gracias por más detalles. Mi aplicación es principalmente solo este diálogo, por lo que ni siquiera tiene un botón y nunca se cierra, excepto cuando lo abandonas. –

3

¿Has probado Form.ActiveControl?

+2

Eché un vistazo a esto, pero donde esperaba encontrar el nombre del control con el foco "this.ActiveControl.Name" era una cadena vacía. ¡Probablemente estoy haciendo algo muy obviamente equivocado! –

0

Puede utilizar este código como punto de partida para capturar los eventos de desactivación de teclas del formulario. El ActiveControl es uno que tiene el foco. En este ejemplo, es flexible para agregar otras acciones en "Enter" cuando se encuentre en diferentes TextBoxes en el formulario. Es VB.NET, pero debería poder convertirlo fácilmente a C#.

Private Sub MyForm_KeyDown(ByVal sender As Object, _ 
    ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     If Me.ActiveControl.Name = Me.TextBox1.Name Then 
      ' This is the TextBox we want to be active to run filterByDeviceSN() 
      filterByDeviceSN() 
     ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then 
      foo() 
     End If 
    End If 
End Sub 
+0

ActiveControl.El nombre devuelve una cadena vacía. ActiveControl.Text se comporta como se esperaba al devolver la misma cadena que está actualmente en el cuadro de texto. "this.ActiveControl.Equals (tstxtDeviceFilter)" devuelve falso. Creo que voy a ir con mi propia respuesta por ahora. A menos que alguien sepa cómo obtener el nombre? –

Cuestiones relacionadas