2010-02-23 14 views
6

En mi proyecto no es un control de usuario que incluye un ctrl NumericUpDown, y su rango de valores válidos es de 10 a 100,¿Cómo mantener el valor no válido para NumericUpDown después de que pierde el foco?

por lo que si las entradas de usuario 200 en NumericUpDown ctrl, entonces su valor será cambiado a 100 automáticamente después de el foco cambió a otro ctrl, parece un poco curioso para el cliente, porque pueden hacer clic en el botón Aceptar después de ingresar 200 en el ctrl NumericUpDown, necesitan un cuadro de mensaje que les diga que el valor que ingresaron no está en el rango.

Pero la pregunta es si el valor de NumericUpDown cambiará automáticamente después de que el foco haya cambiado si la entrada del valor está fuera de su rango.

Entonces, ¿cómo implementar esto?

Sameh Serag, este es el código que he probado. He agregado un botón en el formulario pero no hice nada. El resultado para mí es después de ingresar 200 y hacer clic en el botón, solo se muestra un cuadro de mensaje con el valor 100. Después de ingresar 200 y presionar la tecla de tabulación, solo se mostrará un cuadro de mensaje con el valor 200 y el valor del texto en NumericUpDown se cambiará a 100. Tan curioso :-) De todos modos muchas gracias por su ayuda! Por cierto, la versión .Net framework es 2.0 con sp2 para mí.

public partial class Form1 : Form 
{ 
    private TextBox txt; 

    public Form1() 
    { 
     InitializeComponent(); 

     txt = (TextBox)numericUpDown1.Controls[1]; 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     MessageBox.Show(txt.Text); 
    } 
} 
+2

No creo que esto es posible, pero 1 porque es un problema que he alcanzado en el pasado también. Terminé cambiando a cuadros de texto antiguos. –

+0

+1 a Matt.Los controles NumericUpDown son los controles más desagradables que se hayan concebido. Nunca he visto a un usuario haciendo clic en esos pequeños botones o usando las teclas de flecha. Simplemente escriben. Y que Dios te ayude si estás en una tableta. – Josh

+0

@Carlos_Liu: Actualicé mi respuesta a continuación después de su modificación a la pregunta. Por cierto: funcionó para mí en todos los escenarios que describiste arriba. Pruébalo y cuéntanos los resultados ;-) –

Respuesta

13

El truco consiste en obtener el cuadro de texto incrustado en el control numérico de actualización, y manejar su evento de Validación.

Aquí es cómo lograr que se haga:

Creat una forma ficticia y agregue un control updown numérico y algunos otros controles, y cuando el control unpdown numérico pierde el foco, el texto del formulario se establece en el valor que el usuario ingresó

Aquí el código de lo que he hecho:

public partial class Form1 : Form 
    { 
     TextBox txt; 
     public Form1() 
     { 
      InitializeComponent(); 
      txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
      txt.Validating += new CancelEventHandler(txt_Validating); 
     } 
     void txt_Validating(object sender, CancelEventArgs e) 
     { 
      this.Text = txt.Text; 
     } 
    } 

EDIT:

@Carlos_Liu: Ok, puedo ver ahora el problema, se puede lograr esto con el Evento TextChanged, simplemente guarde el valor en una variable ficticia y vuelva a utilizarlo en txt_Validating, pero tenga cuidado, no actualice esta variable a menos que el cuadro de texto esté enfocado.

Aquí está el nuevo código de ejemplo:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) //don't save the value unless the textbox is focused, this is the new trick 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     MessageBox.Show("Val: " + val); 
    } 
} 

editar # 2

@Carlos_Liu: Si necesita el valor introducido debe mantenerse, todavía hay un truco para hacer así que: @ el evento Validación del cuadro de texto, verifique el valor, si no está dentro del rango, ¡cancele la pérdida del enfoque!

Aquí es una nueva versión del código:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1]; 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     int enteredVal = 0; 
     int.TryParse(val, out enteredVal); 
     if (enteredVal > numericUpDown1.Maximum || enteredVal < numericUpDown1.Minimum) 
     { 
      txt.Text = val; 
      e.Cancel = true; 
     } 
    } 
} 
+0

Parece que la dosis no funciona porque cuando ingresas el evento de validación de la caja de texto, el valor ha sido cortado según el mínimo de NumericUpDown. valor máximo –

+0

No, funciona para mí. Asegúrese de que está manejando el evento ** Validación ** no ** Validado **. Pruébalo solo y luego insértalo en tu proyecto. –

+0

¿Ha intentado ingresar un valor mayor que el valor máximo de numericUpDown1? Supongamos que el valor máximo de NumericUpDown1 es 100, si de entrada 200, a continuación, txt_Validating se produce tras NumericUpDown1 perder el foco, y se puede popup texto del txt de la siguiente manera ### vacío txt_Validating (object sender, CancelEventArgs e) { MessageBox.Show (txt.Text); } ### verá que su valor ya ha sido cortado a 100 –

Cuestiones relacionadas