elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / .NET (C#, VB.NET, ASP) / Validación para Números Decimales TextBox en Aplicaciones Windows Forms. en: 12 Junio 2016, 21:56 pm
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
  1. ' Referencia a la clase desde la cual se usara la propiedad CurrentDecimalSeparator para obtener
  2. ' el simbolo decimal que esta configurado actualmente en Windows a traves del Panel de Control.
  3. Imports System.Globalization.CultureInfo
  4.  
  5. Module EntradasTecladoK4
  6.  
  7.  ' Permitir solo ingreso de numeros racionales positivos y negativos en Cajas de Texto.
  8.  Public Sub IngresarNrosRacionales(cajaTxt As TextBox, tecla As KeyPressEventArgs)
  9.  
  10.    ' Simbolo decimal que se tiene configurado actualmente en el SO Windows.
  11.    Dim cDecimal As Char = CChar(CurrentCulture.NumberFormat.CurrencyDecimalSeparator)
  12.    ' Texto que contiene la Caja de Texto cuyo Evento KeyPress se esta controlando.
  13.    Dim texto As String = cajaTxt.Text
  14.    ' Texto seleccionado en la Caja de Texto en caso de que se este haciendo algun tipo de edicion.
  15.    Dim txtSeleccionado As String = cajaTxt.SelectedText
  16.  
  17.    Select Case tecla.KeyChar
  18.  
  19.      ' Permitir ingreso de cualquier digito entre 0 y 9.
  20.      Case "0"c To "9"c
  21.        tecla.Handled = False
  22.  
  23.      ' En caso de estar ingresando un simbolo decimal.
  24.      Case cDecimal
  25.        ' Si no hay texto seleccionado.
  26.        If Len(txtSeleccionado) = 0 Then
  27.          ' Si no hay simbolo decimal ingresado previamente.
  28.          If InStr(texto, cDecimal) = 0 Then
  29.            ' Si no hay texto ingresado no permite ingresar simbolo decimal.
  30.            If Len(texto) = 0 Then
  31.              tecla.Handled = True
  32.            ' Si hay un solo caracter y es un guion no permite ingresar simbolo decimal.
  33.            ElseIf Len(texto) = 1 And texto = "-" Then
  34.              tecla.Handled = True
  35.            Else
  36.              tecla.Handled = False
  37.            End If
  38.          Else
  39.            tecla.Handled = True
  40.          End If
  41.        ' Si hay texto seleccionado y si dentro de la seleccion esta el simbolo decimal.
  42.        ElseIf InStr(txtSeleccionado, cDecimal) > 0 Then
  43.          ' Si se tiene seleccionado todo el texto no se permite ingresar simbolo decimal.
  44.          If Len(txtSeleccionado) = Len(texto) Then
  45.            tecla.Handled = True
  46.          ' Si inmediatamente a la izquierda de la seleccion hay un guion no se permite ingresar simbolo decimal.
  47.          ElseIf Mid(texto, cajaTxt.SelectionStart, 1) = "-" Then
  48.            tecla.Handled = True
  49.          End If
  50.        ' Si no hay simbolo decimal ingresado previamente.
  51.        ElseIf InStr(texto, cDecimal) = 0 Then
  52.          ' Si esta seleccionado todo el texto.
  53.          If Len(texto) = Len(txtSeleccionado) Then
  54.            tecla.Handled = True
  55.          Else
  56.            tecla.Handled = False
  57.          End If
  58.        Else
  59.          tecla.Handled = True
  60.        End If
  61.  
  62.      ' Permitir accion de la tecla Retroceso para borrar caracteres.
  63.      Case Chr(Keys.Back)
  64.        tecla.Handled = False
  65.  
  66.      ' Permitir ingreso de un guion unica y exclusivamente al principio de la Caja de Texto.
  67.      Case "-"c
  68.        If Len(texto) = 0 Or Len(texto) = Len(txtSeleccionado) Then
  69.          tecla.Handled = False
  70.        Else
  71.          tecla.Handled = True
  72.        End If
  73.  
  74.     ' Permitir ingreso de cualquier digito entre 0 y 9, cualquier guion o simbolo decimal en caso de
  75.     ' que no se cumplan las condiciones anteriores.
  76.      Case Else
  77.        tecla.Handled = True
  78.  
  79.    End Select
  80.  
  81.  End Sub
  82.  
  83. End Module

Código
  1. Public Class fPrincipal
  2.  
  3.  ' CONTROLAR ENTRADA DE NUMEROS EN LAS COORDENADAS.
  4.  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
  5.    Call EntradasTecladoK4.IngresarNrosRacionales(sender, e)
  6.  End Sub
  7.  
  8. End Class
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines