Validación para Números Decimales TextBox en Aplicaciones Windows Forms.

Iniciado por silvabkenny, 12 Junio 2016, 21:56 PM

0 Miembros y 1 Visitante están viendo este tema.

silvabkenny

Cordial saludo a todos,

El propósito de este tema es mostrar una idea que implementé hace poco para validar las Cajas de Texto (TextBoxs) que estoy utilizando para una aplicación de tipo Windows Form en Microsoft Visual Studio 2010. La validación consiste en permitir que en las Cajas de Texto solo se puedan ingresar números decimales negativos o positivos y que como símbolo decimal se permita solamente usar el que tiene el usuario configurado en el SO Windows por el Panel de Control.

Características de la Validación:


  • En general se permite solo el ingreso de dígitos entre 0 y 9, un guion para indicar números negativos y el símbolo decimal que tenga el usuario configurado en el Panel de Control del SO Windows.
  • Si no hay ningún texto ingresado en la Caja de Texto solo permite ingresar un guión para indicar números negativos o un dígito entre 0 y 9. No se permite ingresar símbolo decimal para evitar entradas como ,58 ó ,324.
  • Si hay un solo caracter ingresado y es un guion entonces no permite ingresar una coma para evitar entradas como: -,234 ó -,93.
  • Permite que los guiones se inserten única y exclusivamente al principio del texto del TextBox para indicar número negativos. No se permite ingresar más de un símbolo decimal para evitar entradas tal como 302,42,4 en vez de 302,424.
  • En caso de que se seleccione uno o varios caracteres ingresados previamente en el TextBox, permite ingresar dígitos numéricos. El guión lo permite ingresar en caso de que todo el texto esté seleccionado en vista de que solo se permite ingresar guiones al principio. El símbolo decimal se permite ingresar solo si está dentro de los caracteres seleccionados, tras lo cual haría una sustitución de dicho texto, pero en caso de que no esté dentro de la selección, y exista un símbolo decimal fuera de la selección no permite ingresar el símbolo decimal para evitar duplicarlos.

PROCEDIMIENTO

  • Agregar un Módulo al Proyecto de Visual Basic en el cual debe copiarse el Código que se muestra en el primer bloque en la parte inferior.
  • Desde el Código controlador del Evento KeyPress de una o varias Cajas de Texto, que generalmente se programa en el código fuente del formulario donde se encuentran las Cajas de Texto, se debe escribir un código como el del segundo bloque en la parte inferior.

Este es un comportamiento particular que me gusta darle a las Cajas de Texto que coloco en los formularios de las aplicaciones para obtener información numérica por parte del usuario. No me gustan las alternativas de validación en las cuales se permite ingresar cualquier caracter alfanumérico en las Cajas de Texto, para luego verificar si se trata de un número o no el que se ingresó.

Una alternativa interesante al planteamiento que hago, sería crear un control TextBox heredado que contenga una propiedad que permita cambiar la opción de ingreso de caracteres alfanuméricos a caracteres numéricos enteros o decimales, tanto negativos como positivos.

Cualquier sugerencia de optimización o de planteamiento alternativo será bien recibida.


Código (vbnet) [Seleccionar]

' Referencia a la clase desde la cual se usara la propiedad CurrentDecimalSeparator para obtener
' el simbolo decimal que esta configurado actualmente en Windows a traves del Panel de Control.
Imports System.Globalization.CultureInfo

Module EntradasTecladoK4

  ' Permitir solo ingreso de numeros racionales positivos y negativos en Cajas de Texto.
  Public Sub IngresarNrosRacionales(cajaTxt As TextBox, tecla As KeyPressEventArgs)

    ' Simbolo decimal que se tiene configurado actualmente en el SO Windows.
    Dim cDecimal As Char = CChar(CurrentCulture.NumberFormat.CurrencyDecimalSeparator)
    ' Texto que contiene la Caja de Texto cuyo Evento KeyPress se esta controlando.
    Dim texto As String = cajaTxt.Text
    ' Texto seleccionado en la Caja de Texto en caso de que se este haciendo algun tipo de edicion.
    Dim txtSeleccionado As String = cajaTxt.SelectedText

    Select Case tecla.KeyChar

      ' Permitir ingreso de cualquier digito entre 0 y 9.
      Case "0"c To "9"c
        tecla.Handled = False

      ' En caso de estar ingresando un simbolo decimal.
      Case cDecimal
        ' Si no hay texto seleccionado.
        If Len(txtSeleccionado) = 0 Then
          ' Si no hay simbolo decimal ingresado previamente.
          If InStr(texto, cDecimal) = 0 Then
            ' Si no hay texto ingresado no permite ingresar simbolo decimal.
            If Len(texto) = 0 Then
              tecla.Handled = True
            ' Si hay un solo caracter y es un guion no permite ingresar simbolo decimal.
            ElseIf Len(texto) = 1 And texto = "-" Then
              tecla.Handled = True
            Else
              tecla.Handled = False
            End If
          Else
            tecla.Handled = True
          End If
        ' Si hay texto seleccionado y si dentro de la seleccion esta el simbolo decimal.
        ElseIf InStr(txtSeleccionado, cDecimal) > 0 Then
          ' Si se tiene seleccionado todo el texto no se permite ingresar simbolo decimal.
          If Len(txtSeleccionado) = Len(texto) Then
            tecla.Handled = True
          ' Si inmediatamente a la izquierda de la seleccion hay un guion no se permite ingresar simbolo decimal.
          ElseIf Mid(texto, cajaTxt.SelectionStart, 1) = "-" Then
            tecla.Handled = True
          End If
        ' Si no hay simbolo decimal ingresado previamente.
        ElseIf InStr(texto, cDecimal) = 0 Then
          ' Si esta seleccionado todo el texto.
          If Len(texto) = Len(txtSeleccionado) Then
            tecla.Handled = True
          Else
            tecla.Handled = False
          End If
        Else
          tecla.Handled = True
        End If

      ' Permitir accion de la tecla Retroceso para borrar caracteres.
      Case Chr(Keys.Back)
        tecla.Handled = False

      ' Permitir ingreso de un guion unica y exclusivamente al principio de la Caja de Texto.
      Case "-"c
        If Len(texto) = 0 Or Len(texto) = Len(txtSeleccionado) Then
          tecla.Handled = False
        Else
          tecla.Handled = True
        End If

     ' Permitir ingreso de cualquier digito entre 0 y 9, cualquier guion o simbolo decimal en caso de
     ' que no se cumplan las condiciones anteriores.
      Case Else
        tecla.Handled = True

    End Select

  End Sub

End Module


Código (vbnet) [Seleccionar]

Public Class fPrincipal

  ' CONTROLAR ENTRADA DE NUMEROS EN LAS COORDENADAS.
  Private Sub tbCoordenadas_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles tbNorteDibujo01.KeyPress, tbNorteReal01.KeyPress, tbEsteDibujo01.KeyPress, tbEsteReal01.KeyPress, tbNorteDibujo02.KeyPress, tbNorteReal02.KeyPress, tbEsteDibujo02.KeyPress, tbEsteReal02.KeyPress
    Call EntradasTecladoK4.IngresarNrosRacionales(sender, e)
  End Sub

End Class
Kenny Silva.
Ingeniero Civil.
Universidad de Los Andes.
Mérida, Venezuela.