¿Cómo mantener el valor no válido para NumericUpDown después de que pierde el foco?

En mi proyecto hay un UserControl que incluye un ctrl NumericUpDown, y su rango de valor válido es de 10 a 100 ,

así que si el usuario ingresa 200 en NumericUpDown ctrl, entonces su valor cambiará a 100 automáticamente después de cambiar a otro ctrl, se ve un poco curioso para el cliente, ya que pueden hacer clic en el botón Aceptar después de la entrada 200 en el control NumericUpDown, necesita un cuadro de mensaje que les diga que el valor que ingresan no está en el rango.

Pero la pregunta es que el valor de NumericUpDown cambiará automáticamente después de que el enfoque cambie si la entrada de valor está fuera de su rango.

Entonces, ¿cómo implementar esto?

Sameh Serag, este es el código que he probado. He añadido 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 mensaje con un valor de 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 de texto en NumericUpDown se cambia a 100. Muy 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); } } 

El truco consiste en incrustar el cuadro de texto dentro del control de actualización numérico y controlar su evento de Validación.

Aquí es cómo hacerlo:

Cree un formulario ficticio y agregue un control de actualización numérico y algunos otros controles, y cuando el control de desconexión numérico pierda el enfoque, el texto del formulario se establecerá en el valor que ingresó el usuario.

Aquí está 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; } } 

EDITAR:

@Carlos_Liu: Ok, puedo ver ahora el problema, puede lograr esto con el evento TextChanged, solo guarde el valor en una variable ficticia y reutilícelo 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 muestra:

 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 mantener el valor ingresado, todavía hay un truco para hacerlo: @ el evento Validating del cuadro de texto, verifique el valor, si no está dentro del rango, cancele perdiendo el foco.

Aquí hay 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; } } }