none
Como se puede hacer que un textbox me reciba solo numeros del 1 al 10 RRS feed

Respuestas

  • [...] y se pueden usar decimales entre medias

    Ah, ese matiz es importante, porque entonces no te sirve el NumericUpDown, que solo devuelve valores enteros.

    Entonces es mejor que volvamos al TextBox. Implementa un manejador para su evento Validating, y dentro del Validating simplemente examina el valor y devuelve un error si es menor que 1 o mayor que 10:

    private void textBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e) {    this.errorProvider1.SetError(textBox1, ""); // limpiar el error para el caso de que todo vaya bien

    decimal d; bool ok = decimal.TryParse(textBox1.Text, out d); if (!ok) { e.Cancel = true; textBox1.Select(0, textBox1.Text.Length); this.errorProvider1.SetError(textBox1, "No es numérico"); } if (d < 1 || d > 10) { e.Cancel = true; textBox1.Select(0, textBox1.Text.Length); this.errorProvider1.SetError(textBox1, "Debe estar entre 1 y 10"); } }


    Como ves, primero "parsea" el texto para dar un error si teclean algo que no sea un número, y después compara el número para ver si está en el rango deseado. En el caso de que falle alguna de las comparaciones, este ejemplo presenta un mensaje de error a través de un ErrorProvider (que lógicamente tendrías que añadir al formulario para que esto funcione). Obviamente esto solo es un ejemplo, podrías informar al usuario por cualquier otro método que consideres oportuno, en lugar de usar un errorprovider.

    • Marcado como respuesta Daniel Rmr'z sábado, 5 de septiembre de 2020 19:59
    sábado, 5 de septiembre de 2020 19:25
    Moderador
  • Hola

    Veo que ya tienes una respuesta a tu pregunta. Si tienes otra consulta no dudes en abrir otro hilo.

    Saludos!

    --------------------------------------------------------------------------------

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    lunes, 7 de septiembre de 2020 17:42
    Moderador

