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