Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: silvabkenny en 12 Junio 2016, 21:56 PM

Título: Validación para Números Decimales TextBox en Aplicaciones Windows Forms.
Publicado por: silvabkenny 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:


PROCEDIMIENTO

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