Eduardo y sus cosillas del .net

Aquí se escribe y se discute de programación para trabajadores autonomos y pequeñas empresas.

This Blog

Syndication

Search

Community

Email Notifications

Archives

Referencia Microsoft

Control Windows Form para validar DNI

 

Con el paso del tiempo todos los programadores creamos nuestra propia utilería con la cual agilizamos el desarrollo de nuestras soluciones. Es cierto que con las constantes evoluciones algunas se quedan obsoletas, pero muchas otras mantienen su vigencia a pesar del discurrir del tiempo. Una estrategia muy útil es la de crear controles que encapsulen toda la lógica de validación de datos. En esta línea voy a exponer como crear algunos controles TextBox para la introducción de DNI, NASS, EAN13 y ISBN en una librería de controles para posteriormente incorporarlos a nuestro panel de controles en Visual Studio. Si quieres profundizar en los algoritmos que existen para validar estos códigos puedes visitar La tecla de Escape donde encontraras mucha información al respecto, y seguramente la añadirás a tus favoritos. Al final puedes encontrar un descargable con el proyecto que contiene el código. Si decides descargarlo y emplearlo directamente te recomiendo que lo examines, aunque lo he probado, es una buena costumbre revisar los códigos. Algunas veces los duendes hacen de las suyas y una coma de comentario mal puesta da al traste con toda una función.


Control TextBox para validar DNI

Este es un control de obligada presencia para la creación de toda aplicación de gestión. En este caso vamos a controla la entrada de caracteres. Tendremos en cuenta que los DNI para extranjeros comienza con X con lo cual controlaremos dicha eventualidad

El código en cuestión lo que hace es crear un nuevo control del tipo TextBox, del cual hereda toda su funcionalidad. Lo que hacemos es personalizar todas las propiedades y eventos que nos interesa. El código es el siguiente:

 Imports System.ComponentModel
<Drawing.ToolboxBitmap("TextBoxDNI.bmp")> _
Public Class TextBoxDNI
    Inherits System.Windows.Forms.TextBox

    'Variable para almacenar el DNI temporalmente
    Private loDNI As String
    'Variable que nos indica si es un NIE
    Private loNIE As Boolean = False

    Private loDNIOK As Boolean
    'Esta propiedad nos indica el estado en los procesos de validación de formulario
    Public ReadOnly Property DNIOK() As Boolean
        Get
            Return loDNIOK
        End Get
    End Property


    ''' <summary>
    ''' Sobrecargamos el método de getfocus para seleccionar todo el texto
    ''' </summary>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
        MyBase.OnGotFocus(e)
        If Me.TextLength <> 0 Then Me.SelectAll()
    End Sub

    '
    ''' <summary>
    ''' Personalizamos las acciones al perder el foco
    ''' </summary>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
        MyBase.OnLeave(e)
        'evaluamos si tiene contenido
        If Me.TextLength <> 0 Then
            'EVALUAMOS EL DNI SI ES DISTINTO DEL QUE TENEMOS YA
            If Me.Text <> loDNI Then
                Me.Text.ToUpper()
                Me.EvaluarDNI()
            End If
        Else
            'Si está vacia cambiaremos el fondo a predeterminado, por si hubieramos borrado una entrada erronea
            Me.BackColor.ToString()
        End If
    End Sub


    'METODO DE VALIDACIÓN
    Private Sub EvaluarDNI()
        Dim numeros As String = "0123456789"
        Dim dc As String = Nothing
        If Me.TextLength >= 8 Then
            'Extraemos el último caracter
            dc = Me.Text.Chars(Me.TextLength - 1)
            'Comprobamos que el último caracter sea una letra
            If numeros.LastIndexOf(dc) <> -1 Then
                'El último caracter es un número
                Me.BackColor = Drawing.Color.MistyRose
                Me.loDNIOK = False
                MsgBox("Falta la letra de control")
                'Habilitando la dos líneas siguiente forzamos una introducción válida
                'Me.Focus()
                'Me.SelectAll()
            Else
                'Comprobamos si es NIE
                If Me.Text.Chars(0) = "X"c Then
                    If Me.TextLength = 10 Then
                        loDNIOK = True
                        loNIE = True
                    Else
                        'El NIE es incorrecto
                        loDNIOK = False
                        Me.BackColor = Drawing.Color.MistyRose
                        Me.loDNIOK = False
                        MsgBox("El NIE debe tener 10 caracteres")
                        'Habilitando la dos líneas siguiente forzamos una introducción válida
                        'Me.Focus()
                        'Me.SelectAll()
                    End If

                Else
                    If Me.TextLength > 9 Then
                        'El DNI es incorrecto
                        loDNIOK = False
                        Me.BackColor = Drawing.Color.MistyRose
                        Me.loDNIOK = False
                        MsgBox("El DNI debe tener máximo 9 caracteres")
                        'Habilitando la dos líneas siguiente forzamos una introducción válida
                        'Me.Focus()
                        'Me.SelectAll()
                    Else
                        loDNIOK = True
                    End If
                End If
            End If
        Else
            'Si el resultado es incorrecto por la longitud
            Me.BackColor = Drawing.Color.MistyRose
            Me.loDNIOK = False
            MsgBox("El DNI debe tener almenos 8 caracteres")
            'Habilitando la dos líneas siguiente forzamos una introducción válida
            'Me.Focus()
            'Me.SelectAll()
        End If
        'Si el resultado previo es correcto valido el DNI
        Dim DNI As Integer = Nothing
        Dim cadena As String = "TRWAGMYFPDXBNJZSQVHLCKE"
        If loDNIOK = True Then
            If loNIE = True Then
                DNI = CInt(Me.Text.Substring(1, Me.TextLength - 2))
            Else
                DNI = CInt(Me.Text.Substring(0, Me.TextLength - 1))
            End If
            Dim letra As String = cadena.Substring(DNI Mod 23, 1)
            If letra = dc Then
                loDNIOK = True
                Me.BackColor = Drawing.Color.PaleGreen
                Me.loDNIOK = True
            Else
                Me.BackColor = Drawing.Color.MistyRose
                Me.loDNIOK = False
            End If
        End If
    End Sub

    'Limitamos el máximo de caracteres a 10
    Public Overrides Property MaxLength() As Integer
        Get
            Return 10
        End Get
        Set(ByVal value As Integer)
            MyBase.MaxLength = 10
        End Set
    End Property

End Class

 

Tienes un archivo zip con el proyecto para que juegues con el: Controles Tropicalia 0.1.zip

Published 9/11/2007 8:00 por Eduardo Ortega
Comparte este post:

Comentarios

# Advanced Mailing System@ Friday, July 3, 2009 8:39 PM

Hi,

Do you deliver sales promotions to potential clients or newsletters to your current client base?

I can help you generating quite some traffic and income at a very afforable price.

Main reasons why work with WizMailer's advanced mailing system:

Results - will get all of your emails delivered to your clients' inbox.

Economical - low prices and the best ROI you can get when marketing online.

Automation - lists management, campaigns scheduling, statistics and autoresponder.

Optimized Design - design your newsletter online, preview and test deliverability.

For more information please visit http://www.mailer365.com

Yours Sincerely,

Michael Faust

Sales Manager

Wizmailer.

by Michael