2011-03-12 14 views
6

tengo un control Textbox que a veces se actualiza mediante programación y también puede ser actualizado por el usuario. ¿cómo puedo distinguir entre esos dos eventos? me gustaría tener el indicador "Sucio" establecido en "verdadero" cuando el usuario cambia el texto.C# textbox event solo para entrada de usuario

+0

¿Está [vinculando datos] (http://msdn.microsoft.com/en-us/library/ms752347.aspx)? –

+0

sin enlace de datos para este control ... – kaycee

Respuesta

6

Usted puede utilizar el evento tecla de abajo del cuadro de texto.

 private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     //Insert the code you want to run when the text changes here! 
    } 
+0

este evento es válido para el cuadro de texto, pero me pregunto qué pasa con otros controles como NumericUpDown ... – kaycee

+2

Sí, esta solución no es la más limpia para todos los controles. Sin embargo, el control numérico de reducción tiene tanto el evento keydown como el evento mousedown. Supongo que podrías usar ambos junto con el seguimiento del valor del control. Alternativamente, siempre puede lanzar un indicador booleano cada vez que cambie el valor de forma programática, luego verifique el indicador booleano en el evento ValueChanged para el control (estableciéndolo de nuevo en el valor predeterminado antes de continuar su procesamiento). Esa es ciertamente una solución muy simple, tal vez no la más elegante. –

+1

Esto no funciona si el usuario corta y pega datos en el cuadro de texto con el mouse. –

2

evite establecer el indicador "sucio" cuando termine programáticamente. Desactivar el controlador de eventos o establece un indicador que dice "este es el código, no el usuario"

+0

Desactivar el controlador de eventos durante la duración de los cambios en línea es una gran idea. También resuelve cualquier problema que pueda tener los usuarios al pegar texto en el cuadro. –

0

tratar onBlur

esto va a captar el momento que el usuario sale del campo.

se puede trabajar en conjunto con onFocus para guardar el valor antes de editar

+0

buena idea, pero no 100% efectiva. Sería un poco "más limpio" que mi respuesta –

+0

"Limpieza" no tiene sentido si no funciona. Simplemente separar el controlador es bastante estándar para este tipo de cosas. –

+0

No está hablando del controlador deshabilitado, sino de la bandera adicional. Bueno, es otra bandera adicional o un controlador adicional ... –

5

mi solución trabajo para el tipo, copiar y pegar

private void TextChanged(object sender, EventArgs e) 
    { 
     if (((TextBox)sender).ContainsFocus) 
     { 

     } 
    } 
+3

¿Qué sucede si el control tiene foco, pero el texto se está cambiando programáticamente? – Pedro

+0

use el delegado Textchnaged para la unión de controles y use else para programar el cambio – naderi

2

Comprobar propiedad Modified del cuadro de texto en el evento TextChanged. Si es verdadero, el usuario realizó los cambios, de lo contrario, el texto se modificó mediante programación.

Cuestiones relacionadas