Control Windows Forms 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:

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

Abajo tienes el enlace para descargarte el proyecto con el código.

Controles Windows Form para herramientas gestión empresarial
Validar número de la Seguridad Social
Control para validar CUIT/CUIL

¿Quieres unirte a la conversación? envía tú comentario y continua la conversación, o sucribete a mi "feed" y obtén mis articulos en tu lector favorito.

Comentarios

[...] Control para validar DNI [...]

[...] Control para validar DNI [...]

Dejar un comentario

(requerido)

(requerido)