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

Un comentario sobre “Control Windows Form para validar DNI”

  1. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *