Auto Data Entry Form’s
Muchos de los lectores de este blog muestran interés por ejemplos entorno a Windows forms y SQL Express, no hay duda y soy consciente de que este articulo no forma parte de esos “avances que están por venir” ni representa a ninguna novedad tecnológica actual; obviamente lejos de herramientas tan actuales como LightSwitch, sin embargo me complace compartirlo con vosotros pues creo que puede ser un buen soporte para ayudar en la comprensión de ciertos usos y técnicas sobre todo para los que empiezan.
Como digo, este es uno de esos artículos intemporales en varios aspectos, pues describe metodologías “retro” utilizando los clásicos SQL y Forms… si embargo no quiero que perdáis de vista que los “usos” y “técnicas” utilizadas pueden traspasar esa barrera atemporal y utilizarse en cualquier escenario actual… incluso en las nuevas aplicaciones “Metro Style” J
Al diseñar algunos ejemplos, disfruto partiendo de una plantilla de “Consola”, pues debido a la naturaleza y el propósito del mismo, esta concesión me permite “Salirme fuera de pistas” de lo que sería una aplicación comercial, pero a su vez me permite disfrutar de la libertad de construir algo desde los cimientos.

Como su nombre indica el objetivo del siguiente laboratorio es interactuar con la conocida base de datos para pruebas “NorthWnd”, utilizaremos la estructura de cualquiera de sus tablas para “Autogenerar” nuestro form de entrada (con todos sus textboxes) que nos permita añadir un nuevo registro a la tabla a través de un “Enlazador”. A modo de flecos para darle un poco mas de interés, he creído divertido incluir una pequeña funcionalidad que nos permita recorrer la tabla buscando todos los registros según la coincidencia del país introducido el textbox de búsqueda (con LINQ), y un par de botones para recorrer el enlazador, avanzando o retrocediendo a partir de la posición actual en el datagridview.
No creo que sea necesario un detalle mas exhaustivo, prefiero pasar al código, aunque antes quedo a vuestra disposición para continuar y desarrollar esta conversación según consideréis de interés.
Que disfrutéis J
PepLluis,
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Data
Imports System.Data.SqlClient
'
'
' Establecer un punto de entrada. Esto es una aplicacion VB
'
Module MiAplicacion
Sub Main()
Dim Ventana As New frmDinamico
Ventana.Show()
Application.Run()
End Sub
End Module
Public Class frmDinamico
Inherits Form
'Punto de Inicializacion de nuestra ventana
'Definicion de Variables de contexto
Private MiConexion As New SqlConnection(
"Data Source=.\SQLEXPRESS;" +
"AttachDbFilename=D:\Bd_App\NORTHWND.MDF;" +
"Integrated Security=True;Connect Timeout=30;User Instance=True")
' Adaptador, Enlazador y juego de datos para la tabla clientes
Private MiAdaptador As New SqlDataAdapter("Select * from Customers", MiConexion)
Private MiEnlazador As New BindingSource
Private MiDataSet As New DataSet
''' <summary>
''' Al lanzar la ejecucion de la app
''' </summary>
''' <remarks></remarks>
Sub New()
Try
Inicializacion()
Catch fallo As Exception
Messagebox.Show(fallo.Message, "Error Grave... no puedo continuar")
End
End Try
End Sub
''' <summary>
''' Inicializar/Construir los objetos de la aplicacions
''' </summary>
''' <remarks></remarks>
Sub Inicializacion()
Me.Text = "Auto Entry Data Form"
' Crear y Enlazar datos
Dim MiCommandBuild As New SqlCommandBuilder(MiAdaptador)
MiConexion.Open()
MiAdaptador.Fill(MiDataSet)
MiENlazador.DataSource = MiDataSet.Tables(0)
Dim MiDataGridView As New DataGridView
MiDataGridView.DataSource = MiENlazador
MiDataGridView.Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top
MiDataGridView.Dock = DockStyle.Top
'
' Añadir los controles al Form
Me.Controls.Add(MiDataGridView)
Me.Controls.AddRange({
New TextBox With {.Name = "Buscar", .Text = "", .Dock = DockStyle.Bottom},
New Button With {.Name = "Añadir", .Text = .Name, .Dock = DockStyle.Bottom},
New Button With {.Name = "Avanza", .Text = .Name, .Dock = DockStyle.Bottom},
New Button With {.Name = "Retrocede", .Text = .Name, .Dock = DockStyle.Bottom}
})
' Apuntar los handlers a sus funciones
AddHandler Me.Controls("Añadir").Click, AddressOf Nuevo
AddHandler Me.Controls("Avanza").Click, AddressOf Avanzar
AddHandler Me.Controls("Retrocede").Click, AddressOf Retroceder
AddHandler Me.Controls("Buscar").TextChanged, AddressOf Seleccionar
Me.Controls("Buscar").Focus()
End Sub
''' <summary>
''' Al final la ejecucion de la app
''' </summary>
''' <remarks></remarks>
Sub Fin() Handles Me.FormClosed
Application.ExitThread()
End
End Sub
''' <summary>
''' Query para seleccionar solo los registros coincidentes
''' con la cadena de texto introducida en el TextBox 'Buscar'
''' </summary>
''' <remarks></remarks>
Sub Seleccionar()
MiENlazador.DataSource =
(
From S In MiDataSet.Tables(0)
Where S.Item("Country").Contains(Me.Controls("Buscar").Text)
Select Nombre = S.Item("CompanyName"),
Ciudad = S.Item("City")
).ToList
End Sub
''' <summary>
''' Enlazador : MoveNext
''' </summary>
''' <remarks></remarks>
Sub Avanzar()
MiEnlazador.MoveNext()
End Sub
''' <summary>
''' Enlazador : MovePrevious
''' </summary>
''' <remarks></remarks>
Sub Retroceder()
MiEnlazador.MovePrevious()
End Sub
''' <summary>
''' Crear un nuevo form conteniendo un TextBox y una etiqueta
''' con su descripcion para cada columna de la tabla
''' </summary>
''' <remarks></remarks>
Sub Nuevo()
Dim AutoForm As New Form
AutoForm.Name = "Nuevo"
AutoForm.Text = "Data Entry Form"
Dim Pos_x As Integer = 5
Dim Pos_y As Integer = 10
Dim Etiqueta As Label
Dim Entrada As TextBox
For Each col As DataColumn In MiDataSet.Tables(0).Columns
Etiqueta = New Label
Etiqueta.Location = New Point(Pos_x, Pos_Y)
Etiqueta.Text = Col.ColumnName
Pos_X += Etiqueta.Width
Entrada = New TextBox
Entrada.tag = Etiqueta.Text
Entrada.Location = New Point(Pos_X, Pos_Y)
AutoForm.Controls.AddRange(New Control() {Etiqueta, Entrada})
Pos_x = 5
Pos_Y += Etiqueta.Height + 5
Next
AutoForm.height = Pos_y + 75
AutoForm.Show()
End Sub
End Class