Todas las respuestas

  • ¿Tiene que ser a la fuerza un TextBox? Suponiendo que se trate de un programa de WInForms (no has mencionado de qué clase de aplicación se trata), existe un control que sería ideal para esto. Se trata del NumericUpDown. Le ajustas la propiedad Maximum a 10 y Minimum a 1, y listo. Con eso ya permite que el usuario introduzca números del 1 al 10, con unas flechitas para incrementar y decrementar el número.

    Enlace a la documentación

    Si es otro tipo de aplicación, o tienes otros requisitos que te fuerzan a que el tipo de control sea obligatoriamente un TextBox, danos unos cuantos detalles más acerca de tus requerimientos y buscaremos otra solución.

    sábado, 5 de septiembre de 2020 10:54
    Moderador
  • Si es una aplicacion de Wndows Form, la cosa es que yo estoy sacando promedios de notas de colegio, y quiero que no se permita agregar numeros mayores a 10 ni menores a 0, y se pueden usar decimales entre medias

    sábado, 5 de septiembre de 2020 18:44
  • En resumen nececito precisamente que los numeros que se ingresen en el textBox sean mayores o iguales a cero y menores o iguales a 10

    sábado, 5 de septiembre de 2020 18:48
  • [...] y se pueden usar decimales entre medias

    Ah, ese matiz es importante, porque entonces no te sirve el NumericUpDown, que solo devuelve valores enteros.

    Entonces es mejor que volvamos al TextBox. Implementa un manejador para su evento Validating, y dentro del Validating simplemente examina el valor y devuelve un error si es menor que 1 o mayor que 10:

    private void textBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e) {    this.errorProvider1.SetError(textBox1, ""); // limpiar el error para el caso de que todo vaya bien

    decimal d; bool ok = decimal.TryParse(textBox1.Text, out d); if (!ok) { e.Cancel = true; textBox1.Select(0, textBox1.Text.Length); this.errorProvider1.SetError(textBox1, "No es numérico"); } if (d < 1 || d > 10) { e.Cancel = true; textBox1.Select(0, textBox1.Text.Length); this.errorProvider1.SetError(textBox1, "Debe estar entre 1 y 10"); } }


    Como ves, primero "parsea" el texto para dar un error si teclean algo que no sea un número, y después compara el número para ver si está en el rango deseado. En el caso de que falle alguna de las comparaciones, este ejemplo presenta un mensaje de error a través de un ErrorProvider (que lógicamente tendrías que añadir al formulario para que esto funcione). Obviamente esto solo es un ejemplo, podrías informar al usuario por cualquier otro método que consideres oportuno, en lugar de usar un errorprovider.

    • Marcado como respuesta Daniel Rmr'z sábado, 5 de septiembre de 2020 19:59
    sábado, 5 de septiembre de 2020 19:25
    Moderador
  • Gracias, entonces tambien puedo poner un MessageBox para informar al usuario que corrija el dato, no se si es muy tonta la pregunta, pero esto lo hago en otra clase, o en el Form1

    sábado, 5 de septiembre de 2020 19:51
  •  pero esto lo hago en otra clase, o en el Form1

    Bueno, en teoría podrías hacerlo en otra clase... pero entonces tendrías que instanciar la otra clase, y hacer la conexión del manejador del evento contra esa instancia.

    En cambio, si lo haces en el Form1, puedes conectar ese manejador directamente desde el diseñador, sin tener que escribir todo el código adicional que se necesitaría para conectar con la otra clase.

    Recuerda, para implementar un evento, NO BASTA con solo copiar el código. Es necesario establecer la conexión con el control que dispara el evento. Desde el diseñador de formularios, esto se hace pulsando el "rayito" que hay en la parte superior de la ventana de propiedades cuando seleccionas el TextBox.

    sábado, 5 de septiembre de 2020 20:04
    Moderador
  • Recuerda, para implementar un evento, NO BASTA con solo copiar el código. Es necesario establecer la conexión con el control que dispara el evento. 

    en este caso cual seria el control que dispara el evento y donde lo conecto, nunca habia hecho eso


    sábado, 5 de septiembre de 2020 21:47
  • en este caso cual seria el control que dispara el evento y donde lo conecto, nunca habia hecho eso

    El control que dispara el evento lógicamente es el TextBox que quieres limitar para que esté entre 1 y 10.

    Lo de conectar un control a un evento es algo corrientísimo, y se hace todo el rato cuando programas una aplicación de escritorio. La forma más habitual de hacerlo consiste en usar el evento predeterminado; esto ocurre cuando haces doble-click en un botón para que te genere el Boton_Click. Esto se genera automáticamente porque el Click resulta ser el evento predeterminado del Buttton. Pero los controles tienen docenas de eventos. Cuando quieres usar uno que no es el predeterminado, tienes que ir a la ventana de Propiedades y conectarlo desde ahí.

    Primero selecciona el control en la ventana de diseño (haz un solo click sobre el TextBox). Después acude a la ventana de Propiedades, que es la que sale por defecto abajo a la derecha en Visual Studio. SI no está visible, puedes llamarla pulsando F4. Esa ventana presenta de forma predeterminada las Propiedades del control, pero en la pare de arriba tiene un icono en forma de rayo amarillo que hace que pase a presentar los Eventos en lugar de las Propiedades. En la lista bajas hasta el evento deseado y haciendo doble click te genera el esqueleto del manejador de eventos. O si ya has escrito ese manejador de antemano en el fuente, puedes seleccionarlo en un dropdown que aparece junto al evento, y con eso se hace la conexión.

    Aquí tienes un enlace a la Documentación.


    domingo, 6 de septiembre de 2020 5:53
    Moderador
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace RM20011Guia3Ejercicio8
    {
        public partial class Form1 : Form
        {
            Calculo_Promedio myCalculo = new Calculo_Promedio();
            public Form1()
            {
                InitializeComponent();
            }
            private void txtbPE1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
            {
              
            }
            private void groupBox1_Enter(object sender, EventArgs e)
            {
    
            }
            private void btnCal_Click(object sender, EventArgs e)
            {
                try
                {
    
                    myCalculo.Practica1 = double.Parse(txtbPE1.Text);
                    myCalculo.Practica2 = double.Parse(txtbPE2.Text);
                    myCalculo.Practica3 = double.Parse(txtbPE3.Text);
                    myCalculo.Parcial1 = double.Parse(txtbEP1.Text);
                    myCalculo.Parcial2 = double.Parse(txtbEP2.Text);
                    txtbTOT.Text = myCalculo.Promedio_F(myCalculo.Parcial1, myCalculo.Parcial2, myCalculo.Practica1, myCalculo.Practica2, myCalculo.Practica3).ToString();
                    if  (myCalculo.Promedio_F(myCalculo.Parcial1, myCalculo.Parcial2, myCalculo.Practica1, myCalculo.Practica2, myCalculo.Practica3) <6)
                    {
                        MessageBox.Show("Su nota es: "+ myCalculo.Promedio_F(myCalculo.Parcial1, myCalculo.Parcial2, myCalculo.Practica1, myCalculo.Practica2, myCalculo.Practica3).ToString() + ", Usted a REPROBADO" );
                    }
                    else
                    {
                        MessageBox.Show("Su nota es: " + myCalculo.Promedio_F(myCalculo.Parcial1, myCalculo.Parcial2, myCalculo.Practica1, myCalculo.Practica2, myCalculo.Practica3).ToString() + ", Usted a APROBADO");
                    }
                }
                catch 
                {
                    MessageBox.Show("ERROR, Intente escribiendo numeros  del 0 - 10");              
                }           
            }
            private void button1_Click(object sender, EventArgs e)
            {
                txtbTOT.Text = "";
                txtbPE3.Text = "";
                txtbPE2.Text = "";
                txtbPE1.Text = "";
                txtbEP2.Text = "";
                txtbEP1.Text = "";
            }
    
            private void txtbPE1_CausesValidationChanged(object sender, EventArgs e)
            {
                this.errorProvider1.SetError(txtbPE1, ""); // limpiar el error para el caso de que todo vaya bien
                decimal d;
                bool ok = decimal.TryParse(txtbPE1.Text, out d);
                if (!ok)
                {
                    e.Cancel = true;
                    txtbPE1.Select(0, txtbPE1.Text.Length);
                    this.errorProvider1.SetError(txtbPE1, "No es numérico");
                }
    
                if (d < 0 || d > 10)
                {
                    e.Cancel = true;
                    txtbPE1.Select(0, txtbPE1.Text.Length);
                    this.errorProvider1.SetError(txtbPE1, "Debe estar entre 0 y 10");
                }
            }
        }
    }

    domingo, 6 de septiembre de 2020 18:03
  • creo que lo hice mal, no me funciona, no se como conctarlo

    domingo, 6 de septiembre de 2020 18:03
  • Ya pude, Muchas Gracias

    domingo, 6 de septiembre de 2020 18:17
  • Hola

    Veo que ya tienes una respuesta a tu pregunta. Si tienes otra consulta no dudes en abrir otro hilo.

    Saludos!

    --------------------------------------------------------------------------------

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    lunes, 7 de septiembre de 2020 17:42
    Moderador