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
' 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
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