Pregunta

Soy un programador de MFC nuevo en C# y estoy buscando un control simple que permita la entrada de números y la validación de rangos.

¿Fue útil?

Solución

Mire el control "NumericUpDown".Tiene validación de rango, la entrada siempre será numérica y tiene esos ingeniosos botones de incremento/disminución.

Otros consejos

Tuve que implementar un Control que solo aceptara números, enteros o reales.Construyo el control como una especialización de (léase:derivado de) control TextBox, y utilizando control de entrada y una expresión regular para la validación.Agregar validación de rango es terriblemente fácil.

Este es el código para construir la expresión regular._numericseparation es una cadena con caracteres aceptados como valores de coma decimales (por ejemplo, a '.' o a ','::$10,50 10,50€

private string ComputeRegexPattern()
{
   StringBuilder builder = new StringBuilder();
   if (this._forcePositives)
   {
       builder.Append("([+]|[-])?");
   }
   builder.Append(@"[\d]*((");
   if (!this._useIntegers)
   {
       for (int i = 0; i < this._numericSeparator.Length; i++)
       {
           builder.Append("[").Append(this._numericSeparator[i]).Append("]");
           if ((this._numericSeparator.Length > 0) && (i != (this._numericSeparator.Length - 1)))
           {
               builder.Append("|");
           }
       }
   }
   builder.Append(@")[\d]*)?");
   return builder.ToString();
}

La expresión regular coincide con cualquier número (es decir,cualquier cadena con caracteres numéricos) con un solo carácter como separación numérica y un carácter opcional '+' o '-' al principio de la cadena.Una vez que crea la expresión regular (al instanciar el Control), verifica si el valor es correcto anulando el método OnValidating.CheckValidNumber() simplemente aplica Regex al texto introducido.Si la coincidencia de expresiones regulares falla, activa un proveedor de errores con un error especificado (establecido con la propiedad pública ValidationError) y genera un evento ValidationError.Aquí podrás realizar la verificación para saber si el número está en el rango requerido.

private bool CheckValidNumber()
{
   if (Regex.Match(this.Text, this.RegexPattern).Value != this.Text)
   {
       this._errorProvider.SetError(this, this.ValidationError);
       return false;
   }
   this._errorProvider.Clear();
   return true;
}

protected override void OnValidating(CancelEventArgs e)
{
   bool flag = this.CheckValidNumber();
   if (!flag)
   {
      e.Cancel = true;
      this.Text = "0";
   }
   base.OnValidating(e);
   if (!flag)
   {
      this.ValidationFail(this, EventArgs.Empty);
   }
}

Como dije, también evito que el usuario ingrese datos en el cuadro de texto que no sean caracteres numéricos que anulan el método OnKeyPress:

protected override void OnKeyPress(KeyPressEventArgs e)
{
    if ((!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar)) && (!this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._numericSeparator.Contains(e.KeyChar.ToString())))
    {
        e.Handled = true;
    }
    if (this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._forcePositives)
    {
        e.Handled = true;
    }
    if (this._numericSeparator.Contains(e.KeyChar.ToString()) && this._useIntegers)
    {
        e.Handled = true;
    }
    base.OnKeyPress(e);
}

El toque elegante:Compruebo si el número es válido cada vez que el usuario suelta una tecla, para que el usuario pueda recibir comentarios mientras escribe.(Pero recuerda que debes tener cuidado con el evento ValidationFail ;))

protected override void OnKeyUp(KeyEventArgs e)
{
    this.CheckValidNumber();
    base.OnKeyUp(e);
}

Puede utilizar un cuadro de texto normal y un control Validador para controlar la entrada.

Intente utilizar un control de proveedor de errores para validar el cuadro de texto.Puedes usar int.TryParse() o double.TryParse() para verificar si es numérico y luego validar el rango.

Puede utilizar una combinación de RequiredFieldValidator y CompareValidator (establecido en DataTypeCheck para el operador y Tipo establecido en Integer)

Si lo desea, lo obtendrá con un cuadro de texto normal; de lo contrario, la recomendación anterior es buena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top