Manual .Net

103
Creando Aplicaciones para Windows Microsoft Visual Basic .NET Desarrollo de Aplicaciones para la Plataforma Microsotf NET. usando VISUAL Basic.NET Objetivo Al finalizar el curso, el participante estará capacitado para: Conocer la estrategia Microsoft, NET y los componentes del Marco. NET. Describir la nuevas características de Visual Studio. NET Usar las nuevas características de Visual Basic. NET Crear aplicaciones para Windows mediante los Windows Forms. Acceder a bases de datos usando ADO.NET Crear y usar componentes. NET Crear Aplicaciones Web mediante ASP. NET Crear y usar Servicios Web XML. Prerequisitos Curso programación con Visual Basic 6. Metodología El curso se desarrolla integramente en el laboratorio de computación a través de resolución de casos prácticos. El instructor utiliza audivisuales para presentar los temas y desarrolla ejemplos prácticos. CAPÍTULO 1: PLATAFORMA MICROSOFT.NET Microsoft .NET se compone de un conjunto de recursos que hacen posible su implementación, estos componentes se muestran en la siguiente ilustración: 2. Servidores Empresariales.NET Web Developer Microsoft.NET

Transcript of Manual .Net

Page 1: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Desarrollo de Aplicaciones para la Plataforma Microsotf NET. usando VISUAL Basic.NET

Objetivo

Al finalizar el curso, el participante estará capacitado para:

• Conocer la estrategia Microsoft, NET y los componentes del Marco. NET.

• Describir la nuevas características de Visual Studio. NET

• Usar las nuevas características de Visual Basic. NET

• Crear aplicaciones para Windows mediante los Windows Forms.

• Acceder a bases de datos usando ADO.NET

• Crear y usar componentes. NET

• Crear Aplicaciones Web mediante ASP. NET

• Crear y usar Servicios Web XML.

Prerequisitos

• Curso programación con Visual Basic 6.

Metodología

El curso se desarrolla integramente en el laboratorio de computación a través de resolución de casos

prácticos. El instructor utiliza audivisuales para presentar los temas y desarrolla ejemplos prácticos.

CAPÍTULO 1: PLATAFORMA MICROSOFT.NET

Microsoft .NET se compone de un conjunto de recursos que hacen posible su implementación, estos

componentes se muestran en la siguiente ilustración:

2. Servidores Empresariales.NET

Web Developer Microsoft.NET

Page 2: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Microsoft Exchange Server: Ofrece servicios de mensajería (correo electrónico) y colaboración entre

aplicaciones (workflow).

Microsoft Host Integration Server: Realiza la comunicación entre sistemas Cliente/Servidor, aplicaciones

Intranet o Internet con los sistemas legados por el negocio, tales como Mainframe o AS/400.

Microsoft Internet Security and Aceleration Server: Antes llamado Proxy Server, ISA Server se usa para

brindar seguridad en las comunicaciones por Internet.

Microsoft SQL Server: Es el servidor de datos de Microsoft que permite crear soluciones de Data

Warehouse y se integra con Microsoft Office.

3. Bloque de Servicios .NET

El Bloque de Servicios .NET se está construyendo como un conjunto de Servicios Web XML que permitan

la integración entre los usuarios y las aplicaciones clientes que corran en diferentes dispositivos (PCs,

dispositivos móviles, etc). Actualmente Microsoft tiene construido dos servicios que ofrecen ventajas para

los usuarios:

Microsoft Passport: Tiene un conjunto de servicios como el Single Sign In (SSI) que permite autenticar

si un usuario es válido y puede participar en un sitio Web, aparte tiene otras ventajas como reducir el

tiempo de autenticación, guardar contenido personalizado. etc. Hotmail utiliza el servicio de Passport

para la autenticación de usuarios y guardar información de éste en el Web.

Microsoft Hailstorm: Usa los servicios de Passport para guardar información personalizada del usuario,

pero su uso principal es almacenar Servicios Web que puedan ser usados por aplicaciones de Visual

Studio .NET o cualquier lenguaje compatible con .NET

El Marco. NET

Definiendo el Marco .NET

Fl Marco .NET (en ingles .NET Framework) es la piedra angular de la plataforma .NET y constituye u.i

enlomo para la creación, distribución y ejecución de servicios Web, así como de otros tipos de aplicaciones.

Se compone de cuatro partes principales que son:

1. Tiempo de F-jccución en Lenguaje Común (CLR)

Es el RunTime común para todos los lenguajes que soportan el Marco .NET y realiza la mayor pane de

funciones para que corran las aplicaciones .NET, es el que se encarga de compilar \ ejecutar una aplicación,

así como administrar su trabajo con el sistema.

2. Librería de Clases .NET

Son un conjunto de componentes que sirven para acceder a través de objetos a la mayor parte de servicios del

sistema, labor que era realizada antes por las APIs de Windows, la

Web Developer Microsoft.NET

Page 3: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

MEC o ATL de Visual C++, etc.

3. ADO.NET.vXML

ADO .NET se usa para acceder a cualquier origen de datos sea relacional (bases de datos), formatos planos

(textos), etc. Por su parte, XML sirve como el formato para intercambiar los datos en diferentes plataformas.

4. ASP.NET

Este componente incluye el soporte para la creación, distribución y mantenimiento de aplicaciones Web así

como de Servicios Web XML que son la razón de ser de la plataforma .NET

TIEMPO DE EJECUCIÓN EN LENGUAJE COMÚN (CLR)

Introducción al RunTime y al CLR

Un RunTime es la aplicación responsable de manejar la asignación de memoria, inicio y eliminación de

procesos mientras un programa se está ejecutando, asi como de brindar seguridad al código, y también

gestionar su relación con otros programas o componentes.

l.os RunTime lian sido usados por los lenguajes de programación como Visual Basic cuyo nombre es el

VBRLN, Visual C++ cuyo nombre es MSVCRT. pero también Visual FoxPro, JScnpt, SmaIlTalk. Per!,

Python. Java, etc. tienen su propio RunTime.

Cada aplicación Visual Basic 6 que se quería distribuir tenia que distribuirse con el RunTime, lo mismo en

Visual C-H-, la diferencia que el primero ocupaba demasiado espacio y no era tan poderoso como el

segundo.

EL RunTime de .NET se llama el CLR (Common Language RunTime o Tiempo de Ejecución en Lenguaje

Común) y es la solución a los diferentes tipos de RunTime que manejan los diferentes lenguajes de

programación antes mencionados, que ahora serán

gestionados en ejecución por un único RunTime común.

La ventaja de tener un solo RunTime son múltiples ya que se podrá compartir las mismas estructuras, tipos

de datos, clases, etc. en todos los lenguajes que cumplan las especificaciones del Marco .NET.

Servidos del CLR

El CLR es el motc(r de ejecución de las aplicaciones del Marco .NET. Proporciona una serie de servicios,

entre los que se incluyen los siguientes:

Administración del código (carga y ejecución).

Aislamiento de la memoria de la aplicación.

Comprobación de la seguridad de los tipos.

Web Developer Microsoft.NET

Page 4: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Conversión del (Lenguaje Intermedio) a código nativo

Acceso a los metadatos (información de tipo mejorada)

Administración de memoria para los objetos administrados

Aplicación de seguridad de acceso al código

Control de excepciones, incluyendo excepciones en varios lenguajes

Interoperabilidad entre el código administrado, los objetos COM y las DLL anteriores (datos y código no

administrados)

Automatización del diseño de objetos

Suporte para servicios de desarrolladores (creación de perfiles, depuración, etc.)

Sistema de auto registro o auto descripción de componentes (no es necesario registrar el componente en

el sistema)

No es necesario los elementos de COM como GUIDs, interfases iLnknow, etc.

Nota: Con esto decimos adiós al problema de la compatibilidad de versiones de las dll.

Esta información se utiliza en tiempo de ejecución para resolver referencias, aplicar las directivas del enlace

de versiones y validar la integridad de los ensambladores cargados. El tiempo de ejecución puede determinar

y ubicar el ensamblador para cualquier objeto de ejecución, ya que todos los tipos se cargan en el contexto de

un ensamblador.

Asimismo, los ensambladores constituyen la unidad en la que se aplican los permisos de seguridad de acceso

al código. La prueba de identidad de cada ensamblador se considera individualmente cuando .se determinan

los permisos que contiene para otorgar al código.

Espacio de Nombre

Un espacio de nombre (NameSpace) es un esquema de denominación lógica para los tipos en los que un

nombre de tipo sencillo, como OLEDB. va precedido de un nombre jerárquico separado por puntos. Dicho

esquema se encuentra totalmente bajo el control del desarrollador.

Las herramientas de diseño pueden utilizar los espacios de nombre para facilitar a los desarrolladores el

proceso de exploración y referencia a los tipos en su código. El concepto de espacio de nombre no está

relacionado con el del ensamblador. Un único ensamblador puede contener tipos cuyos nombres jerárquicos

dispongan de distintas raíces de espacio de nombre y una raíz lógica de este tipo puede abarcar varios

ensambladores.

En el Marco .NET. un espacio de nombre es una conveniencia lógica de denominación en tiempo de diseño,

mientras que un ensamblador establece el ámbito de nombre para los tipos en tiempo de ejecución.

Web Developer Microsoft.NET

Page 5: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

En Visual Basic, por ejemplo para hacer uso de un Assemblie hay que usar los espacios de nombre con la

declaración [mports, por ejemplo si quisiéramos acceder a datos con SQL Server y manejar archivos de texto

en una aplicación Windows realizaríamos la siguiente declaración:

Imports System.Windows.Forms

Imports System.Data.SQL

Imports System.10

CAPITULO 2: VISUAL STUDIO .NET

Lenguajes en .NET

En Visual Studio .NET vienen los siguientes Lenguajes de Programación:

Visual Basic .NET

Visual C# .NET

Visual C++ .NET

Visual FoxPro .NET (No administrado por el Marco .NET)

Visual JScript .NET

Además de estos lenguajes, el Marco .NET soporta otros lenguajes, entre los cuales

Destacan:

COBOL: http://wvvw.adtools.com/info/whitepaper/net.html/

Pascal: htlp://w\v\v2.tit.qut.cclu.;ni/('oinpSci/Pi..\S/7ComponfiitPascal/

Sinall Talk: http://wwvv.qks.com/

Eitfel: h(tp://dotnct.ritTeI.com/

MI-: http://research.inicrosoft.coin/Pro¡ccts/S.ML..\ET7iiidcx.htni

APL: http://vvww.dvadic.com/

Oberon: http://www.obcron.ethz.ch/lightning/

Scheme: http://rovcr.cs.iiwu.edii/-scheme/

Mercur\: htt|):/7w vvw.cs.inu.o7.au/research/mercurv/

Python: http://aspn.activestate.com/ASPN/NET/indcv

Haskell: http://haskell.cs.vale.edu/ghc/

Mondrian: http://www.moiidrian-script.org

Se ha dado el nombre de algunos lenguajes junto con sus respectivas páginas Web donde se

puede encontrar información sobre estos e inclusive bajarse el compilador del lenguaje

compatible con .NET.

Figura 2.3: Listado de Lenguajes .NET

Web Developer Microsoft.NET

Page 6: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

COBOL Eiffel Mondrian Pascal Visual Basic

Jscript.NET HastKell ML APL Visual C#

Alice C VISUAL C++ Smalltalk

Entorno Integrado de Desarrollo (IDE)

Descripción del IDE Corporativo

Visual Studio.NET tien un Entorno Integrado de Desarrollo único o compartido para crear aplicaciones

usando cualquiera de los Lenguajes de Programación, que pueden ser Visual Basic. Visual C++ o C #.

En esta nueva versión de Visual Studio, Visual FoxPro mantiene su propio IDE (similar al de la Versión 6),

además Visual InterDev ya no es parte de Visual Studio, ya que las herramientas de desarrollo para Web

están disponibles a través de los Web Forms disponibles desde el IDE común.

Al iniciar Visual Studio. NET aparece (por defecto) la Página de Inicio, tal como se muestra en la Figura 1.2

Figura 2.4: Ventana de Inicio del Visual Studio. NET

Desde esa página de inicio podemos elegir la opción “Get Started” para crear un nuevo proyecto o abril uno

existente o reportar un error del IDE de Visual Studio, si elegimos “New projet” se presentará la Ventana que

se muestra en la Figura 2.5.

Figura 2.5 Ventana de Crear un Nuevo Proyecto

Web Developer Microsoft.NET

Page 7: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Esta ventana está dividida 2 secciones: en el lado izquierdo se encuentran los tipos de proyectos que se

pueden realizar (Visual Basic, Visual C, Visual C++,etc) y en el lado derecho se encuentra las plantillas o

tipos de aplicaciones, que varían de acuerdo al tipo de proyecto.

Si se elige Visual Basic o Visual C#, las plantillas se pueden dividir en tres: para Windows, para Web

(Aplicaciones, Servicios, Librería de Clases, Librería de Controles, Proyecto Vacío) y de Consola.

En el caso de elegir como tipo de proyecto “Visual Basic” y como plantilla “Windows Application” hay que

seleccionar la ubicación del nuevo proyecto y escribir el nombre de este, el cual creará una carpeta con el

mismo nombre en el lugar seleccionado. A continuación la figura 2.6 muestra el IDE compartido de Visual

Studio. NET en el caso de elegir una Aplicación para Windows.

Figura 2.6: IDE Compartido de Visual Studio. NET

Web Developer Microsoft.NET

Page 8: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Entre las partes del nuevo IDE de visual Studio. NET tenemos:

1. Menu Bar

2. ToolBars

3. Serve Explorer Windows (Ctrl+Alt+S)

4. ToolBox(Ctrl+Alt+X)

5. Output Windows (Ctrl+Alt+O)

6. Status Bar

7. Windows Form Designer

8. Solution Explorer Windows (Ctrl+R)

9. Properties Windows (F4)

10. Search Windows (Ctrl+Alt+F3)

11. Dynamic Hep Windows (Ctrl+F1)

Existen nuevas ventanas en Visual Studio. NET entre las cuales tenemos:

Class View (Ctrl+Shift+C)

Resource View (Ctrl+Shift+E)

Macro Explores (Alt+F8)

Document Outline (Ctrl Alt+T)

Task List (Ctrl+Alt+K)

Command Windows (Ctrl+Alt+A)

Web Developer Microsoft.NET

Page 9: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Find Symbol Results (Ctrl+Alt+Y)

Find Symbols Results (Ctrl+Alt+Y)

Diseñadores

Para realizar la construcción de aplicaciones o creación de componentes o servicios disponemos de

Diseñadores que facilitan la labor de construcción de interfaces, creación de sentencias, etc.

La mayoría de diseñadores se habilitan al elegir una plantilla de Visual Studio. NET y casi todos generan

código al diseñar controles sobre el contenedor respectivo; característica totalmente distinta a la forma de

trabajo en Visual Basic 6, que ocultaba el código generado por el diseñador.

Entre los diseñadores que trae Visual Studio. NET tenemos:

Windows Form Designer: Se muestra al elegir cualquiera de dos plantillas “Windows Application” o

“Windows Control Library”, habilitando en el Toolbox los controles para Windows que serán usados

para construir la interfase de la aplicación arrastrando dichos controles hacia el formulario o control de

usuario.

Web Form Designer: Se muestra al elegir la plantilla “Web Application” habilitando en el Toolbox los

controles para Web y los controles HTML que serán usados para construir la página Web que correrá en

el servidor IIS (archivo aspx) arrastrando dichos controles hacia el formulario Web.

Component Designer: Este diseñador se muestra al elegir una de dos plantillas: “Class Library” o

“Windows Service” y también trabaja con los controles para windows creando una interfase reusable

desde otra aplicación.

Web Service Designer: Sirve para diseñar servicios Web y es mostrado al elegir una plantilla “Web

Service”, también trabaja con los controles para Windows, componentes, etc.

Existen más diseñadores, pero que lo trataremos en la categoría de herramientas de datos, debido al tipo de

trabajo que realizan con datos, el cual se trata como tema siguiente.

Herramientas de Datos

Si se quiere realizar un trabajo rápido con datos, tal como modificar la estructura de la base de Datos, crear

tablas, consultas, procedimientos almacenados, etc. existen herramientas que permiten realizar esta labor

reduciendo enormentemte el proceso de desarrollo en el caso de hacerse por otros medios.

Entre las principales herramientas que trabajan con datos tenemos:

Web Developer Microsoft.NET

Page 10: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Server Explorer: Sin duda es una de las principales herramientras de Visual Studio. NET y no solo para

acceder a datos sino para mostrar y administrar los diferentes servidores o recursos del sistema, tales

como Base de Datos. Servicios Web, Aplicaciones COM+, etc. con solo arrastrar el objeto éste puede ser

usado en una aplicación. También se tratará con mayor detalle en el módulo de acceso a datos.

Data Adapter Wizard: Es un Asistente que permite crear un DataAdapter que es un Comando (Select,

Insert, Update, Delete) con el cual se podrá general un conjunto de registros o Dataset. La misma función

puede ser cubierta por el Server Explorer con solo arrartrar los campos hacia el formulario.

Query Designer: Es un Diseñador que permite crear Consultas SQL de manera sencilla arrastrando tablas

o consultas sobre éste y eligiendo los campos que se verán en la consulta de datos, también se puede

realizar filtros o especificar criterios de selección.

Además no solo se pueden construir consultas. Select sino también se pueden crear consultas Insert,

Update o Delete, etc.

DataBase Project: Es un tipo de plantilla que sirve para trabajar con una Base de Datos, para lo cual debe

existir una conexión a un origen de datos, este tipo de proyecto da la posibilidad de crear y modificar

scripts de creación de tablas, consultas, vistas, desencadenantes, procedimientos almacenados, etc.

Editor de Script: Uno de las principales herramientas para trabajar con base de datos remotas como SQL

Server, Oracle, etc., es utilizar el editor de Script que permite crear tablas, consultas, vistas, etc.

Mostrando con colores las sentencias o palabras reservadas del lenguaje Transact-SQL.

Depurador de Procedimientos Almacenados: Visual Studio.NET incorpora un Depurador de Store

Procedure que puede realizar seguimientos paso a paso por línea de código, por sentencia o por

instrucción, además crea puntos de interrupción, permitiendo un mayor control y seguimiento del código

en caso de errores.

Todas estas herramientas mencionadas, son nuevas en Visual Stuido. NET, ha excepción del Query Builder

que es el mismo de la versión anterior de Visual Studio.

Como se habrá dado cuenta muchas herramientas de acceso a datos de Visual Basic 6 han sido eliminadas,

tales como: Data Environment, Data View, Data Report, y otras más, pero en su reemplazo existen las que ya

hemos mencionado.

CAPITULO 3: VISUAL BASIC. NET

Web Developer Microsoft.NET

Page 11: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Introducción

En los módulos anteriores hemos tratado el Marco. NET y Visual Studio. NET, ahora trataremos Visual

Basic. NET, pero hay que remarcar que las características del lenguaje depende del Marco. NET y las

herramientas son compartidas por el IDE de Visual Studio. NET.

Visual Basic. NET es la versión 7 de ésta popular herramienta, ésta última versión tiene cambios radicales,

tanto en su concepción (.NET), en el lenguaje, las herramientas usadas, etc. entre las nuevas características

de Visual Basic. NET tenemos:

Dos tipos de desarrollos bien diferenciados:

Aplicaciones para Windows

Aplicaciones para Internet

Acceso a Datos usando ADO.NET, el cual permite trabajar con DataSets desconectados.

Nuevo Depurador que permite realizar seguimiento de código escrito en diferentes lenguajes. NET

Creación y us o de XML para intercambio de datos entre aplicaciones.

Lenguaje Orientado a Objetos, con soporte de Herencia múltiple, y Polimorfismo a través de la

sobrecarga de propiedades, métodos y funciones con el mismo nombre.

Control de errores o excepciones en forma estructurada (Try.Catch.Finally).

Soporte de multitheread para que la aplicación puede ejecutar múltiples tareas en forma independiente.

Uso de NameSpaces para referirse a una clase que se va a usar en la aplicación. Los Assemblies

reemplazan a la Librería de Tipos, en un Assemblie puede existir uno o más NameSpaces.

Reestructuración en los Tipos de Datos; existen nuevos tipos de datos y se han modificado y eliminado

cierto tipos de datos.

Cambio en el Lenguaje: nuevas forma de declarar variables, conversión explícita de tipos de datos (no

existe conversión forzosa); no existen procedimientos sino funciones, etc.

Web Developer Microsoft.NET

Page 12: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Declaración de Variables

A diferencia de Visual Basic 6, en VB. NET se pueden declarar varias variables en una sola instrucción y

además se puede asignar directamente sus valores. Otra observación es que es necesario definir el tipo de

declaración y el tipo de dato (antes se hacia se asumía un tipo de declaración y un tipo de datos variant, que

ahora no existe).

Sintaxis <Tipo de Declaración> <Variables(s)> As <Tipo de Dato> [=<Valor>]

Existen varios tipos de declaración que detallamos a continuación en la siguiente tabla

Declaración Lugar de declaración Alcance o AmbitoPublic

Protected

Friend

Private

Dim

Static

Módulo o Clase

Clase

Clase

Módulo

Procedimiento

Procedimiento

Global, en todo el proyecto

En la clase declarada o en una derivada

En el Assemblie

Solo en el módulo

Solo en el Procedimiento

Solo en el Procedimiento

Alcance de Variables

Para las variables declaradas a nivel de procedimientos (Dim y Static) existen un nuevo alcance que es a

nivel de estructura o bloque, que puede ser For – Nest, If – End If, Do Loop, etc. Las variables definidad

dentro de un bloque solo valdrán en este bloque.

Opciones de Trabajo con Variables

Por defecto en VB NET es necesario declarar las variables usadas (Option Explict) y también es necesario

que se asigne el misto tipo de dato a la variable (Option Strict), si deseamos Declaración implícita (por

defecto Objet) y Conversión Forzosa de tipos (ForeCast), aunque no es lo recomendable por performance,

podemos conseguirlo de dos formas: mediante “Propiedades” del proyecto, opción “Build” y elegir “Off” en

las listas de “Option Explicit” y “Option Strict” o mediante declaración al inicio de todo el código:

Option Explicit Off

Option Strict Off

Arrays

Un array o arreglo es un conjunto de variables que tienen el mismo nombre pero diferente índice que permite

simplificar el uso de éstas y aumentar la velocidad de acceso a los datos que almacena el array.

El array puede tener uno o mas dimensiones (hasta 60) y cada dimensión tiene un límite inferior que siempre

es 0 y un límite superior que es equivalente al tamaño de la dimensión del array menos 1. Esta característica

es distinta que en la versión anterior, en donde el límite inferior del array podían empezar en cualquier

número.

La clase base. NET de donde se heredan los array es “Array” y pertenece al siguiente

NameSpace:System.Array.

Web Developer Microsoft.NET

Page 13: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Declaración de Arrays

A diferencia de Visual Basic 6, en VB. NET se puede declarar arrays definiendo el número de dimensiones

pero sin indicar el tamaño. Cabe resaltar que solo se puede declarar e inicializar una array que no tiene

tamaño definido.

Otra diferencia es que no existe la sentencia Option Base que haga que el límite inferior del array empiece en

0 o en 1, éste siempre empezará en 0 e irá hasta n-1.

Sintaxis

<Tipo de Declaración><Array([Tamaño])As <Tipo de Dato>[=<Valores>]

Ejemplos:

Dim Alumnos(30),Cursos(10)As String

Dim Edades( ) As Byte={18,20,25,27}

Dim Sueldos ( , ) As Decimal

Redimensionando Arrays

Una vez definido la dimensión de un array, éste puede modificarse usando la sentencia ReDim, siempre y

cuando el array haya sido declarado como dinámico (con Dim).

Sintaxis

ReDim [Preserve] <Array> ([Tamaño]) As <Tipo de Dato>[=<Valores>]

Ejemplo

Dim 1, Arreglo As Integer

Redim Arreglo(5)

For 1 = 0 To Ubound (Arreglo)

Arreglo (I) = I

Next 1

Procedimientos

Un Procedimiento es un bloque de código o conjunto de instrucciones que es definido en la aplicación y que

puede ser usado varias veces mediante una llamada.

Dos características nuevas de los procedimientos, incorporadas en esta versión son:

Subrutinas: Ejecutan una sección sin retornar un valor

Funciones: Ejecutan una acción retornando un valor

De Eventos: Se desencadenan con la interacción del usuario o ante algún evento

De Propiedades: De vuelven y asignan valores a propiedades de un objeto.

Web Developer Microsoft.NET

Page 14: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Declaración de procedimientos

Subrutina

[Public Private Friend] Sub<Nombre> ([Optional) [ByVal ByRef]<Par>As <Tipo>

<Sentencia>

[Exit Sub]

End Sub

Función:

[Public Private Friend] Funcion<Nombre> <Parámetros>As <Tipo>

<Sentencia>

[Exit Function]

[Exit Sub]

[<Nombre>=Valor>}| Return (Valor)]

End Function

Notas:

El tipo de argumento por defecto es By Val (en la versión anterior era ByFef)

Si se usa Optional debe iniciarse con un valor (antes no era obligatorio)

Se puede usar Return para regresar a la llamada del procedimiento.

Manejo de Threads

Threads

Un Threads es la unidad básica para que el Sistema Operativo pueda ejecutar un proceso. Una aplicación

(AppDonain) siempre inicia un solo Threads, pero este a su vez puede iniciar otro Threads. Al proceso

de ejecutar varios Threads le llamaremos Threading.

En ventaja principal de los Threads es tener varias actividades ocurriendo en forma simultánea, lo cual es

una posibilidad para que los desarrolladores puedan trabajar con varios procesos sin perjudicar otras tareas.

Por ejemplo, el usuario puede interactuar con la aplicación mientras se va ejecutando una consulta de miles

de registros.

Se recomienda el uso de Threads en las siguientes situaciones

Para comunicaciones sobre una red, servidor Web o Servidor de Base de Datos.

Al ejecutar operaciones que demoren bastante tiempo

Para mantener siempre disponible la comunicación entre el usuario y la interfase, mientras se van

ejecutando tareas en segundo plano, etc.

El uso de Threads intersivamente disminuye los recursos del sistema operativo, por tanto solo se recomienda

usar en los casos ya descritos, sino la performance de la aplicación disminuirá.

Web Developer Microsoft.NET

Page 15: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Implementación de Threads

Para implementar Threads se usa el NameSpace: “System.Threading.Thread” y luego se hace uso de los

métodos que se definen a continuación:

Star: inicia un Thread, el cual es un proceso de llamada asíncrona. Para saber el estado del Threads hay

que usar las propiedades ThreadState y IsAlive

Abort: Cancela un Thread iniciado, si deseamos saber el estado nuevamente podemos usar las

propiedades ThreadState y IsAlive

Sleep: Ocasiona una pausa en milisegundos del bloque de instrucciones

Suspen: También ocasiona una pausa en el bloque de instrucciones

Resume: Reinicia una pausa originada con el método Suspend

Join: Espera porun Threads

Estado de un Threads

Un Threads tener diferentes estados en un mismo tiempo, para saber su estado se encuentra la propiedad

ThreadState que devuelve un valor que indica el estado actual del Thread.

Acción Estado de TransiciónOtro Thread a Thread Start UnchangedEl Thread inicia su ejecución RunningEl thread llama a Thread.Sleep WaitSleepJoinEl Thread llama a Monitor. Espera en otro objeto WaitSleepJoinEl Thread llama Thread. Join en otro Thread WaitSleepJoinOtro Thread lalma a Thread.Suspend SuspendRequestedEl Thread responde a un requerimiento de Thread. Suspend SuspendedOtro Thread llama a Thread.Resume RunningOtro Thread llama a Thread.Interrumpt RunningOtro Thread llama a Thread.Abort AbortRequestedEl Thread responde a Thread.Abord Aborted

Control de Excepciones

Durante el desarrollo y ejecución de toda aplicación pueden presentarse diferentes tipos de errores, los cuales

impiden el normal funcionamiento de las aplicaciones. A estos errores se les llama Excepciones.

Tipos de Errores

Los errores o excepciones se pueden clasificar en 3 tipos:

Errores de Sintaxis: Suceden al escribir código en la aplicación; como por ejemplo una instrucción mal

escrita, omisión de un parámetro obligatorio en una función, etc.

Visual Basic notifica de cualquier error de sintaxis mostrando una marcha de subrayado azul (por

defecto) con un comentario indicando la causa del error.

Web Developer Microsoft.NET

Page 16: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Una ayuda para corregir errores de sintaxis, es usar la sentencia Option Explicit que fuerce a declarar

variables y evitar expresiones inválidas.

Errores Lógicos: Ocurren una vez usada la aplicación y consiste en resultados inesperados o no

deseados: por ejemplo una función que debe devolver el sueldo neto está devolviendo un valor de cero o

negativo, o una subrutina que debe eliminar un archivo temporal no lo está borrando.

Para corregir este tipo de errores se hace uso de herramientas de depuracion, como por ejemplo un

seguimiento paso a paso, o inspeccionar el valor de una variable o expresión.

También podemos disminuir errores o excepciones de tipos de datos no deseados usando la sentencia

Option Strict que evita la conversión forzosa y verifica que el tipo de dato asignado sea del mismo tipo

que la variable o función, o que un parámetro pasado sea del mismo tipo, etc.

Errores en Tiempo de Ejecución: Este tipo de errores suceden en plena ejecución de la aplicación,

después de haber sido compilado el código. No son errores de mala escritura no de lógica, sino mas bien

de algunas excepción del sistema, como por ejemplo tratar de leer un archivo que no existe o que está

abierto, realizar una división entre cero, etc.

Para controlar los errores en tiempo de ejecución disponemos de los Manipuladores o Controladores de

Error, que evitan la caída del programa y permiten que siga funcionando. A continuación veremos las

formas de implementar el control de este tipo de errores.

Opciones de Control de Excepciones

Para controlar excepciones no solo basta usar una forma de control, sea no estructurada o estructurada, sino

también es necesario configurar las opciones de control de excepciones para lo cual del menú “Debug” se

elige “Windows” y luego “Exceptions” o también se puede elegir directamente el botón “Exceptions” de la

Barra de Depuración.

Aparecerá la ventana de control de excepciones que se muestra a continuación

Existen 2 monitores en que se pueden controlar las excepciones que son:

When the exception os threown: Es cuando la excepción ocurre y se aconseja configurarlos en

“Continue”

If the exception is not handled: Ocurre cuando la excepción no es controlada, es decir cuando no existe

controlador de error, es aconsejable que esté en “Break into the debugger”.

Web Developer Microsoft.NET

Page 17: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Ambos momentos tienen 3 opciones o formas de control, que son:

Break into the debugger: Para y muestra el depurador con la línea donde ocurrió el error en tiempo de

ejecución.

Continue: Continua la ejecución del programa. Si no existe controlador Finaliza la ejecución del

programa.

Use parent setting: Indica que se va a usar la configuración de la opción de nivel superior o padre.

Laboratorio 1

El presente laboratorio tiene como objetivo conocer el Entorno de Visual Studio.NET y usar algunas

características nuevas del Lenguaje Visual Basic.NET, así como implementar MultiThreads y Controlar

Excepciones.

Este primer laboratorio está dividido en 2 ejercicios que tienen una duración aproximada de 35 minutos.

Ejercicio 1: Reconocimiento VB.NET y Trabajando con el Lenguaje

Duración 20 minutos

Empleo de Textbox

Establecer las siguientes propiedades:

Control Propiedad ValorTextbox1 Name

MaxlengthText

txtCodigo4

Textbox2 NameMaxlengthText

txtNombreUpper

Textbox3 NameText

txtCurso

Textbox4 NameText

txtParcial

Textbox5 NameText

txtFinal

Label7 NameAutosizeFontTextTextAlign

lblPromedioTrueArial, 10pt,style=Bold

MiddleCenterLabel8 Name

AutosizeFontTextTextAlign

lblObsTrueArial, 12 pt,style=Bold

MiddleCenterButton1 Name

TextbtnNuevo&Nuevo

Web Developer Microsoft.NET

Page 18: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Button2 NameText

btnSalir&Salir

Form1 NameCancelButtonTextFormBorderStyleIconStarPosition

frmDemo01btnSalirEmpleo TextBoxSizableSun.icoCneterScreen

Figura 3.15: Diseño del Formulario

Public Sub Calcular() Try If Trim(txtParcial.Text) <> "" And Trim(txtFinal.Text) <> "" Then Dim iParcial As Integer = CType(txtParcial.Text, Integer) Dim iFinal As Integer = CType(txtFinal.Text, Integer) Dim iPromedio As Integer = Math.Round((iParcial + iFinal) / 2, 0) If iPromedio > 10 Then lblPromedio.ForeColor = Color.Blue lblObservacion.ForeColor = Color.Blue lblObservacion.Text = "APROBADO" Else lblPromedio.ForeColor = Color.Red lblObservacion.ForeColor = Color.Red lblObservacion.Text = "DESAPROBADO"

End If

End If

Catch ex As Exception MessageBox.Show(ex.Message) End Try

End Sub

Web Developer Microsoft.NET

Page 19: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Private Sub txtCodigo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtCodigo.TextChanged If Len(Trim(txtCodigo.Text)) = 4 Then txtNombre.Focus() End If End Sub

Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click Dim miControl As Control For Each miControl In Me.Controls If TypeOf miControl Is TextBox Then miControl.Text = "" Next lblPromedio.Text = "" : lblObservacion.Text = "" txtCodigo.Focus() End Sub

Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click End End Sub Private Sub txtNombre_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtNombre.KeyPress If e.KeyChar = Microsoft.VisualBasic.ChrW(13) Then txtCurso.Focus() End If End Sub

Private Sub txtCurso_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCurso.KeyPress If e.KeyChar = Microsoft.VisualBasic.ChrW(13) Then txtParcial.Focus() End If End Sub

Private Sub txtParcial_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtParcial.TextChanged Calcular() End Sub

Private Sub txtFinal_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtFinal.TextChanged Calcular() End Sub

• Finalmente, ingrese a la carpeta “bin” de “Lab01” y observe dos archivos: uno ejecutable (extensión exe)

y otro archivo intermedio (extensión pdb), (¿Cuál de estos es conocido como Asseblie).

Ejercicio 2: Implemento Multi Thread y Control de Excepciones

Duración: 15 minutos

Web Developer Microsoft.NET

Page 20: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

• Ingrese a Visual Studio.NET y del menú “File” elegir y luego “Project” o simplemente pulsar [Ctrl] +

[N], luego elegir un tipo de proyecto “Visual Basic” y una plantilla de “Aplicación Windows”,

seleccionar como ubicación de carpeta “C:\\vbnet\Labs” y como nombre ingresar “Lab01_2”.

• Se va a crear una aplicación en la que se implemente múltiples threads para iniciar la lectura de un

archivo de texto extenso y poder cancelar este proceso si es necesario, además para evitar los errores en

tiempo de ejecución haremos uso del control estructurado de excepciones visto en este módulo.

• Primero en la ventana del “Solution Explorer” seleccionar el nombre del formulario y en la ventana de

propiedades escribir en la propiedad “FileName” el nombre “frmArchivo.vb”.

• Realizar el diseño del formulario similar al presentado aquí abajo:

Figura 3.17: Diseño del formulario frmArchivo

• Declarar una variable llamada Hilo de tipo trread y definir una subrutina que lea el archivo de texto cuya

ruta y nombre está especificado en el cuadro de texto, esta rutina usa Try.Catch.Finally para controlar

errores en tiempo de ejecución.

Dim Hilo As System.Threading.Thread

Sub LeerArchivo ( )

Dim Flujo As System.IO.StreamReader

Dim Lines As Strings ‘’ ‘’ ‘’

Try

Flujo = System.IO.File.OpenText(txtNombre.Text)

no Untitl IsNothing (Linea)

Web Developer Microsoft.NET

Page 21: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Linea = Flujo.ReadLine

TxtArchivo.Text = txtArchivo.Text + Línea + Chr(13)

+ Chr (10)

Loop

Carch x An IO.IOException

MagBox(X.Message,MsfBoxStyle.Information, “No se pudo”)

txt.Nombre.Clear( )

Exit.Sub

End.Try

Flujo.Close ( )

btnSuspender.Enabled = False

btnContinuar.Enabled = False

btnCancelar.Enabled = False

End Sub

• Escribir código en el evento “TextChanged” de “txtNombre” y en los eventos “Click” de los “Botones”

Private Sub txtNombre_TextChanged(ByVal sender As...)Handles

BtnLeer.Enabled = txtNombre.Text <> ‘’ ‘’

Private Sub btnLeer_Click(ByVal sender As...) Handins

Hilo = New System.Threading.Thread (AddressOf LeerArchivo)

Hilo.Start ( )

btnSupender.Enabled = True

btnCancelar.Enabled = True

End Sub

Private Sub btnCancelar_Click(ByVal sender As...) Handles

Hilo.Abort ( )

btnLeer.Enabled = False

btnSuspender = Enabled = False

btnCancelar.Enabled = False

End Sub

Private Sub btnNuevo_Click(ByVal sender As...) Handles

txtNombre.Clear ( )

txtArchivo.Clear ( )

txtNombre.Clear ( )

Web Developer Microsoft.NET

Page 22: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

End Sub

Private Sub btnSuspender:Click(ByVal sender As...) Handles

hilo.Suspend ( )

btnLeer.Enabled = False

btnSuspender = Enabled = True

btnCancelar.Enabled = False

End Sub

Private Sub btnContinuar:Click(ByVal sender As...) Handles

Hilo, Resume ( )

End sub

Private Sub btnSalir:Click(ByVal sender As...) Handles

Me.Close ( )

End Sub

Finalmente, grabar y ejecutar la aplicación

CAPITULO 4: CREANDO APLICACIONES PARA WINDOWS

Usando Windows Forms

Introducción

Windows es una clase base del Marco.NET usada para crear aplicaciones que correrán sobre Windows, esta

se encuentra disponible al elegir en Visual Basic la plantilla “Windows Application”.

Al elegir una aplicación para Windows automáticamente se realizan los siguientes cambios:

En el ToolBox aparecerá una ficha llamada “Windows Forms” conteniendo los controles para trabajar

con Formularios Windows y Controles de Usuario.

En el Código del formulario aparecerá la referencia a la clase base heredada:

Inherets System.Windows, Form.Form

Para ilustrar mejor la funcionalidad que podemos obtener de Windows tenemos la figura 4.1, que resumen

los principales objetos usados en Windows, para lo cual se parte de la clase base llamada “System”, luego se

muestran algunos de los objetos de la clase “Drawing” y de la clase “Winforms” anteriormente comentadas

Cabe comentar que dentro de la clase Windows, encontramos definido el formulario y los controles para

Windows (Label, Button, TexBox, Menu, etc.), así como también algunos objetos no visuales de utilidad

como Application(reemplaza al objeto App de VB6), Clipboard, Help, Screen, etc.)

Web Developer Microsoft.NET

Page 23: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Objeto Formulario

El objeto formulario Form es el contenedor principal de toda aplicación para Windows y se encuentra

en el siguiente NameSpace:

“System.Windows.Forms.Form”

En Visual Studio.Net el formulario ha sufrido muchos cambios, tanto en propiedades métodos y eventos,

tal como se muestra en los siguientes cuadros.

Propiedades

Propiedades DescripciónAutocroll Es una nueva propiedad que permite desplazarse por el formulario a

través de una barra si es que los controles sobrepasan el área cliente.Backcolor Especificar el color de fondo del formularioBackgrondImage Antes llamada Picture: Permite mostrar una imagen de fondo sobre el

formulario, tiene 2 tamaños: cascada y centrado en pantallaBorderStyle Controla la apariencia del borde del formulario y los controles que se

presentan en la barra de titulo. Tiene 6 opcionesControBox Si esta en True muestra el menú de controles de la barra de título, si

esta en False no los muestra.Cursor Especificar el curso que aparecerá al situar el mouse sobre el

formulario. Antes era la propiedad MousePointes y si se quería un cursor personalizado se configuraba MouseIcon, ahora solo existe Cursor y sus gráficas son vistas en la lista

Font Configura la fuente de los textos de los controles ubicados en el formulario y de los textos mostrados con métodos de dibujo.

Forecolor Especifica el colore del texto de los controles (excepto el TexBox) y de los textos mostrados con métodos de dibujo.

GridSize Determina el tamaño de las rejitas que se muestran en tiempo de diseño para diseñar controles.

Icon Indica el icono del formulario, este se muestra en la barra de título de la ventana y en la barra de tareas de Windows

IsMDIContainer Determinar si es que el formulario es un MDL, antes se creaba un formulario MDI añadiendo del menú “Projet” y un formulario hijo configurando la propiedad MDIChild en True.Ahora solo se configura para ambos la propiedad IsMDIContainer.

Location Indica la posición del formulario con respecto a la esquina superior izquierda de la pantalla. Antes había que configurar la propiedad Top y Left, ahora los valores de X e Y.

Opaciti Es una nueva propiedad , que indica la forma devisualizacion del formulario, que puede ser desde opaco (100%) hasta transparente (0%). Antes para hacer transparente se usaba la API SetWindowRgm

RigfRToLeft Determina la alineación de los textos con respecto a sus controles, por defecto es No, es decir se alinea de izquierda a derecha, si es True se alinearán de derecha a izquierda

Size Configura el tamaño del formulario no pixelesStartPosition Indica la posición e que aparecerá por primera vez el formulario con

respecto a la pantalla. Tiene 5 opcionesText Antes se llamaba Caption y permite mostrar el texto de la barra de

título en el formularioTopMost Posiciona en primer plano la ventana, siempre y cuando no este

desactivada. Antes se podía hacer esto con la API WindowsOnTop.WindowsState Determina la forma en que se presentará la ventana, puede ser Normal,

Web Developer Microsoft.NET

Page 24: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Minimizada o Maximizada.

• Métodos

Propiedades DescripciónActive Activa el formulario y le da el focoActivateControl Activa un control del formularioClose Cierra un formulario descargándolo de la memoriFocus Pone el foco sobre el formularioHide Oculta el formulario, sin descargarlo de la memoriaRefresh Repinta el formulario y sus controlesSetLocation Ubica el formulario en una cierta posición de la pantallaSetSize Configura el tamaño de la ventana en píxelesShow Muestra un formulario como ventana no modal (modeles)ShowDialog Muestra un formulario como ventana modal (modal)

• Eventos

Propiedades DescripciónActivated Ocurre al activarse el formularioClick Se desencadena al dar clic con el mouse sobre el formularioClosed Se habilita al cerrar el formulario. Es similar al evento. Unload de

Visual Basic 6.Closing Ocurre mientras se está cerrando el formulario. Es similar al evento

QueryClose de Visual Basic6. También se puede cancelar la salidaDeactivated Ocurre al desactivarse el formularioDoubleClick Se desencadena al dar doble clic con el mouse sobre el formularioGotFocus Ocurre al ingresar el foco sobre el formularioLoad Se produce al cargar los controles sobre el formularioLostFocus Ocurre al salir el foco del formularioMouseEnter Se habilita al ingresar el mouse sobre el área cliente del formularioMouseLeave Se habilita al salir del mouse del área cliente del formularioMove Este evento se habilita al mover la ventana o formularioPaint Ocurre al pintarse la ventana en pantalla.Resize Ocurre cada vez que se modifica de tamaño el formulario

Uso del ToolBox

El TooBox es la caja de herramientas donde se encuentran los controles que se van ha usar para diseñar la

interface de los diferentes tipos de aplicaciones, este varía de acuerdo al tipo de plantilla elegida.

A continuación se presenta el ToolBox cuando elegimos una plantilla”Windows Application”; este presenta

varias fichas “Windows Forms”, “Data”, “Components” y “General”.

Figura 4.2: ToolBox para Aplicaciones Windows

Web Developer Microsoft.NET

Page 25: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Para usar un control del TooBox solo hay que elegir la ficha adecuada y luego seleccionar el control y arrastrarlo sobre el formulario o contenedor donde se desea ubicarlo, también se puede dar doble clic sobre el control y aparecerá por defecto en la posición 0.0 del formulario (antes se ubicaba al centro de éste).

Usando Controles para Windows FormsUtilización de Listas.

Establece las siguientes propiedades:

Control Propiedad Valor

Web Developer Microsoft.NET

Page 26: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Textbox1 NameText

txtNombre

Button1 NameText

btnAgregar&Agregar

Button2 NameText

btnEliminar&Eliminar

Button3 NameText

btnLimpiar&Limpiar Todo

Button4 NameText

&btnSalirSalir

ListBox1 NameAutosizeFontText

lstAmistadesTrueArial, 10pt,style=bold

Label3 NameAutosizeBorderStyleFontTextTextAlign

lblTotalTrueFixed3DArial, 12pt,.style=Bold

MiddleCenterForm1 Name

TextFormBorderStyleStartPosition

frmDemo01Empleo ListasSizableCenterScreen

En las versiones anteriores de visula basic era muy practico emplear los array de controles de tal forma que podriamos compartir funcionalidades entre una serie de controles, y cuando se requiera saber que control estaba lanzando el evento empleabamos el indexEn visual basic.NET para poder tener el efecto de un array de controles. Necesitamos conectar un metodo a multiples eventos, a partir de alli puede hacer uso del parametro sender para identificar que control provoco el evento.Para comprobar eso agregar el siguiente codigo, debajo del windows form designer:

Public Sub Procesa(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click, btnEliminar.Click, btnLimpiar.Click, btnSalir.Click Dim BotonSeleccionado As Button BotonSeleccionado = CType(sender, Button) With lstAmistades Select Case BotonSeleccionado.Name Case "btnAgregar" .Items.Add(txtNombre.Text) txtNombre.Text = "" : txtNombre.Focus() Case "btnEliminar" .Items.Remove(.SelectedItem) Case "btnLimpiar" .Items.Clear() Case "btnSalir" End End Select lblTotal.Text = .Items.Count End With

End Sub

INTERFACES

Introducción

Web Developer Microsoft.NET

Page 27: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Una interfase es el medio de comunicación entre dos entidades, en nuestro caso, la interface sirve de enlace entre el usuario y la aplicación.En la evolución de la computación se inicia con interfaces de texto o de consola, las cuales predominan desde ls inicios de la computación hasta casi la mitad de la década del ochenta, luego aparecen las interfaces gráficas.

Desde que trabajamos en ambiente Windows, las interfaces han ido evolucionando de acuerdo a la facilidad del usuario para acceder a los elementos de la aplicación, y entre las principales intefaces tenemos:

SDI (single Document Interfce) : Interface de simple documento muetra una sola ventana con un cierto documento en la aplicación; El acceso a las ventanas es secuencial por lo que no es tan recomendable. Algunas aplicaciones con SDI son los accesorios de Windows. Block de notass, Point, Worpad, etc.MDI. (MultipleDocument Interface) : Interface de multiples document, muestra varios documentos en sus respectivas ventanas, las cuales aparecen sobre una ventana principal; el acceso a las ventanas es directo porque generalmente en la ventana padre existe un menú. Algunas aplicaciones con MDI son los programas de Office:Word y Excel.

TreeView-ListView (Vistas Arbol – Lista) : Muestra los elementos de la aplicación en un árbol (TreeView) y en elado derecho muestra una lista con los detalles (List View) ; puede mostrarse junto a un SDI, como en el caso del Explorador de Archivos de Windows o puede mostrarse junto a un SDI como en el caso del Entrerprise Manager de SQL Server 6 o Superior.

Con la evolución de Internet también se distinguen diferentes tipos de interfaces en el Browser, pero que no se tocan en este capítulo, sino que nos centraremos en la creación de interfaces para aplicaciones Windows.

CREANDO APLICACIONES MDI

Una aplicación MDI consta de dos partes: Un formulario MDI padre y uno o más formularios MDI hijos, la creación de ambos es muy sencilla en VB . NET y se aplica a continuación:

CREANDO UN FORMULARIO MDI PADRE Para crear un formulario MDI padre solo hay que configurar la propiedad IsMDI Container del formulario a True.A diferencia de la version anterios de Visual Basic, esta versión permite colocar cualquier control Winform dentro del formulario MDI, pero esto hará que los formularios hijos se muestren en segundo plano, ya que en primer plano se verá los controles del formulario MDI padre.

CREANDO UN FORMULARIO MDI HIJO

Para crear un formulario MDI hijo, solo hay que configurar la propiedad PARENT (Disponible solo en tiempo de Ejecución) del formulario hijo apuntar al formulario padre y luego usar el método Show para mostrarlo.

El siguiente código muestra como mostrar un formulario hijo desde un menú:Protected sub mnu archivo- Nuevo-clic (ByVal sender Objet,...)Dim X As New frmHijo()X. MDIParent=frmPadreX. Show()End sub

ORGANIZANDO FORMULARIOS MDI HIJOS

Web Developer Microsoft.NET

Page 28: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Si es que desea organizar los formularios MDI hijos se debe usar el método LAYOUTMDI, del formulario MDI padre junto con una constante de tipo MDILAYAOUT, que tiene 4 valores:Arrangelcons, Cascade, TileHorizontal y TileVertical.Acontinuación se muestra como ordenar en cascada los formularios MDI hijos de un formulario MDI Padre llamado frmPadre: Frmpadre.layoutMDI(MDILayout.Cascade)

CONTROLES TREEVIEW Y LISTVIEW

Estos dos controles casi siempre trabajan juntos, uno muestra los elementos de la aplicación y el otro su contenido o detalle, antes estaban disponibles como controles activeX, ahora en VB.NET estaán disponibles como controles del WinForm. Ambos controles generalmente usan imágenes para mostrar los elementos, por lo cual plrimero veremos el uso del control ImageList para almacenar imágenes de las vistas.

TRABAJANDO CON EL IMAGELIST.

Para llenar una lista de imagenes realice los siguientes pasos:

Doble clic al control ImageList del ToolBox y se mostrará en la parte inferior de diseñados de formularios.Conigurar la propiedad “Name” usando el prefijo ils, seguido del nombre y la propiedad “imagesize” que define el tamaño de las imágenes: 16,32,48, etc.Seleccionar la propiedad “image” que es una colección y pulsar sobre el botón, entonces aparecerá el diálogo “Image collection Editor” en el cual se añadirá ñas imágenes con el botón “Add” y se eliminará con “remove”

Ejemplo:En el siguiente ejemplo se demuestra de cómo utilizar un control MainMenu en un formulario, inicie una nueva aplicación de tipo Winforms asígnele el nombre Ejercicio01 y realice los siguientes pasos:

1. Debe de Agregar un cuadro de texto al cual en la propiedad multiline debe asignarle el valor true, la representación final sera como lo muestra la siguiente imagen:

2. Luego debe agregar un control de MainMenu y configurar de acuerdo a las siguientes representaciones.

Web Developer Microsoft.NET

Page 29: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

3. A cada opcion del menu asignale un nombre que llev relacion, por ejemplo al menu archico asignale en la propiedad Name: archivoMenuItem, a la opcion Cerrar el name: cerrarMenuItem y asi sucesivamente con cada una de las opciones del menu.para poder representar la linea de división de Menu Edición debe de colocarse en la propiedad text un símbolo de guion (-)

4. Agregar el siguiente codigo:

Private Sub CerarMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click Me.Close() End Sub

Private Sub CopiarMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click TextBox1.Copy()

End Sub

Private Sub PegarMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click TextBox1.Paste() End Sub

Private Sub LimpiarMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem6.Click TextBox1.Clear() End Sub

5. Ejecute el programa en el cuadro de texto digite “Business Developer”, seleccione lo digitado y del menu Edición seleccione la opcion copiar, borra el contenido del cuadro de texto con la opcion Limpiar Todo y luego del menu Edición seleccione Pegar, finalmente del menu Archivo seleccione Cerrar.

Creando Windows Control

Existen Tres Formas o técnicas para la creación de nterfaces de usuario personalizadas las cuales son:• Heredar desde un control• Construir un Control compuesto• Definir desde una clase Control

Construir un control heredado de otro control

Implementar un cuadro de texto numericoComo ejemplo crearemos un control que solo permita entradas numéricas esto nos hace pensar en el control Textbox que permita el ingreso de cualquier carácter. El nuevo control heredado debe de cumplir con las siguientes consideraciones:

• Permitir solo digitos• Permite la entrada del punto decimal• Permite el ingreso del signo menos , pero solo en la primera opcion• Todos los demas caracteres deben ser ignorados por el control

Para desarrollar debemos de seguir las siguientes instrucciones:

1.Iniciar un nuevo proyecto de tipo windows Control Library, Complete la información de acuerdo a la siguiente representación y pulse OK.

Web Developer Microsoft.NET

Page 30: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

2. Seleccione del menu Project la opcion de code o pulsar la tecla de funcin F73. Renombre la clase empleando la descripción CuadroTextoNumerico en vez de Usercontrol1.4. Reemplzar la sentencia Inherits System.Windows.Forms.UserControl por la siguiente:

Inherits System.windows.Forms.Textbox

5 .Siguiente paso es agregar la funcionalidad requerida. En nuestro caso debemos controlar los ingresos que se realicen en el cuador de texto, para ello programaremos en el evento KeyPress, para seleccionar dicho evento seleccione las listas como se muestra en la siguiente representación

6. En el evento seleccionado agregar el siguiente codigo: Private Sub CuadroTextoNumerico_KeyPress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress Dim keyascii As Integer keyascii = Asc(e.KeyChar)

Select Case keyascii Case 48 To 57, 8, 13 Case 45 If InStr(Me.Text, "-") <> 0 Then

Web Developer Microsoft.NET

Page 31: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

keyascii = 0 End If

If Me.SelectionStart <> 0 Then keyascii = 0 End If

Case 46 If InStr(Me.Text, ".") <> 0 Then keyascii = 0 End If Case Else keyascii = 0 End Select

If keyascii = 0 Then e.Handled = True Else e.Handled = False End If End Sub

7. Pulsar la combinación Ctrl+shift+B y grabe su aplicación8. Del menu File, seleccione la opcion Add Project y haga clic en New Project9. Complete de acuerdo a la siguiente representacion

10. Sobre el toolbox de la aplicación cliente haga clic derecho y seleccione customize Toolbox, luego selecione .Net Framework componets como muestra la siguinte representación:

Web Developer Microsoft.NET

Page 32: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

11. Pulse el boton Browse y seleccione el archivo CuadroTextoNumerico.dll y pulse Open luego pulse el boton OK.

12. Desde el ToolBox añada el control CuadroTextoNumerico al formulario, la representación sera la siguiente:

13. En la ventana del solution Explorer haga clic derecho sobre el proyecto ClienteCuadroTextoNumerico y seleccione la opcion Set Up As Startup Project, tal como lo muestra la siguiente representación:

Web Developer Microsoft.NET

Page 33: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

14. Grabe y ejecute su aplicación

Modificar la funcionalidad al controlComo habra notado el ejcutar la aplicación encontramos que la descripción CuadroTextoNumerico1 aparece como contenido del control que acabamos de crear esto podria ocasionar confusión al usuario si tomamos en cuenta las funcionalidades del control, por lo tanto tenemos que realizar un ligero cambio en la propiedad Text de nuestro control de tal manera que si la descripción que se le asigen a dicha propiedad contiene letras esta no se muestra al momento de ejecutar el programa.Para ello al final del codigo que evalua los caracteres digitados , modifiquen el comportamiento de la propiedad Text con el siguiente Codigo:

Public Overrides Property Text() As StringGetReturn MyBase.TextEnd GetSet(ByVal Value As String)If IsNumeric(Value) ThenMyBase.Text = ValueEnd If

If Value = Nothing ThenMyBase.Text = ValueExit PropertyEnd If

End SetEnd Property

Al ejecutar su aplicación ya no observara la descripción que aparece por defecto en la propiedad Text del control personalizado.

Web Developer Microsoft.NET

Page 34: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

INTRODUCCIÓN AL ACCESO A DATOS

Entendiendo ADO.NET

ADO.NET es un modelo de programación basado en estándares que permite crear aplicaciones distribuidas que accedan a datos compartidos. Por ser una Interfase de Programación de Aplicaciones (API), está disponible desde muchas aplicaciones, herramientas de desarrollo, lenguajes de programación y navegadores de Internet.

Entre los Software donde podemos usar ADO.NET tenemos:

Visual Basic.NET

Visual C++.NET

Visual C#

ASP.NET

Jscrip.NET

Esta nueva versión de ADO ofrece ventajas significativas con respecto a las versiones anteriores que

podemos resumirlas en dos, las cuales se detallan más adelante:

Interoperabilidad: Formado de transporte universal XML

Escalabilidad: DataSet, desconectado aumenta la concurrencia

Al igual que ADO,ADO.NET permite acceder a todo tipo de orígenes de datos, ya sean planos como archivos de texto, bases de datos relacionales como MS Acceso o MS SQL Server, y documentos de diferente tipo como Word, Excel, etc.

En el caso de aplicaciones que requieran acceder a datos comparativos, por ejemplo en una página Web de

Internet, se utilizan datos desconectados, intercambiándose a través de XML los datos.

Las ventajas de usar DataSet y enviarlos a través de XML en ADO.NET es que no requiere de ninguna

infraestructura adicional, lo que se envía es texto; en cambio, en ADO se requería del Marshalling que es

administrado por COM, por lo que había que tener la arquitectura adecuada para realizar esto (Servidor

Windows con MTS).

Las ventajas de usar DataSet y enviarlos a través de XML en ADO.NET es que no requiere de ninguna

infraestructura adicional, lo que se envía es texto; en cambio, en ADO se requiera del Mashalling que es

administrado por COM, por lo que había que tener la arquitectura adecuada para realizar esto (Servidor

Windows NT con MTS).

Otra ventaja de ADO.NET es que para operaciones de múltiples actualizaciones concurrentes, en el caso de

que trabajen cientos o miles de usuarios con los datos, el bloqueo es inmediato y no mantiene conexiones

abiertas debido a que los DataSet trabajan con el concepto de datos desconectados.

Diferencias entre ADO y ADO,NET

Web Developer Microsoft.NET

Page 35: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Para entender las nuevas características y ventajas de ADO.NET vamos a realizar un cuadro comparativo

con la versión anterior de ADO.

Características ADO ADO.NETRepresentación de Datos en memoria

Usa el objeto Recordsel el cual se comporta como si fuese una simple tabla

Usa el objeto DataSet, el cual puede contener una o más tablas representadas por DataTables

Relación entre varias tablas

Se realiza mediante una consulta con JOIN uniéndose el resultado en una simple tabla.

Tiene el objeto DataRelation que permite asociar registros entre dos DataTables.

Navegación de datos Se recupera un conjunto de registros secuencialmente

Acceder a los registros de forma no secuencial, para lo cual sigue las relaciones entre los registros de una t abla con otra relacionada.

Acceso desconectado El acceso desconectado se implementa a través del Recordset y el acceso conectado se da a través del objeto Connection

Se comunica con la BD a través de llamadas estandarizadas al objeto DataAdapter, el cual se comunica con un proveedor.

Programabilidad Usa el objeto Connection para transmitir comandos direccionandolos a un origen de datos.

Una XML para transmitir datos desde el origen da datos a una aplicación.

Compartir datos desconectados entre niveles o componentes

Usa el Marshalling de COM para transmitir un Recordset desconectado. Solo está disponible para tipos de datos definidos por el estándar COM.

Se transmite mediante DataSet grabado en un archivo XML, este soporta cualquier tipo de datos y no requiere conversión de tipos.

Transmisión de datos a través de Firewalls

Es complicada la transmisión, por cuanto los Firewalls impiden el pedido de datos a nivel de sistema, que es el caso de COM.

Es soportada, porque los objetos DataSet de ADO.NET viajan a través de XML que es basado en HTML que puede pasar libremente a través de Firewalls

Escalabilidad El bloqueo a la base de datos y el mantenimiento de conexiones activas limitan los recursos de las bases de datos

El acceso desconectado permite retener lo menos posible las conexiones abiertas y el bloqueo dando una gran escalabilidad

Arquitectura de ADO.NET

Para entender ADO.NET es necesario conocer la arquitectura y forma de trabajo de éste, que se basa en el

objeto DataSet que es una copia de los datos en la memoria del cliente y por tanto trabaja desconectado, para

comunicarse con el origen de datos se utilizan los proveedores administrados, tal como se muestra en la

figura de abajo.

Figura 5.1 Forma de trabajo de ADO.NET

Web Developer Microsoft.NET

Page 36: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

El transporte de datos tanto desde y hacia el origen de datos se hace a través de XML favoreciendo el

intercambio de datos entre diferentes tipos de plataformas, favoreciendo el desarrollo de aplicaciones

Cliente/Servidor que integren aplicaciones entre negocios (BtoB)

Herramientas de Datos

Las Herramientas de Datos son el medio más rápido y sencillo para crear aplicaciones que acceden a datos.

En Visual Studio.NET tenemos varias herramientas que hacen el trabajo con datos más fácil, entre las cuales

podemos menciona:

Server Explores

DataAdapter Wizard

Menú Data

Server explorer

Esta ventana muestra básicamente dos cosas. Las Conexiones activas a Bases de Datos, como por ejemplo MS Access, SQL, etc, y los Servidores instalados en la red, cada Servidor a su vez visualiza los diferentes servicios tales como eventos de errores, colas de mensajes, servicios Windows y Web, servicios de datos, tal como se muestra en la siguiente figura.

Figura 5.3 Ventana del Server Explores

Web Developer Microsoft.NET

Page 37: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Creando una Conexión con el Server Explorer

En este módulo como lo que nos interesa es acceder a datos, lo primero que debemos hacer es añadir una

conexión a alguna Base de Datos, en nuestro caso la BD se llama “Nort Wind” y se encuentra en el Servidor

SQL Server llamado “Lduenas”, para lo cual usaremos la ventana del Server Explores, realizando los

siguientes pasos:

Dar clic derecho sobre la opción “Data Conecctions” del Server Explorer y elegir del menú contextual la

opción “Add Connetion”.

Se mostrará la ventana de enlace a datos, similar a la de Visual Basic 6 usada al crear una conexión con

el Data Environment.

Por defecto aparece la ficha “Connetion” con una conexión a SQL Server, pero si queremos acceder a

otro origen de datos elegir la primera ficha “Provider” y modificar el proveedor OLEDB, de lo contrario

llenar la propiedad de conexión.

Figura 5.4 Ventana de Enlace de Datos

Web Developer Microsoft.NET

Page 38: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

• En el paso 1 seleccionar de la lista el Servidor de Datos al cual se quiere conectar; si es remoto y no

aparece, ha que escribir su nombre, por ejemplo: “Lduenas”.

• En el paso 2 especificar el tipo de seguridad que puede ser Integrada “Windows NT” o Estándar (SQL

Server), si se elige Estándar ingresar el usuario y password de la Base de Datos, por ejemplo como

usuario ingresar “sa” sin password.

• En el paso 3 elegir la Base de Datos a la cual se quiere conectar, en nuestro caso “North Wind”.

• Probar la conexión dando clic en el botón “Test COnnection” y si la respuesta es satisfactoria dar clic en

el botón “OK”.

• Finalmente, se habrá creado la conexión que se mostrará en la ventana del Server Explorer.

Accediendo a Datos con el Server Explorer

Una vez creada la conexión al origen de datos podemos explorar el contenido de la base de datos y ver sus

tablas, vistas o consultas, y procedimientos almacenados (en el caso de SQL Server), tal como lo muestra la

siguiente figura.

El Server Explorer realiza el mantenimiento de una aplicación sin tener que ir hasta la máquina donde se

encuentra el servidor del datos, es decir, podemos crear, modificar y eliminar objetos como tablas, vistas o

consultas, procedimientos almacenados, etc.

Web Developer Microsoft.NET

Page 39: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Por ejemplo, si se quiere ingresar un empleado a la tabla “Employees” solo basta dar doble clic sobre el

nombre de la tabla y se mostrarán todos los registros, ubicarse al final e ingresar los datos del empleado

(excepto su código que es a utogenerado).

Para cualquier otra operación solo basta dar clic derecho sobre la tabla y aparecerá:

Creando Aplicaciones de Datos con el Servidor Explorer

Para los desarrolladores, el Server Explorer también da la posibilidad de crear aplicaciones de manera simple

y rápida. Por ejemplo, si queremos realizar una aplicación que muestre la lista de empleados, realice los

siguientes pasos:

♦ Crear una aplicación para Windows y colocar un control “DataGrid” sobre el formulario al cual le puede

llamar “dgdEmpleado”.

♦ Expandir la tabla “Employees” del Server Explorer y elegir los campos que se desean mostrar, por

ejemplo: “EmployeeId”, “LastName”, “FirstName” y “Title”,

♦ Arrastrar los campos hacia el formulario y se crearán dos objetos: Sq[Conecction] y Sq[DataAdapter] los

cuales se verán en la zona de diseño.

♦ Dar clic derecho sobre el objeto “Sq[DataAdapter]” y elegir del menú contextual “Generate Dataset...” y

aparecerá la siguiente ventana.

Figura 5.7 Ventana de Generar Dataset

Web Developer Microsoft.NET

Page 40: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

♦ Seleccionar la opción “New” y escribir el nombre del Dataset, en nuestro ejemplo: “dstEmpleado” y dar

clic en “OK” e inmediatamente se creará un objeto Dataset sobre el diseñador llamado “dstEmpleado1”

♦ Finalmente, para que se muestre los datos en tiempo de ejecución hay que agregar el siguiente código en

el evento Load del formulario:

SqlDataAdapter1.Fill(DstEmpleado1)

DataAdapter Wizard

El DataAdapter Wizard es un asistente que permite crear un objeto Conection y un objeto DataAdapter. Este

último permitirá crear el Dataset que es el que contiene los datos y permite realizar actualizaciones sobre la

base de datos.

Como existen dos proveedores de datos.NET, existen dos formas de usar el asistente:

1. SqlDataAdapter

2. OledbDataAdapter

En nuestro caso, vamos a indicar como crear un DataAdapter para la tabla “Product” de la BD “NorthWind”

usando el Sq1DataAdapter, para lo cual se realiza lo siguiente:

Dar doble clic al botón “Sq1DataAdapter” de la ficha “Data” del Too1Box.

Se mostrará el Paso 1 del Asistente de Configuración del DataAdapter

Damos clic en el botón “Next” del Paso 1 que nos muestra la utilidad del DataAdapter Wizard.

En el Paso 2 se debe especificar la Conexión que usará el DataAdapter, si es que ya ha sido creada solo

debemos elegirla de la lista, pero sino daremos clic en el botón “New Conecction” y seguiremos los

pasos vistos en el tema anterior para crear la Conexión.

Después de especificar la conexión clic en el botón “Next” y pasaremos a la ventana del paso 3 donde se

elige la forma como se quiere crear la Consulta, la cual puede ser de tres formas: a travpes de una

Sentenc ia SQL (Select, Insert y Delete), un nuevo Store Procedure o uno existente.

En nuestro caso elegimos la opción por defecto: Usar una Sentencia SQL y clic en el botón “Next”,

apareciendo la ventana del Paso 4 que pide escribir el Comando, tal como lo muestra la

Creamos la consulta escribiendo la sentencia SQL, sino elegimos el botón del “Q uery Builder” que crea

consultas de manera simple, cuya apariencia se muestra en la figura.

Figura 5.12 Ventana del Query Builder

Métodos

Método DescripciónBegin Transaction Inicia una transacción que se ejecuta de acuerdo a un cierto

nivel de aislamiento, que puede ser de lectura confiable y no

Web Developer Microsoft.NET

Page 41: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

confiable, serializable, etc.ChangeDataBase Cambia la base de datos a la cual nos conectamosClose Cierra la conexión a la base de datosCreateCommand Crea un objeto Command asociado con la conexión abiertaOpen Abre la conexión hacia el origen de datos de acuerdo a la

cadena de conexión

Eventos

InfoMessage Ocurre cuando el origen de datos envía un mensaje a la aplicación, por ejemplo cuando ocurre un error de integridad referencial

StateChange Ocurre cada vez que se modifica el estado de la conexión, es decir, cuando cambia el valor de la propiedad State.

Crear una Conexión

Usando SQLClient:

Imports System.Data.SqlClient

Dim en As SglConnection=New SqlConnetion (“User Id=sa;Password=_Data Source=Iduenas:Initial

Catalog=Nortwind”)

Usando Oledb

Imports System.Data.Oledb

Dim en As OledbConnection=New Oledb Connetion (“Provider SQLOLEDB;;_User Id=saPassaword; Data

Source=Iduenas:Initial Catalog=Nortwind”)

Cerrar una Conexión

En Close

Menú Data

El Menú Data aparece cuando se crea un DataApadter que accede a da tos, este menú contiene varias

opciones, entre las principales:

1. Generar Dataset

2. Preview de Datos

Generar Dataset

Web Developer Microsoft.NET

Page 42: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Esta opción del menú Data permite generar un conjunto de registros desconectado o DataSet, para lo cual, se

tiene que ingresar el nombre del DataSet y especificar que se desea añadir una instancia de la clase DataSet

dentro del programa, tal como se mostró en la figura 5.7 al usar el Server Explorer.

En nuestro caso, continuando con el ejemplo anterior de mostrar los productos elegir la opción “new” y

escribir “dstProducto”, luego “OK” e inmediatamente se añadirá un objeto “DsProducto1” al diseñador.

Para que se vean los productos en tiempo de ejecución añadir en el evento Load del formulario el siguiente

código:

DgdProducto.DataSource = DsProducto1.Tables(0).DefaultView

SqlDataAdapter1.Fill(DstProducto1)

Nota: Si se desea ver las características del Dataset generado se selecciona el objeto y del Menú “Data” se

elige “Dataset properties...”

Preview de Datos

Esta opción del menú Data es usada para mostrar una vista preliminar con los datos creados por el

DataSAdapter, es decir los registros de cualquier tabla de un DataSet.

Al elegir esta opción se presenta una ventana, en donde primero se debe elegir el DataAdapter, en el caso de

que sea un Store Procedure con parámetros, podrá configurarse el valor de los parámetros.

Luego, en la lista Data tables se presentarán todas las tablas que hayan sido creadas por el DataSet. Elegir

una y dar clic en el botón “Execute” e inmediatamente se presentarán los datos, tal como se muestra en la

figura de abajo.

Figura 5.13 Ventana del Preview de Datos

Web Developer Microsoft.NET

Page 43: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Algo interesante, que cabe mencionar, es que esta herramienta muestra el tamaño aproximado que ocupa los

datos mostrados por el Data Table.

Si se desea ejecutar una nueva vista de datos, se da clic sobre el botón “Clear Results”, se elige un nuevo

Data Table y clic en “Fill Dataset”.

Para salir de esta herramienta dar clic en el botón “Close” o sobre el botón de cerrar de la ventana.

Objetos de ADO.NET

Después de ver la forma de acceder a datos mediante herramientas, ahora veremos como usar el modelo de

objetos de ADO.NET el cual es a diferencia de su antecesor ADO 2.X totalmente distinto, ya que antes

existía un solo modelo de objetos empezando por el componente OLEDB y las clases Connection, Command

y Recordset.

Ahora los objetos de ADO.NET se encuentra distribuidos en varios modelos de datos, dividiéndose en dos

grupos: Proveedores de datos.NET y Dataset, los cuales se examinan a continuación:

Objetos Connection y Comand

Objeto Connection

Se usa para establecer una conexión con el origen de datos y poder asegurar las transacciones que realizan

las instrucciones o comandos sobre dicho origen de datos. Este objeto ha tenido muchos cambios con

respecto a la versión anterior de ADO, para lo cual analizamos sus elementos.

Web Developer Microsoft.NET

Page 44: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Propiedades

Propiedad DescripciónConnectionString Configura o devuelve la cadena de conexión que consta del

proveedore, usuario, passaword, servidir y base de datos.Connection TimeOut Devuelve los segundos que puede esperar como máximo

mientras trata de conectarse a la base de datos. Si se pasa

del tiempo de espera se genera un error de conexiónDataBase Obtiene el nombre del servidor al cual se ha conectadoPacketSise Muestra el tamaño de los paquetes en bytes usados para

comunicarse con el servidor de datos a través de la red.Provider Devuelve el nombre del Proveedor OLEDBServerrVersión Regresa la versión del servidor de d a tos que se está usandoState Devuelve el esta actual de la conexión, que puede ser

abierta, en ejecución, pausada o cerradaWorkStationId Obtiene el nombre del cliente que está conectado al

servidor.

Métodos

Método DescripciónBegin Transaction Inicia una transacción que se ejecuta de acuerdo a un cierto

nivel de aislamiento, que puede ser de lectura confiable y no

confiableChangeDataBase Cambia la base de datos a la cual nos conectamosClose Cierra la conexión a la base de datosCreateCommand Crea un objeto Command asociado con la conexión abiertaOpen Abre la conexión hacia el origen del datos de acuerdo a la

cadena de conexión.

Eventos

Evento DescripciónInfoMessage Ocurre cuando el origen de datos envía un mensaje a la

aplicación, por ejemplo cuando ocurre un error de

integridad referencialStateChange Ocurre cada vez que se modifica el estado de la conexión,

es decir, cuando cambia el valor de la propiedad State.

Crear una Conexión

Usando SQLClient

Imports System.DataSq1Client

Web Developer Microsoft.NET

Page 45: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Dim en As Sq1Connection=New Sq1Connection (“User Id=sa;Password=;_DataSource=Ldueñas; Initial

Catalog=Northwind”)

Cn.open

Usando Oledb:

Imports System.DataSq1Oledb

Dim en As OledbConnection=New OledbConnection (“Provider=SQLOLEDB:User

Id=sa;Password=;_DataSource=Ldueñas; Initial Catalog=Northwind”)

Cn.open

Cerrar una Conexión

Cn.Close

Objeto Command

Se usa para ejecutar instrucciones sobre el origen de datos, tales como ejecutar una consulta (Select),

inserción (Insert), actualización (Update) o eliminación (Delete) así como ejecutar un procedimiento

almacenado del servidor de datos.

Este objeto también ha tenido muchos cambios con respecto a la versión anterior de ADO, para lo cual

analizamos sus elementos.

Propiedades

Propiedad DescripciónCommand Text Configura o devuelve la sentencia SQL, el nombre de la

tabla o del procedimiento almacenado a ejecutarCommand TimeOut Devuelve los segundos que se puede esperar como máximo

mientras trata de ejecutarse el comandoCommandType Asigna o recupera el tipo de comando a ejecutar, que puede

ser una instrucción SQL, una tabla o procedimiento

almacenado.Connection Configura o devuelve la conexión que está usando el

comando.Parameters Es una colección que guarda información de los parámetros

de un procedimiento almacenado o una consulta con

parámetros.Transaction Es un objeto que permite manipular transacciones, para esto

cuenta con métodos como: Begin, Commit y RollBack

Web Developer Microsoft.NET

Page 46: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Eventos

Evento DescripciónInfoMessage Ocurre cuando el origen de datos envía un mensaje a la

aplicación, por ejemplo cuando ocurre un error de

integridad referencialStateChange Ocurre cada vez que se modifica el estado de la conexión,

es decir, cuando cambia el valor de la propiedad State.

Métodos

Método DescripciónCancel Cancela la ejecución de un comandoCreateParameter Crea un objeto Parameter para trabajar con un parámetro de un

procedimiento almacenado o consulta con parámetrosExecuteNonQuery Ejecuta una instrucción SQL y devuelve el número de registros

afectados. Se usa para ejecutar Insert, Update o DeleteExecuteReader Ejecuta una consulta SQL o un procedimiento almacenado de

selección y devuelve los registros en un objeto DataReader.ExecuteScalar Ejecuta una instrucción SQL y devuelve un simple valorPrepare Crea una versión compilada o preparada del comando en el

servidor. Es muy útil para dar velocidad a la aplicación.

Eventos

Evento DescripciónFillError Ocurre cuando se produce un error al ejecutar el método Fill

del DataAdapter para llenar un conjunto de registros en el

Dataset.RowUptated Ocurre después de actualizar los registros de un Dataset

cuando se invoca al método Update del DataAdapterRowUpdating Ocurre mientras se está actualizando los registros de un

Dataset cuando se invoca al método Update del

DataAdapter.

Llenar Datos con el DataAdapter

Como ejemplo vamos a llenar un DataGrid con todos los productos de la tabla “Products usando el método

Fill del DataAdapter”.

Usando SQLClient:

Web Developer Microsoft.NET

Page 47: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Imports System.Data

Imports System.DataSq1Client

Dim en As Sq1Connection=New Sq1Connection (“User Id=sa;Password=;DataSource=Server; Initial

Catalog=Northwind”)

Dim da As SqlDataAdapter=New Sq1DataAdapter(“Select * From Products”,cn)

da.Fill (ds, “Products”)

dgdproducto.DataSource = ds.Tables(0).DefaultView

Usando Oledb:

Imports System.Data

Imports System.Data.Oledb

Dim cn As OledbConnection=New OledbConnection (“Provider=SQLOLEDB:User

Id=sa;Password=;_DataSource=Ldueñas; Initial Catalog=Northwind”)

Dim da As OledbDataAdapter=New OledbDataAdapter(“Select * From Products”,cn)

Din ds As DataSet=New DataSet (“Products”)

da.Fill (ds, “Products”)

dgdProducto.DataSource = ds.Tables(0).DefaultView

Objeto DataReader

El DataReader es una vista de datos de solo lectura (Read Only) y avance solo hacia delante (Forward Only)

similar al cursor por defecto generado por el Recordset de ADO.. Este es especial para consultas y es el que

consume menos recursos por ser una copia de registros desconectados del origen de datos.

Propiedades

Propiedad DescripciónDepth Devuelve el nivel de anidamiento del registro actualFieldCount Devuelve el número de columnas o campos del registro

actualIsClosed Determina si el DataReader se encuentra cerradoItem Obtiene el valor del campo especificado en el índiceRecordsAffected Devuelve el número de registros modificados, insertados o

eliminado por una instrucción SQL.

Métodos

Propiedad DescripciónClose Cierra el objeto DataReader

Web Developer Microsoft.NET

Page 48: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

GetDataTypeName Devuelve el nombre del origen del tipo de datoGetFieldType Devuelve el tipo de dato del objetoGetName Obtiene el nombre del campo especificado como índiceGetValue Obtiene el valor del campo especificado como índiceIsDBNull Devuelve un valor lógico indicando si el campo no tiene

datosNextResult Avanza al siguiente conjunto de registros cuando la

sentencia SQL que generó el DataReader es compuesta por varios Select.

Read Lee un registro y avanza al siguiente registro, devolviendo True si es que no es el EOF y False si lo es:

Para ver un ejemplo de cómo crear un DataReader revisar el ejemplo del Objeto para crear una consulta de

datos, el cual ejecutaba una consulta con el método ExcecuteReader y la almacenaba en un objeto

DataReader.

Objeto DataSet

Definición

El DataSet es el objeto principal de ADO.NET y representa un conjunto de datos en memoria, que pueden

incluir tablas, relaciones, etc. Este objeto trabaja desconectado, enviando y recibiendo datos en formato

XML.

Es a través del objeto DataSet que se implementa el trabajo con datos desconectados, debido a que este

almacena los datos en una o más tablas relacionadas, y sobre este se realizan las operaciones con los datos,

tales como navegación, filtro, búsqueda, etc.

La ventana principal del DataSet es que es intercambiable en cualquier plataforma ya que el conjunto de

registros no es binario sino texto en forma de XML, lo que permite integrar aplicaciones de diferentes

plataformas con diferentes herramientas.

Ahora vamos a analizar las características del DataSet, detallando sus propiedades, métodos y eventos, tal

como se muestra a continuación.

Propiedades

Propiedad DescripciónDataSetName Asigna o devuelve el nombre del DataSet actualDefault ViewManager Obtiene una vista personalizada de registros para realizar

operaciones de filtro, búsqueda y navegaciónEnforceConstraints Determina si hubo una infracción de una regla o restricción

de integridad de datosExtendedProperties Obtiene la colección de información personalizada de

usuario.HasErrors Indica si existe un error en cualquiera de los registros de

cualquier tabla del DataSetTables Es una colección de tablas o conjunto de registros

Web Developer Microsoft.NET

Page 49: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Métodos

Métodos DescripciónAccepChanges Envía todos los cambios hechos hasta antes de su llamadaClear Limpia el DataSet eliminando todas las tablas y sus

registrosClone Copia la estructura del DataSet en otro, incluyendo

esquemas, relaciones y restricciones de las tablasCopy Copia la estructura y los datos del DataSet en otroGetChanges Obtiene una copia del DataSet con todos los cambios

hechosHasChanges Devuelve un valor lógico indicando si se ha insertado,

eliminado o modificado registros en el DataSetMerge Combina un DataSet con otroRejectChanges Deshace todos los cambios hechos hasta antes de su llamadaReset Restaura el DataSet a su estado original

Eventos

Evento DescripciónMergeFailed Ocurre al fallar la operación de combinar el DataSet con

otro.

Objeto DataView

Es una vista personalizada de los datos de una tabla, es el equivalente al objeto Recordset de ADO y permite

ordenar, buscar y filtrar datos. Se pueden tener varias vistas de una misma tabla, flexibilizando el trabajo con

datos.

Propiedades

Propiedad DescripciónAllowDelete Indica si está permitido eliminar registrosAlowEdit Indica si se pueden modificar registrosAllowNew Indica si se puede insertar nuevos registrosApplyDefaultSort Devuelve un valor lógico indicado si se está usando el

orden por defecto de la vistaCount Devuelve el número de registros de la vistaRowStateFilter Establece o devuelve el estado de los registros filtrados, que

pueden ser iguales, adicionados, eliminados, modificados, etc.

Sort Ordena por uno o más campos la vista.

Métodos

Método DescripciónAddNew Añade una nueva fila o registro al DataViewCopyTo Copia los registros de la vista en un arreglo, solo usado en

WebDelete Elimina un registro especificado por el índiceFind Busca un registro por la clave primaria que coincida con el

Web Developer Microsoft.NET

Page 50: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

valor.

Eventos

Evento DescripciónListChanged Ocurre al cambiar el conjunto de registros de la vista.

ADO.NET y XML

El eXtensible Markip Language (XML) es el lenguaje común de intercambio de datos en Internet y es un

estándar de la industria que se encuentra normado pro el 3WC (World Wide Web Consortium).

XML, es el núcleo sobre el cual está construido Microsoft.NET ya que en gran parte de las clases del

FrameWork.NET se encuentra XML como medio para transmitir datos, por ejemplo en ADO.NET en

ASPE,NET , sobre todo en los Servicios Wrb XML.

En cuanto a ADO.NET.XML se encuentra presente en el objeto DataSet que recibe y envía datos desde y

hacia el origen de datos en forma de documento XML, pero que también tiene métodos para leer y escribir el

DataSet en un archivo XML, lo cual tratamos a continuación.

Método WriteXML

Es un método del DataSet que permite crear un archivo XML a partir de los datos de una Tabla del DataSet.

Es muy útil realizar esto cuando se quiere enviar la información a otra plataforma que solo puede procesar

archivos de texto, tal como un AS/400 o una Mainframe.

Para crear un archivo.XML con el método WriteXML del DataSet escriba el siguiente código en algún

comando:

Import System.IO

Dim archivo As StreamWriter = New StreamWriter (“NombreArchivo.xm1”)

ObjDataset.WriteXm1 (archivo)

Archivo.Close ()

Método ReadXML

Es otro método del DataSet que permite leer un archivo XML y añadirlo como una Tabla del DataSet. Es

muy útil realizar cuando se requiere recibir la información obtenida desde otra plataforma que solo puede

crear archivos de texto, tal como un AS/400 o una Mainframe.

Para leer un archivo XML con el método ReadXML del DataSet escriba el siguiente código en algún

comando:

Web Developer Microsoft.NET

Page 51: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Imports System.IO

Dim archivo As StreamReader = New StreamReader (“NombreArchivo.xm1”)

ObjDataset.ReadXm1(archivo)

Archivo.close()

Ejercicios

Este laboratorio tiene como objetivo mostrar el acceso a datos mediante ADO.NET, usando

herramientas de datos, haciendo uso de los objetos de ADO.NET y trabajando con XML,

para lo cual se ha dividido en 3 ejercicios que tienen una duración total aproximada de 60

minutos.

Ejercicio 1: Trabajando con Objetos de ADO.NET

Duración 20 minutos

CREATE PROCEDURE sp_Productos_Listar_Porproveedor@IdProveedor int

AS

Select*From Products Wherw SupplierId=@IdProveedor

Order By ProductName

• Realizar el diseño del formulario llamado “frmProducto”, añadiendoc dos etiquetas, un

ComboBox y un ListBox tal como se muestran en la figura de abajo:

Figura 5.18 Diseño del formulario frmProducto

Web Developer Microsoft.NET

Page 52: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

• Para usar OLEDB.NET hay que hacer una referencia al NameSpace adecuado, tal como

sigue:

Import System.Data.OleDd

• Declaramos las siguientes variables: cn para la conexión, cm para el comando, rdS para el

cursor de Proveedores, rdP para el cursor de Productos y pm para el parámetro del

procedimiento almacenamiento anteriormente creado.

Dim cn As OleDbConnection=New OleDbConnection(“Provider=SQLOLEDB”,User Id=Data

Source=Lduenas; Initial Catalog=Northwind)

Dim cm As OleDbComand = New OleDbCommand ( )

Dim rds As OleDbDataReader = Nothing

Dim rdP As OleDbDataReader = Nothing

Dim pm Aas OleDbParameter = Nothing

• Creamos un procedimiento que permita mostrar los productos para refrescar la lista de

productos.

Sub ListarProductos( )

Rdp=cm.ExecuteReader

1stProducto ( ). Items.Clear( )

While rdP.Read

1stProducto( ).Items.Add(rdP (“ProductName”). ToString)

End While

rdP While

rdP.Close ( )

End Sub

• Escribimos código en el evento del formulario para abrir la conexión, ejecutar comandos

y mostrar datos de productos y proveedores, además configuramos el comando para

ejecutar el procedimiento almacenado.

Private Sub frmProducto_Load (...) Handles MyBase.Load

cn.open ( )

cm.Connection = cn

cm.CommandType = CommandType.Text

cm.CommandText = “Select SupplierId From Suppliers Order By

SupplierId”

RdS = cm.ExecuteReader

Web Developer Microsoft.NET

Page 53: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

While rdS.Read

CboProveedor ( ). Items.Add (rdS (“SupplierId”).TosTring)

End While

rdS.Close ( )

cm.CommandText = “Select ProductName From Products Order By

ProductName”

ListaProductos ( )

cm.CommandType = CommandType.StoredProcedure

cm.CommandText = “sp_Productos_Listar_PorProveedor”

pm = cm.Parameters.Add(“@IdProveedir",OleDType.Integer)

pm.Direction = ParameterDirection.Imput

End Sub

• Finalmente, progresamos el llenado de la lista de product os al elegir un proveedor del

ComboBox, pasando el parámetro y ejecutando el procedimiento.

Private Sub cboProveedor_SelectedIndexChanged(...) Handles...

pm.Value = Cint(cboProveedor.Text)

ListaProductos ( )

End Sub

Ejercicio 2: Usando XML en ADO.NET

Duración: 20 minutos

• Elegir un nuevo proyecto “Visual Basic” y una plantilla de “Aplicación Widows”,

seleccionar en ubicación la carpeta “C:\VBNET\Labs” y como nombre escribir “Lab05_3”.

• Vamos a crear una aplicación que recupere datos de los empleados de un cierto local de

la empresa que se encuentra en la BD, luego vamos a simular recuperar la información de los

empleados de otro local en un archivo XML y ambas se actualizarán en la Base de Datos.

• Cambie el nombre del formulario a “frmEmpleado.vb”, agregue un DataGrid y 4 botones,

tal como se muestran en la figura de abajo:

Figura 5.19: Diseño del formulario frmEmpleado

Web Developer Microsoft.NET

Page 54: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

• Después de realizado el diseño hay que crear los objetos Connetion, DataAdapter y

DataSet, para lo cual usaremos la ventana del Server Explorer.

• Expandir la tabla “Employees” del Server Explorer y seleccionar los campos:

“EmployeId”, “LastName”, “FirstName” y “Title”, arrastralos hacia el formulario y

automática se habrán creado los objetos: “Sq1Connectio1” y “Sq1DataAdapter”.

• Ahora creamos el Dataset dando clic derecho al objeto “Sq1DataApter” y eligiendo del

menú contextual “Generate Dataset... .”, luego de la ventana elegimos “New” e

ingresamos como nombre: “dstEmpleado” y “OK”, Imnediatamente se creará el objeto

“DstEmpleado1”.

• Enlazamos el Dataset al control DataGrid configurando la propiedad DataSource de este

último en “DstEmpleado.Employees”.

• Iniciamos la programación indicando que vamos a trabajar con archivos, para lo cual es

necesario hacer una referencia al NameSpace de flujos de entrada y salida de datos, tal

como se muestra:

Imports System.IO

• Escribimos código para llenar los datos de los empleados

Private Sub btnLeerBD_Click(...) Handles btnLeerBD.Click

Sq1DataAdapter1.Fill (DstEmpleado1, “Employees”)

Web Developer Microsoft.NET

Page 55: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

• Los datos mostrados lo grabamos en un archivo llamado “Empleados.xml”.

Private Sub btnEscribirXML_Click(...)Handles btnEscribirXML.Click

Dim arch As StreamWhiter= New StreamWhiter (“c:\Empleados.xml”)

DstEmpleado1.WhiteXm1(arch)

Arch.Close

End Sub

• Recuperamos el archivo “Empleados.xml” dando doble clic y se mostrará en el Browser,

ver el código fuente y modificar los datos de los empleados, volver a grabar el archivo.

• Escribimos código para recuperar los datos del archivo XML y tenerlo junto con la tabla

recuperada de la Base de Datos.

Provate Sub btnLeerXML_Click(...) Handles btnLeerXML.Click

Dim arch As StreamReader = New StreamReader

(“c:\Empleados.xml”)

DstEmpleado1.ReadXml(arch)

arch.Close ( )

End Sub

• Finalmente, actualizamos toda la data y la enviamos a la base de datos

Private Sub btnActualizarBD_Clic(...) Handles

Sq1DataAdapter1.Update (DsEmpleado1, “Employees”)

End Sub

CAPITULO 6

CREANDO COMPONENTES.NET

Introducción a la Programación Orientada a Objetos (POO)

Visual Basic.NET tiene todas las características de la Programación Orientada a Objetos

(POO), ya que el Marco.NET soporta los requerimientos para que todos los lenguajes que

trabajen con el usen POO. Estas características son:

1. Encapsulación

Cuando creamos un componente.NET este se encuentra encapsulado, ya que ocupa la

lógica de programación a los usuarios que lo utilizan, permitiendo manejar dicho objeto a

través de sus miembros, tales como propiedades y métodos, realizando el desarrollo de

aplicaciones mas simple, al ocultar la complejidad del código (encapsular).

Web Developer Microsoft.NET

Page 56: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

2. Herencia

La herencia es la característica en la cual una clase llamada “Clase base” pasa o hereda

todas sus características a otra llamada “Clase Derivada”, permitiendo la total

reusabilidad del código escrito en las aplicaciones. La herencia de clases es una nueva

característica de Visual Basic.NET y no solo es a nivel de clases creadas en este lenguaje

sino a través de cualquier lenguaje del Marco.NET

3. Polimosfismo

Otra característica interesante de la POO es el polimorfismo, en el caso de Visual

Basic.NET este se puede crear cuando en una clase derivada se implementa de manera

distinta un método herecado de la clase base. Es decir. Podemos tener un mismo método

con dos comportamientos distintos (códigos distintos) de acuerdo al tipo de objeto, que

puede ser creado de la clase base o de la derivada.

Como vemos las nuevas características de la Programación Orientación a Objetos (POO)

mezcladas con la facilidad de uso de la Programación Orientada a Componentes (POC) dan

como resultado la creación de aplicaciones poderosas y con un bajo costo de mantenimiento.

Sin duda, la reusabilidad y encapsulación ofrecida por la tecnología COM basada en

componentes se ve incrementada por la herencia de clases y el polimorfismo ofrecida por la

tecnología.NET orientada a objetos; lográndose una verdadera integración entre

aplicaciones.

Para finalizar esta introducción a los componentes.NET la otra gran ventaja con respecto a

COM es la distribución de componentes, que en este último era una pesadilla debido había

que registrar componentes y lidiar con los problemas de compatibilidad de versiones; en

cambio con NET los componentes no se registran y su distribución es automática con solo

copiar y pegar la aplicación.

Elementos de una Clase (Miembros)

Todos los componentes están formados por clases y estas a su vez se componen de elementos

o miembros. Los cuales trataremos en este capítulo.

Para ilustrar mejor tenemos el siguiente gráfico.

A diferencia de Visual Basic ó en donde las clases podian tener solo propiedades, métodos,

y constantes enumeradas, en Visual Basic NET.las clases pueden tener campos delegados,

constructores y destructores. Además pueda ser que una clase herede de otre que este dentro

del componente o en otro componente. NET.

Web Developer Microsoft.NET

Page 57: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Clase

Una clase es la plantilla para crear el objeto, es aquí donde se definen las partes del objeto.

Datos propiedades, constantes enumeraciones, campos. Y procedimientos que operan sobre

los datos MÉTODOS.

La clase define un nuevo tipo de datos que resulta se la abstracción de algún elemento de

aplicación por lo tanto, es necesario diseñar bien la aplicación antes de crear la clase, ya

que esta solo implementa el diseño de objetos previamente diseñado.

Declaración de una Clase

A diferencia de Visual Basic o, donde el tipo de clase estaba dado por la propiedad

INSTANCING. De la clase, que podría ser privada, dependiente

Public Not Create Table o, publica SingleUse. GlabalSingleUse, MultiUse, o

GlabalSingleUse o, MultiUse, en VB. NET. No existe propiedades para el modulo de clases,

ya que las características de las clases dependen de la forma de su declaración.

Sintaxis

{tipo de declaración} class -nombré clase-

{definición de miembros de clase}

End Class

Existen varias formas de declarar una clase, que detallamos a continuación en la siguiente

tabla.

Declaración Alcance o AmbitoPublic Puede usarse en cualquier otra clase

del componente o En las aplicaciones

clientes.Private No puede usarse en otras clases del

componente ni en Las aplicaciones

clientesProtected Solo puede ser usadas por las clases

derivadas de este, Pero no por las

aplicaciones clientes.Friend solo puede ser usadas por las otras

clases del componente, pero no por las

aplicaciones clientes.Protected Friend Es una combinación de ambas, es decir

la clase puede ser usada por otras

clases del componente y por Las clases

derivadas.

Web Developer Microsoft.NET

Page 58: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Shadows indica que los miembros de la clase

pueden ocultarse en La clase derivada,

es decir que al heredar se ocultan

Ciertos miembros.Mustlnherit determinan que los miembros de la

clase pueden heredarse a una clase

derivada, pero no puede ser creada Por

explicaciones clientes. Notlnheritable la clase no puede heredarse pero si

instanciarse desde Aplicaciones

clientes.

Ejemplo

Si queremos crear una aplicación se planilla necesitamos diseñar un componente

que manipule información del empleado, sus horas trabajadas, tardanzas, faltas,

etc.

Para crear la clase empleado, de tal manera que pueda heredarse y utilizarse

tanto dentro del componente como en las aplicaciones clientes, definiríamos la

clase en Visual Basic, tal como sigue.

Constantes Campos y Enumeraciones.

Constantes

Una constante es un dato que permanece fijo en toda ejecución de la aplicación,

a diferencia se la variable cuyo valor va cambiándose en tiempo de ejecución.

Se utiliza para facilitar el mantenimiento del código, ya que si sefinimos un

valor en constante, si esto cambia, con solo cambiar el valor de la constante, la

aplicación trabajaria con el nuavo valor.

Sintasis

{public}{private}{const- nombre- {As-tipo datp-}- valor-.

Ejemplo

Podemos crear un par de constantes que almacenen el valor de las tazas de los

impuestos a la rente e impuesto extraordinario de solidaridad, para propósitos de

calculo de descuentos.

Private Const TasaIRenta As Sirgle-0 1

Private Const TasaIEs As Single- 0 .02

Web Developer Microsoft.NET

Page 59: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Nota

En Visual Basic. NET si no define el tipo de dato de la constante se asume que el

objeto, ya no variant como el Visual Basic. O, debido a que este tipo de dato ya

no existe.

Campos

Un campo es una variable local para la clase, es decir solo puede ser usada

internamente por los miembros de la clase pero no por otras clases o por

aplicaciones clientes.

En campo solo puede ser una variable privada o protegida que se use dentro de la

clase para almacenar un valor usado por alguna propiedad o método, sin que este

pueda ser visto o instanciado por otras aplicaciones.

Sintaxis.

{Private} {Friensd} –Nombre Campo {As-Tipo Dato-}

Ejemplo.

Podemos crear un par de campos que almacenen el cálculo de los impuestos.

Private IES As Single.

Private Irenta As Single.

Enumeraciones

Una enumeracion es una esrtructura de datos persinalizasa que define un

conjunto de valores enteros. Por defecto, el primer dato enumerado empieza con

0, el segundo en 1, y así sucesivamente , aunque esto pueda cambiarse al

momento de definir la numeración.

Las numeraciones son útiles para dar claridad al programa y evitar errores de

asignación de variable, ya que si definimos una variable de tipo enumerada, el

valor que se pueda asignar está limitado por el rango de valores definidos en la

enumeración.

Sintaxis

{Public}{Private}{Protected}{Friend}{Enum- Nombre Enumeración-

-Elemento1-{Valor-}

-Elemento2-{Valor-}

-Elemento3-{Valor-}

End Enum

Ejemplo.

Vamos a crear dos enumeraciones, la primera que describa los cargos de los

Web Developer Microsoft.NET

Page 60: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

empleados que se usara desde otras clases y aplicaciones, y la segunda que

defina las áreas de la empresa para propósitos internos para trabajar con

información del empleado.

Public Enum Cargos

Auxiliar

Técnico

Ingeniero

Secretaria

Vendedor

End Enum Areas

Private Enum Areas

Gerencia-100

Contabilidad-200

Producción-300

Sistemas-400

Ventas-500

End Enum

Para usar estas enumeraciones creadas, ten solo basta declarar una variable de

estos tipos y asignarle un valor definido, por ejemplo para el caso anterior sería

como sigue.

Din Cargo As Cargos

Cargo- cargos. Vendedor

Dim Area As Areas

Area –Areas. Ventas.

Propiedades

Una propiedad es una característica del objeto que tiene información sobre un

cierto atributo de este como por ejemplo su nombre, descripción, etc.

Las propiedades son métodos que se trabajan como si fuesen campos. Con la

diferencia que el campo es interno solo para el uso de la clase, en cambio las

propiedades se usan fuera de la clase.

A diferencia de la versión anterior de Visual Basic que existan 3 estructuras para

declarar una propiedad {Property Get Let y Set}ahora en Visual Basic. NET

solo existe una estructura llamada Property donde internamente se define si la

propiedad es lectura {Get} y o estructura {Set} tal como se muestra abajo.

Web Developer Microsoft.NET

Page 61: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Sintaxis

{Tipo de Declaración} Property-Nombre{As Tipo Dato-}

{Read Only} Get

-Instrucciones-

Ensd Get}

{{Write Only} Set {By Val Value{ As- Tipo Dato}

-Instrucciones-

End Set}.

Existen muchas formas de declarar una propiedad, que explicamos en la sgte

tabla.

Declaración UsoDefault Indica que la propiedad es por defecto (no es

necesario escribirla) puede ser usada desde

cualquier clase o aplicaciónPrivate Solo puede ser accesada desde dentro de la claseProtected Se usa desde dentro de la clase o desde una clase

derivadaFriend Puede ser usada desde otras clases o desde una

clase derivadaProtected Puede ser usada desde otras clases componentes

pero no fuera.Protected Friend Tiene las características de la protegida y amiga,

es decir, se usa dentro de la clase, desde una clase

derivada o desde otra clase del mismo componente,

pero no en aplicaicones clientes.ReadOnly Indica que el valor de la propiedad solo puede ser

recuperado pero no escrito. Solo puede tener la

cláusula Set o no Get.Overloads Permite que la propiedad de la clase base sea

sobrecargada, es decir definida varias veces en las

clases derivadas pero con diferentes parámetros

que la propiedad definida en la clase BaseOverrides Permite sobrescribir la propiedad por otra

propiedad con el mismo nombre en una clase

derivadaOverridable Permite sobrescribir la propiedad por método con

Web Developer Microsoft.NET

Page 62: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

el mismo nombre en una clase derivadaNotOverridable Indica que la propiedad no puede ser sobrescrita

por nadie en ninguna clase derivadaMustOverride Indica que la propiedad no puede ser implementada

en esta clase y puede ser implementada en una

clase derivadaShadows Se usa para ocultar una propiedad de tal manera

que no pueda implementarse en una clase derivada.Shared Permite que la propiedad sea compartida y pueda

llamarse sin necesidad de instanciar a la clase sino

a través de su nombre.

Ejemplo

Para muestra clase Empleado, podemos implementar las propiedades código, nombre y

básico del empleado, de tal manera que se puedan leer y escribir en cualquier parte.

Private mvarCodigo As Integer

Private mvarNombr As String

Private mvarSueldo As Single

Public Property Codigo ( ) As Integer

Gat

Codigo = mvarCodigo

End Get

Set (ByVal Value As Integer)

mavCodigo = Value

end Set

End property

Public Property Nombre ( ) As String

Get

Nombre = mvarNombre

End Get

Set (ByVal Value As String)

Get

Nombre = mvarNombre

End Get

Set (ByVal Value As String)

mavNombre = Value

End Set

Web Developer Microsoft.NET

Page 63: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

End Property

Public Property Sueldo ( ) As Single

Get

Nombre = mvarSueldo

End Get

Set (ByVal Value As Stringle)

Get

mvarSueldo = Value

End Get

End Property

Métodos

Un método es un conjunto de instrucciones que modifica el estado de las propiedades en

términos de objetos, un método es un servicio o función del objeto, mientras que en

términos de código un método es un procedimiento o función que realiza una tarea

específica.

En Visual Basic. NET todos los miembros de una clase (propiedades, eventos, constructores,

destructores, etc.) son en realidad métodos, claro, estos últimos son métodos especiales.

Un procedimiento o función en una clase es un método, y sus características son las mismas

que cuando se encuentran en un módulo estándar, es decir, si es procedimiento de

declaración es con Sub, y si es función de declaración es con Function, tal como se muestra

en las sintaxis de abajo.

Sintaxis

[Tipo Declaración] [Sub | Funtion] <Nombre> ([Praram]) | As<Tipo Dato>

<Instrucciones>

[Exit [Sub Function]]

End Property

En cuanto al tipo de declaración, es muy similar al de las propiedades, que describimos

anteriormente en una tabla, es decir, puede declararse el método como Public. Private,

Protected, Friend, Protected Friend y Shadows.

También hay que recordar que si el método es una función siempre se deberá devolver un

valor que se puede hacer de dos formar: de manera clásica asignado un valor al nombre de la

función o de una nueva forma escribiendo sentencia return y el valor.

Web Developer Microsoft.NET

Page 64: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Ejemplo

En nuestro ejemplo de Empleado, podemos implementar dos métodos públicos, uno que

permita asignar valores a las propiedades creadas: código, nombre y sueldo del empleado y

otro método que permita actualizar el sueldo.

Eventos

Un evento es un suceso que le ocurre al objeto y que le indica o notifica sobre un cambio en

sus atributos o propiedades. Un evento es necesario para controlar el estado de las

propiedades e informar a las aplicaciones del nuevo estado, para que estas realicen la acción

correspondiente.

Es fácil entender eventos asociados a objetos como los controles, por ejemplo en el objeto

“Button” se tiene el evento “Click” que se desencadena al seleccionar el botón, el evento

“MouseMove” que ocurre al pasar el mouse por el botón. Y así hay muchos eventos

asociados al objeto botón; pero, cuando trabajamos con clases, los eventos son más

abstractos y un poco más difíciles de entender, ya que podía confundirse con los métodos.

Para aclarar el concepto de eventos definamos mentalmente una clase llamada “Cuenta”

para un componente llamado “Banco”. Esta clase cuenta tiene propiedades como

“NumeroCta”, “FechaApertura”, “TipoCta”, “NumeroTarjeta” y “Saldo”. Ademas tiene

métodos como “Depósito”, “Retiro” y “Transparencia” que modifican el estado del saldo.

Cuando hacemos un “Retiro” de nuestra cuenta donde el monto a retirar supera al “Saldo”

se desencadena un evento llamado “SaldoInsuficiente” y también cuando durante el dia

hemos retirado mas del monto permitido se desencadena el evento

“LimiteretiroDiario”

para crear un evento en la clase primero declare el evento con la sentencia “Event” y luego

llamase con “RaiseEvent”,tal como se muestra en la sintaxis.

Declaración Sintaxis.

[Tipo Declaracion]Event <Nombre>([Parámetro(s)]

Declaración Llamada:

RaiseEvent <Nombre>([Parámetro(s)]

El tipo de declaración, es igual que la de los metodos , es decir, puede ser Public, Private,

Protected, Friend y Shadows

Web Developer Microsoft.NET

Page 65: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Ejemplo:

Crear dos ventos que nos informe cuando el sueldo es bajo o alto; para nuestra realidad un

sueldo bajo cuando es menos a 500 y alto cuando se mayor a 300.

Public Event SueldoBajo()

Public Event SueldoAlto()

Private sub ChequearSueldo()

If mvarSueldo<500 then

RaiseEvent SueldoBajo()

Else

RaiseEvent SueldoAlto()

End if

End sub

Para finalizar, deberiamos llamar a la rutina “ChequearSueldo” al final de “CrearEmpleado”

y “ActualizarSueldo” que se modifica el “Sueldo”

ARQUITECTURA LOGICA

CAPA PRESENTACIÓN

Web Developer Microsoft.NET

Page 66: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

CAPA NEGOCIO

CAPA SERVICIO

CAPA DE DATOS

Web Developer Microsoft.NET

Page 67: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

EJERCICIOS RESUELTOS

1) Calculadora

Public Class Calculadora.vb Inherits System.Windows.Forms.Form

Dim clearDisplay As Boolean Dim Operand1 As Double, Operand2 As Double Dim Operator As String

Private Sub bttn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttn0.Click, bttn1.Click, bttn2.Click, _ bttn3.Click, bttn4.Click, bttn5.Click, bttn6.Click, bttn7.Click, bttn8.Click, bttn9.Click If clearDisplay Then lblDisplay.Text = "" clearDisplay = False End If lblDisplay.Text = Val(lblDisplay.Text + sender.text) End Sub

Web Developer Microsoft.NET

Page 68: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Private Sub bttnPeriod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnPeriod.Click If lblDisplay.Text.IndexOf(".") > 0 Then MsgBox(lblDisplay.Text.IndexOf(".")) Exit Sub Else MsgBox(lblDisplay.Text.IndexOf(".")) lblDisplay.Text = lblDisplay.Text & "." End If End Sub

Private Sub bttnPlus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnPlus.Click Operand1 = Val(lblDisplay.Text) Operator = "+" clearDisplay = True End Sub

Private Sub bttnEquals_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnEquals.Click Dim result As Double Operand2 = Val(lblDisplay.Text) Try Select Case Operator Case "+" result = Operand1 + Operand2 Case "-" result = Operand1 - Operand2 Case "*" result = Operand1 * Operand2 Case "/" If Operand2 <> "0" Then result = Operand1 / Operand2 ' lblDisplay.Text = result End Select Catch exc As Exception MsgBox(exc.Message) result = "ERROR" Finally lblDisplay.Text = result clearDisplay = True End TryEnd Sub

Private Sub bttnMinus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnMinus.Click Operand1 = Val(lblDisplay.Text) Operator = "-" clearDisplay = True ' lblDisplay.Text = "" End Sub

Private Sub bttnMultiply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnMultiply.Click Operand1 = Val(lblDisplay.Text) Operator = "*" clearDisplay = True End Sub

Web Developer Microsoft.NET

Page 69: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Private Sub bttnDivide_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnDivide.Click Operand1 = Val(lblDisplay.Text) Operator = "/" clearDisplay = True End Sub

Private Sub CalculatorForm_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress If System.Char.IsDigit(e.KeyChar) Or e.KeyChar = "." Then If clearDisplay Then lblDisplay.Text = "" clearDisplay = False End If lblDisplay.Text = lblDisplay.Text + e.KeyChar End If End Sub Private Sub bttnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnClear.Click lblDisplay.Text = "" End SubEnd Class

2) Ejercicio de Menús

Imports System.Drawing.Drawing2DPublic Class Menu Inherits System.Windows.Forms.FormDim ctlMDI As MdiClient

Web Developer Microsoft.NET

Page 70: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Private Sub Menu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load StatusBarPanel3.Text = "0 Docs" StatusBarPanel3.ToolTipText = "Numero de Documentos Abiertos" StatusBarPanel4.Text = Date.Now.ToLongTimeString StatusBarPanel4.ToolTipText = Date.Today.ToLongDateString 'Me.BackgroundImage = BackgroundImage.FromFile("C:\Program Files\Common Files\Crystal Decisions\1.0\SSChart\Textures\Mezclado brillante\richaquagranite2.bmp") Iniciar_Boton(False) cambiar_fodo() End Sub

Private Sub Menu_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize If Not (Me.ctlMDI Is Nothing) Then Me.PintarFondo(Me.ctlMDI, New PaintEventArgs(Me.ctlMDI.CreateGraphics, New Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size))) End If End Sub Sub cambiar_fodo() Dim ctl As Control 'Estamos buscando en control que representa el area cliente MDI For Each ctl In Me.Controls Try ctlMDI = CType(ctl, MdiClient) ' Asignamos el color de fondo ctlMDI.BackColor = Color.AntiqueWhite

'Aquí asignamos el manejador para pintar el fondo con degradados o lo que 'queramos. Si solo queremos cambiar el color de fondo no hace falta, ni las funciones siguientes tampoco AddHandler ctlMDI.Paint, AddressOf PintarFondo Catch ex As InvalidCastException End Try Next End Sub

Private Sub PintarFondo(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Dim GradientePanel As New LinearGradientBrush(New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height), Color.Blue, Color.Black, LinearGradientMode.Vertical) e.Graphics.FillRectangle(GradientePanel, New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height)) End Sub

Public Sub Menu_mdichildactivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MdiChildActivate If n = 0 Then StatusBarPanel1.Text = "" Else StatusBarPanel1.Text = Me.ActiveMdiChild.Text End If End Sub

Public Sub validar_Boton_Menu(ByVal Habilitado As Boolean) mnuArchivo_Grabar.Enabled = Habilitado ToolBarButton3.Enabled = Habilitado mnuEdicion.Enabled = Habilitado

Web Developer Microsoft.NET

Page 71: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

mnuFormato.Enabled = Habilitado End Sub

Public Sub Validar_Copiar_cortar(ByVal Habilitado As Boolean) mnuEdicion_Copiar.Enabled = Habilitado mnuEdicion_Cortar.Enabled = Habilitado ToolBarButton4.Enabled = Habilitado ToolBarButton5.Enabled = Habilitado End Sub

Public Sub validar_pegar(ByVal Habilitado As Boolean) mnuEdicion_Pegar.Enabled = Habilitado ToolBarButton6.Enabled = Habilitado End Sub

Public Sub Iniciar_Boton(ByVal Habilitado As Boolean) validar_Boton_Menu(Habilitado) Validar_Copiar_cortar(Habilitado) validar_pegar(Habilitado) End Sub

Private Sub mnuArchivo_Nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuArchivo_Nuevo.Click Dim x As New Form2() n += 1 x.MdiParent = Me x.Text = "documento" & n.ToString x.Show() StatusBarPanel3.Text = n.ToString & "Docs" Iniciar_Boton(True) End Sub

Sub mnuArchivo_Abrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuArchivo_Abrir.Click With odgEditor .Title = "Abrir archivo de texto enriquecido" .Filter = "Archivo de Texto enriquecido (*.rtf)|*.rtf" If .ShowDialog = DialogResult.OK And .FileName <> "" Then mnuArchivo_Nuevo.PerformClick() Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl x.LoadFile(.FileName) Cambiar_Nombre(.FileName) End If End With End Sub Public Sub Cambiar_Nombre(ByVal Nombre As String) Me.ActiveMdiChild.Text = Nombre StatusBarPanel1.Text = Nombre End Sub

Private Sub mnuArchivo_Grabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuArchivo_Grabar.Click With sdgEditor .Title = "Guardar archivo enriquecido" .Filter = "Archivo de Texto enriquecido)*.rtf)|*.rtf" If .ShowDialog = DialogResult.OK And .FileName <> "" Then Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl

Web Developer Microsoft.NET

Page 72: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

x.SaveFile(.FileName) Cambiar_Nombre(.FileName) End If End With End Sub

Private Sub mnuEdicion_Copiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEdicion_Copiar.Click Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl Clipboard.SetDataObject(x.SelectedText) End Sub

Private Sub mnuEdicion_Cortar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEdicion_Cortar.Click Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl Clipboard.SetDataObject(x.SelectedText) x.SelectedText = "" End Sub

Private Sub mnuEdicion_Pegar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEdicion_Pegar.Click Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl Dim iData As IDataObject = Clipboard.GetDataObject If iData.GetDataPresent(DataFormats.Text) Then x.SelectedText = iData.GetData(DataFormats.Text) End If End Sub

Private Sub mnuFormato_Fondo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFormato_Fondo.Click Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl With cdgEditor If .ShowDialog = DialogResult.OK Then x.BackColor = .Color End If End With End Sub

Private Sub mnuFormato_Fuente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFormato_Fuente.Click Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl With fdgEditor If .ShowDialog = DialogResult.OK Then x.ForeColor = .Color ' x.Font = .Font x.SelectionFont = .Font 'x.SelectionColor = .Color End If End With End Sub

Private Sub mnuVentana_Horizontal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuVentana_Horizontal.Click Me.LayoutMdi(MdiLayout.TileHorizontal) End Sub

Web Developer Microsoft.NET

Page 73: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Private Sub mnuVentana_Vertical_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuVentana_Vertical.Click Me.LayoutMdi(MdiLayout.TileVertical) End Sub

Private Sub mnuVentana_Cascada_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuVentana_Cascada.Click Me.LayoutMdi(MdiLayout.Cascade) End Sub

Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case e.Button.ImageIndex Case 0 mnuArchivo_Nuevo.PerformClick() Case 1 mnuArchivo_Abrir.PerformClick() Case 2 mnuArchivo_Grabar.PerformClick() Case 3 mnuEdicion_Copiar.PerformClick() Case 4 mnuEdicion_Pegar.PerformClick() Case 5 mnuEdicion_Cortar.PerformClick()

End Select End Sub

Private Sub MenuItem9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem9.Click End End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick StatusBarPanel2.Text = Date.Now.ToLongTimeString End SubEnd Class

FrmDocumento.vb

Web Developer Microsoft.NET

Page 74: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Public Class frmDocumento Inherits System.Windows.Forms.Form

Private Sub mnuCortar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCortar.Click Clipboard.SetDataObject(RichTextBox1.SelectedText) RichTextBox1.SelectedText = "" End Sub

Private Sub mnuCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCopiar.Click Clipboard.SetDataObject(RichTextBox1.SelectedText) End Sub

Private Sub mnuPegar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPegar.Click Dim iData As IDataObject = Clipboard.GetDataObject If iData.GetDataPresent(DataFormats.Text) Then RichTextBox1.SelectedText = iData.GetData(DataFormats.Text) End If End Sub Private Sub frmDocumento_closed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Closed n -= 1 End SubEnd Class

Web Developer Microsoft.NET

Page 75: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

3) El objetivo de este ejercicio es como trabajar con Dataset y Generar XML

Public Class FrmXML Inherits System.Windows.Forms.Form

Private Sub FrmData_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ds = New DataSet() ds.Tables.Add("producto") ds.Tables(0).Columns.Add("Codigo") ds.Tables(0).Columns.Add("Nombre") ds.Tables(0).Columns.Add("Descripcion") 'campo idproducto ds.Tables(0).Columns(0).AllowDBNull = False 'no permite nulos ds.Tables(0).Columns(0).DataType = Type.GetType("System.String") ds.Tables(0).Columns(0).MaxLength = 6 'campo nomproducto ds.Tables(0).Columns(1).DataType = Type.GetType("System.String") ds.Tables(0).Columns(1).MaxLength = 20 'campo descproducto ds.Tables(0).Columns(2).DataType = Type.GetType("System.String") ds.Tables(0).Columns(2).MaxLength = 40 'definimos llaves primarias Dim keys(0) As DataColumn keys(0) = ds.Tables(0).Columns(0) ds.Tables(0).PrimaryKey = keys End Sub

Private Sub cmdagregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdagregar.Click On Error GoTo ErrorCtx Dim rw As DataRow rw = ds.Tables(0).NewRow

Web Developer Microsoft.NET

Page 76: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

rw("Codigo") = txtcodigo.Text rw("Nombre") = txtnombre.Text rw("Descripcion") = txtdesc.Text ds.Tables(0).Rows.Add(rw) rw = Nothing DataGrid1.DataSource = ds.Tables(0) Exit SubErrorCtx: MsgBox(Err.Description, MsgBoxStyle.Information + MsgBoxStyle.OKOnly) End Sub

Private Sub cmdverxml_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdverxml.Click Dim frm As ver frm = New ver() frm.Show() End Sub

Private Sub cmdsalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Me.Close() End Sub

Private Sub cmdNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNuevo.Click Dim obj As Control For Each obj In Me.GroupBox1.Controls If TypeOf obj Is TextBox Then obj.Text = "" Next txtcodigo.Focus() End SubEnd Class

Public Class verXML

Web Developer Microsoft.NET

Page 77: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Inherits System.Windows.Forms.Form

Private Sub cmdsalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsalir.Click Me.Close() End Sub

Private Sub verXML_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load txtver.Text = ds.GetXml txtver.ForeColor = Color.Blue End SubEnd Class

4)

Web Developer Microsoft.NET

Page 78: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Public Class Frmmant Inherits System.Windows.Forms.Form

Web Developer Microsoft.NET

Page 79: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Public strconexion As String = "data source=(local);initial catalog=northwind;integrated security=SSPI;persist security info =false;workstation id=GESTION;packet size=4096"

Private Sub Frmmant_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cargar() End Sub

Public Sub insertarRegion() Dim strsql As String Dim strconn As String ' Dim da As SqlClient.SqlDataAdapter Dim db As SqlClient.SqlCommandBuilder Dim ds As DataSet Dim rw As DataRow ' strsql = "select * from region" da = New SqlClient.SqlDataAdapter(strsql, strconexion) db = New SqlClient.SqlCommandBuilder(da) ds = New DataSet ' da.Fill(ds, "Region") rw = ds.Tables("Region").NewRow rw("RegionID") = txtid.Text rw("RegionDescription") = txtterritorio.Text ds.Tables("region").Rows.Add(rw) da.Update(ds, "Region") End Sub ' Public Sub cargar() Dim strsql As String Dim strconn As String ' Dim da As SqlClient.SqlDataAdapter ' Dim ds As DataSet ' strsql = "select * from region" da = New SqlClient.SqlDataAdapter(strsql, strconexion) ds = New DataSet da.Fill(ds, "Regiones") dtgrid.DataSource = ds.Tables(0) End Sub ' Public Sub modificar() Dim strsql As String ' Dim da As SqlClient.SqlDataAdapter Dim db As SqlClient.SqlCommandBuilder Dim ds As DataSet Dim rw As DataRow Dim cadena(0) As Object ' strsql = "select * from region" ' da = New SqlClient.SqlDataAdapter(strsql, strconexion)

Web Developer Microsoft.NET

Page 80: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

db = New SqlClient.SqlCommandBuilder(da) ds = New DataSet ds.Tables.Add("region") da.Fill(ds, "region") ' cadena(0) = txtid.Text Dim keys(0) As DataColumn keys(0) = ds.Tables(0).Columns(0) ' ds.Tables(0).PrimaryKey = keys rw = ds.Tables("region").Rows.Find(cadena) rw("RegionDescription") = txtterritorio.Text da.Update(ds, "region") dtgrid.DataSource = ds.Tables(0) End Sub

Private Sub cmdSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSalir.Click End End Sub

Private Sub cmdagregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdagregar.Click cmdfunciones.Text = "&Insertar" tbcontrol.SelectedIndex = 1 End Sub

Private Sub cmdcancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdcancelar.Click tbcontrol.SelectedIndex = 0 End Sub

Private Sub cmdfunciones_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdfunciones.Click Select Case cmdfunciones.Text Case "&Actualizar" modificar() Case "&Insertar" insertarRegion() cargar() End Select End Sub

Private Sub cmdModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdModificar.Click cmdfunciones.Text = "&Actualizar" tbcontrol.SelectedIndex = 1 txtid.Text = dtgrid.Item(dtgrid.CurrentRowIndex, 0) txtterritorio.Text = dtgrid.Item(dtgrid.CurrentRowIndex, 1) End Sub

5)

Web Developer Microsoft.NET

Page 81: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Public Class frmEmpleadoDatos Inherits System.Windows.Forms.Form

Const Nuevo = 1 Const Modificar = 2 Const Eliminar = 3 Dim operacion As Integer Dim tblempleado As New DataTable("Empleados") Dim WithEvents cmrEmpleado As CurrencyManager

Private Sub ConfigurarEnlazarTabla() With tblempleado .Columns.Add(New DataColumn("LastName", GetType(System.String))) .Columns.Add(New DataColumn("FirstName", GetType(System.String))) .Columns.Add(New DataColumn("Birthdate", GetType(System.DateTime))) End With cmrEmpleado = CType(Me.BindingContext(tblempleado), CurrencyManager) End Sub

Sub limpiarTextos() txtLastName.Clear() txtFirstName.Clear() txtBirthDate.Clear() End Sub

Sub Mostrar_Data() If cmrEmpleado.Position > -1 Then Dim fila As DataRow = tblempleado.Rows(cmrEmpleado.Position) txtLastName.Text = fila("LastName") txtFirstName.Text = fila("FirstName") txtBirthDate.Text = fila("BirthDate") gbxPosicion.Text = cmrEmpleado.Position + 1 & "/" & cmrEmpleado.Count End If End Sub

Private Sub Editar(ByVal vEstado As Boolean) txtLastName.Enabled = vEstado txtFirstName.Enabled = vEstado txtBirthDate.Enabled = vEstado

Web Developer Microsoft.NET

Page 82: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

btnNuevo.Enabled = Not vEstado btnModificar.Enabled = Not vEstado btnGrabar.Enabled = vEstado btnEliminar.Enabled = Not vEstado

btnInicio.Enabled = Not vEstado btnAnterior.Enabled = Not vEstado btnSiguiente.Enabled = Not vEstado btnUltimo.Enabled = Not vEstado End Sub

Private Sub frmEmpleadoDatos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ConfigurarEnlazarTabla() Mostrar_Data() Editar(False) End Sub

Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click operacion = Nuevo limpiarTextos() Editar(True) End Sub

Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click operacion = Modificar Editar(True) End Sub

Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click Select Case operacion Case Nuevo Dim fila As DataRow fila = tblempleado.NewRow() fila("LastName") = txtLastName.Text fila("FirstName") = txtFirstName.Text fila("BirthDate") = txtBirthDate.Text tblempleado.Rows.Add(fila) MessageBox.Show("Registro Grabado", "Aviso") Editar(False) Mostrar_Data() Case Modificar Dim fila As DataRow = tblempleado.Rows(cmrEmpleado.Position) fila.BeginEdit() fila("LastName") = txtLastName.Text fila("FirstName") = txtFirstName.Text fila("BirthDate") = txtBirthDate.Text fila.EndEdit() Editar(False) End Select End Sub

Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click

Web Developer Microsoft.NET

Page 83: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

operacion = Eliminar If MessageBox.Show("?Seguro de eliminar?", "Borrar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = DialogResult.Yes Then Dim fila As DataRow = tblempleado.Rows(cmrEmpleado.Position) tblempleado.Rows.Remove(fila) MessageBox.Show("Registro eliminado", "Aviso") Mostrar_Data() End If End Sub

Private Sub btnInicio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInicio.Click cmrEmpleado.Position = 0 End Sub

Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click If cmrEmpleado.Position > 0 Then cmrEmpleado.Position -= 1 End Sub

Private Sub btnSiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSiguiente.Click If cmrEmpleado.Position < cmrEmpleado.Count - 1 Then cmrEmpleado.Position += 1 End Sub

Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click cmrEmpleado.Position = cmrEmpleado.Count - 1 End Sub Private Sub cmrEmpleado_PositionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmrEmpleado.PositionChanged Mostrar_Data() End SubEnd Class

6) Acceso a datos - Construir un Windows Form con maestro / detalle

Web Developer Microsoft.NET

Page 84: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Este ejemplo le muestra cómo construir una aplicación con tablas maestro / detalle. Este tipo común de formulario vinculado a datos es útil para navegar a través de los registros y ver diferentes niveles de detalles para los datos relacionados con cada registro.

- Para este ejemplo utilizaremos con tabla Maestra Orders y otra tabla será Order Details como el detalle.

- Navegue hacia adelante y hacia atrás a través de los registros. Utilizando también las teclas direccionales o las teclas Inicio/Fin.

Option Strict OnImports System.Data.SqlClient

Public Class frmMain Inherits System.Windows.Forms.Form ' Inicializar la Connección con la Base de Datos ' y displayar el error de la conexión Protected Const CONNECTION_ERROR_MSG As String = _ "To run this sample, you must have SQL " & _ "or MSDE with the Northwind database installed. For " & _ "instructions on installing MSDE, view the ReadMe file."

Protected Const MSDE_CONNECTION_STRING As String = _ "Server=(local)\NetSDK;" & _ "DataBase=northwind;" & _ "Integrated Security=SSPI"

Protected Const SQL_CONNECTION_STRING As String = _ "Server=localhost;" & _ "DataBase=northwind;" & _ "Integrated Security=SSPI"

Protected DidPreviouslyConnect As Boolean = False Private dsEmployeeOrders As DataSet Private dtEmployee As DataTable

Web Developer Microsoft.NET

Page 85: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Private dtOrders As DataTable Private dtOrderDetails As DataTable Private dtSales As DataTable Private dvOrders As DataView Private dvOrderDetails As DataView Private dvSales As DataView Private sda As SqlDataAdapter Protected strConn As String = MSDE_CONNECTION_STRING

' Maneja el evento click de los botones

Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click ' Mueve al primer registro FirstRecord() End Sub

Private Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLast.Click ' Mueve al ultimo Registro LastRecord() End Sub

Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click ' Mueve al siguiente Registro NextRecord() End Sub

Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevious.Click ' Mueve al registro anterior PreviousRecord() End Sub

Protected Sub dtEmployee_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs) BindOrdersGrid() BindOrderDetailsGrid() ShowTotalSales() ShowCurrentRecordNumber() End Sub

Private Sub frmMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

If e.KeyCode = Keys.Right Then NextRecord() If e.KeyCode = Keys.Left Then PreviousRecord() If e.KeyCode = Keys.Home Then FirstRecord() If e.KeyCode = Keys.End Then LastRecord() End Sub

' En el evento Load Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load CreateDataSet() InitializeBindings()

Web Developer Microsoft.NET

Page 86: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

BindOrdersGrid() BindOrderDetailsGrid() ShowCurrentRecordNumber() End Sub

Private Sub grdOrders_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles grdOrders.Click ' Enlaza la tabla order detalle del grid en base a la seleccion en el grid grdOrders. BindOrderDetailsGrid() End Sub

Private Sub grdOrders_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles grdOrders.CurrentCellChanged ' Highlight the entire row for user feedback. grdOrders.Select(grdOrders.CurrentCell.RowNumber) ' Bind the Order Details grid based on the selection in grdOrders. BindOrderDetailsGrid() End Sub

' Bind and format the Order Details grid based on the user's current selection ' in the Orders grid. Sub BindOrderDetailsGrid()

Dim strCurrentOrderID As String = _ dvOrders(grdOrders.CurrentRowIndex)("OrderID").ToString ' Filter the OrderDetails data based on the currently selected OrderID. dvOrderDetails.RowFilter = "OrderID = " & strCurrentOrderID

With grdOrderDetails .CaptionText = "Order# " & strCurrentOrderID .DataSource = dvOrderDetails End With

' You must clear out the TableStyles collection before grdOrderDetails.TableStyles.Clear()

Dim grdTableStyle1 As New DataGridTableStyle() With grdTableStyle1 .MappingName = dvOrderDetails.Table.TableName End With

Dim grdColStyle1 As New DataGridTextBoxColumn() With grdColStyle1 .MappingName = "ProductName" .HeaderText = "Product" .Width = 175 End With

Dim grdColStyle2 As New DataGridTextBoxColumn() With grdColStyle2 .MappingName = "UnitPrice" .HeaderText = "Price" ' Format the data as currency. .Format = "c" .Width = 75 End With

Web Developer Microsoft.NET

Page 87: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Dim grdColStyle3 As New DataGridTextBoxColumn() With grdColStyle3 .MappingName = "Quantity" .HeaderText = "Quantity" .Width = 75 End With

Dim grdColStyle4 As New DataGridTextBoxColumn() With grdColStyle4 .MappingName = "SubTotal" .HeaderText = "Sub Total" ' Format the data as currency. .Format = "c" .Width = 75 End With

Dim grdColStyle5 As New DataGridTextBoxColumn() With grdColStyle5 .MappingName = "Discount" .HeaderText = "Discount" ' Format the data to display as an integer percentage. If the 0 was ' left off the default precision of two decimal places would be used. .Format = "P0" .Width = 50 End With

Dim grdColStyle6 As New DataGridTextBoxColumn() With grdColStyle6 .MappingName = "CategoryName" .HeaderText = "Category" .Width = 125 End With

' Add the column style objects to the table style's collection of ' column styles. Without this the styles do not take effect. grdTableStyle1.GridColumnStyles.AddRange _ (New DataGridColumnStyle() {grdColStyle1, grdColStyle2, _ grdColStyle3, grdColStyle4, grdColStyle5, grdColStyle6})

grdOrderDetails.TableStyles.Add(grdTableStyle1) End Sub

' Bind and format the Orders grid based on the user's current Employee selection. Sub BindOrdersGrid() ' Filter the Orders data based on the value of the Tag property bound ' earlier. The tag contains the EmployeeID. dvOrders.RowFilter = "EmployeeID = " & txtLastName.Tag.ToString

With grdOrders .CaptionText = "Orders" .DataSource = dvOrders End With

' You must clear out the TableStyles collection before grdOrders.TableStyles.Clear()

Dim grdTableStyle1 As New DataGridTableStyle()

Web Developer Microsoft.NET

Page 88: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

With grdTableStyle1 .MappingName = dvOrders.Table.TableName End With

Dim grdColStyle1 As New DataGridTextBoxColumn() With grdColStyle1 .MappingName = "OrderID" .HeaderText = "Order ID" .Width = 50 End With

Dim grdColStyle2 As New DataGridTextBoxColumn() With grdColStyle2 .MappingName = "CompanyName" .HeaderText = "Customer" .Width = 140 End With

Dim grdColStyle3 As New DataGridTextBoxColumn() With grdColStyle3 .MappingName = "OrderDate" ' Format the data as a date. This removes the time from the DateTime Sql ' data type. .Format = "d" .HeaderText = "Order Date" .Width = 75 End With

Dim grdColStyle4 As New DataGridTextBoxColumn() With grdColStyle4 .MappingName = "Total" .HeaderText = "Total" ' Format the data as currency. .Format = "c" .Width = 75 End With grdTableStyle1.GridColumnStyles.AddRange _ (New DataGridColumnStyle() {grdColStyle1, grdColStyle2, _ grdColStyle3, grdColStyle4}) grdOrders.TableStyles.Add(grdTableStyle1) End Sub Sub CreateDataSet() Dim frmStatusMessage As New frmStatus() If Not DidPreviouslyConnect Then frmStatusMessage.Show("Connecting to MSDE") End If Dim IsConnecting As Boolean = True While IsConnecting Try Dim scnnNW As New SqlConnection(strConn) Dim strSQL As String = _ "SELECT EmployeeID, LastName, FirstName, HireDate " & _ "FROM Employees"

' A SqlCommand object is used to execute the SQL commands. Dim scmd As New SqlCommand(strSQL, scnnNW)

Web Developer Microsoft.NET

Page 89: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

' A SqlDataAdapter uses the SqlCommand object to fill a DataSet. sda = New SqlDataAdapter(scmd)

' A SqlCommandBuilder automatically generates the SQL commands needed ' to update the database later (in the btnSave_Click event handler). Dim scb As New SqlCommandBuilder(sda)

scb.GetUpdateCommand()

' Create a new DataSet and fill its first DataTable. dsEmployeeOrders = New DataSet() sda.Fill(dsEmployeeOrders, "Employee") ' Reset the CommandText to get the Employee orders. scmd.CommandText = _ "SELECT od.OrderID, SUM(CONVERT(money, (od.UnitPrice * " & _ " od.Quantity) * (1 - od.Discount) / 100) * 100) " & _ " AS Total, o.EmployeeID, o.OrderDate, " & _ " c.CompanyName" & vbCrLf & _ "FROM [Order Details] od " & _ " INNER JOIN Orders o " & _ " ON od.OrderID = o.OrderID" & vbCrLf & _ " INNER JOIN Customers c " & _ " ON o.CustomerID = c.CustomerID" & vbCrLf & _ "GROUP BY od.OrderID, o.EmployeeID, o.OrderDate, c.CompanyName"

' Fill the second table in the DataSet. sda.Fill(dsEmployeeOrders, "Orders")

' Reset the CommandText to get the Employee Sales-To-Date. scmd.CommandText = _ "SELECT e.employeeid, sum(UnitPrice * Quantity) as " & _ " 'SalesToDate' " & _ "FROM [order details] od " & _ " INNER JOIN orders o " & _ " ON o.orderid = od.orderid " & _ " INNER JOIN employees e " & _ " ON e.employeeid = o.employeeid" & vbCrLf & _ "GROUP BY e.employeeid"

' Fill the third table in the DataSet. sda.Fill(dsEmployeeOrders, "Sales")

' Reset the CommandText to get the Order details. scmd.CommandText = _ "SELECT od.OrderID, od.UnitPrice, od.Quantity, od.Discount, " & _ " p.ProductName, c.CategoryName, " & _ " (od.UnitPrice * od.Quantity) As SubTotal " & _ "FROM [order details] od " & _ " INNER JOIN Products p ON od.ProductID = p.ProductID " & _ " INNER JOIN Categories c ON c.CategoryID = p.CategoryID " & _ "ORDER BY od.OrderID"

' Fill the fourth table in the DataSet. sda.Fill(dsEmployeeOrders, "OrderDetails")

' Set variables for the DataTables for use later. dtEmployee = dsEmployeeOrders.Tables(0)

Web Developer Microsoft.NET

Page 90: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

dtOrders = dsEmployeeOrders.Tables(1) dtSales = dsEmployeeOrders.Tables(2) dtOrderDetails = dsEmployeeOrders.Tables(3)

' Set up DataViews for the DataGrids and SalesToDate ' TextBox. dvOrders = dtOrders.DefaultView dvOrderDetails = dtOrderDetails.DefaultView dvSales = dtSales.DefaultView IsConnecting = False DidPreviouslyConnect = True frmStatusMessage.Close()

Catch expSql As SqlException If strConn = MSDE_CONNECTION_STRING Then ' Couldn't connect to SQL Server. Now try MSDE. strConn = SQL_CONNECTION_STRING frmStatusMessage.Show("Connecting to SQL Server") Else ' Unable to connect to SQL Server or MSDE frmStatusMessage.Close() MsgBox(CONNECTION_ERROR_MSG, MsgBoxStyle.Critical, Me.Text) End End If

Catch exp As Exception MsgBox(exp.Message, MsgBoxStyle.Critical, Me.Text) Exit Sub

End Try frmStatusMessage.Close() End While End Sub

' Handle the Format event for the Hire Date TextBox Protected Sub DateToString(ByVal sender As Object, ByVal e As ConvertEventArgs) e.Value = CType(e.Value, DateTime).ToShortDateString End Sub

' Move the BindingContext Position to the first record. Public Sub FirstRecord() Me.BindingContext(dtEmployee).Position = 0 End Sub

' Set up all the bindings for various controls. Private Sub InitializeBindings() txtLastName.DataBindings.Add("Text", dtEmployee, "LastName") txtLastName.DataBindings.Add("Tag", dtEmployee, "EmployeeID") txtFirstName.DataBindings.Add("Text", dtEmployee, "FirstName") Dim dbnHireDate As New Binding("Text", dtEmployee, "HireDate") txtHireDate.DataBindings.Add(dbnHireDate) ' If you are using custom format/parse handlers, add them next. AddHandler dbnHireDate.Format, AddressOf DateToString AddHandler dbnHireDate.Parse, AddressOf StringToDate

Dim dbnSalesToDate As New Binding("Text", dtSales, "SalesToDate") txtSalesToDate.DataBindings.Add(dbnSalesToDate)

Web Developer Microsoft.NET

Page 91: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

AddHandler dbnSalesToDate.Format, AddressOf MoneyToString AddHandler dbnSalesToDate.Parse, AddressOf StringToMoney AddHandler Me.BindingContext(dtEmployee).PositionChanged, _ AddressOf dtEmployee_PositionChanged End Sub

' Move the BindingContext Position to the last record. Public Sub LastRecord() ' The position of the binding context controls the "current record". ' Use dsEmployeeOrders("EmployeeInfo").Rows.Count to figure out the total ' number of records. -1 because position is zero based. Me.BindingContext(dtEmployee).Position = dtEmployee.Rows.Count - 1 End Sub

' Handle the Format event for the SalesToDate TextBox. Protected Sub MoneyToString(ByVal sender As Object, ByVal e As ConvertEventArgs) e.Value = CType(e.Value, Decimal).ToString("c") End Sub

' Move the BindingContext Position to the next record. Public Sub NextRecord() ' The position of the binding context controls the "current record" Me.BindingContext(dtEmployee).Position += 1 End Sub

' Move the BindingContext Position to the previous record. Public Sub PreviousRecord() ' The position of the binding context controls the "current record" Me.BindingContext(dtEmployee).Position -= 1 End Sub

' Display the current record number and total records. Protected Sub ShowCurrentRecordNumber() lblRecordNumber.Text = "Record " & _ Me.BindingContext(dtEmployee).Position + 1 & " of " & _ dtEmployee.Rows.Count End Sub

' Update the value of the Sales To Date for each employee as the user ' steps through the records. Protected Sub ShowTotalSales() ' Filter the sales total based on the value of the Tag property bound ' earlier. dvSales.RowFilter = "EmployeeID = " & txtLastName.Tag.ToString End Sub

' Handle the Parse event for the Hire Date TextBox. Protected Sub StringToDate(ByVal sender As Object, ByVal e As ConvertEventArgs) Try e.Value = CDate(e.Value) Catch exp As Exception MsgBox(exp.Message, MsgBoxStyle.Critical, Me.Text) End Try End Sub

' Handle the Parse event for the Sales To Date TextBox. Protected Sub StringToMoney(ByVal sender As Object, ByVal e As ConvertEventArgs)

Web Developer Microsoft.NET

Page 92: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Try ' Double is equivalent to a Money SQL data type. e.Value = CType(e.Value, Double) Catch exp As Exception MsgBox(exp.Message, MsgBoxStyle.Critical, Me.Text) End Try End SubEnd Class

7). Manejo de colecciónes de objetos y herencia

Objetivo: En este ejercicio permite crear colecciones de objetos y tener nociones de un trabajo con herencia de objetos.

Crear un proyecto windows .net denominado collecion y agregar un formulario denominado frmcolecciones luego diseñe el formulario:

a)

b.

c)

Web Developer Microsoft.NET

Page 93: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Agregar 3 clases al proyecto.• Cliente• Vendedor• Proveedor

Implementar el código en la clase cliente:

Public Class Cliente Private pcodigo As String Private pnombre As String Private pcorreo As String Private ptelefono As String Public Property codigo() As String Get Return pcodigo End Get Set(ByVal Value As String) pcodigo = Value End Set End Property

Public Property nombre() As String Get Return pnombre End Get Set(ByVal Value As String) pnombre = Value End Set End Property Public Property correo() As String Get Return pcorreo End Get Set(ByVal Value As String) pcorreo = Value

Web Developer Microsoft.NET

Page 94: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

End Set End Property Public Property telefono() Get Return ptelefono End Get Set(ByVal Value) ptelefono = Value End Set End PropertyEnd Class

Implementar el código en la clase proveedor

Public Class Proveedor Private pcodigo As String Private pnombre As String Private pRuc As String Public Property codigo() As String Get Return pcodigo End Get Set(ByVal Value As String) pcodigo = Value End Set End Property

Public Property nombre() As String Get Return pnombre End Get Set(ByVal Value As String) pnombre = Value End Set End Property Public Property Ruc() As String Get Return pRuc End Get Set(ByVal Value As String) pRuc = Value End Set End Property

End Class

Implementar el código en la clase vendedor

Public Class Vendedor Inherits Cliente Private pservice As String Public Property service() As String Get Return pservice End Get Set(ByVal Value As String) pservice = Value

Web Developer Microsoft.NET

Page 95: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

End Set End PropertyEnd Class

Implementar en los metodo:

Imports coleccionesHPublic Class frmColecciones Inherits System.Windows.Forms.Form Public lstcoleccion As New Collection() Private Sub cmdAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAgregar.Click tblControl.SelectedIndex = 0 End Sub

Private Sub cmdAgregarCliente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAgregarCliente.Click Dim obj As New Cliente() obj.codigo = txtCodigo.Text obj.nombre = txtNombre.Text obj.telefono = txtTelefono.Text obj.correo = txtCorreo.Text lstcoleccion.Add(obj) End Sub

Public Sub mostrar() Dim n As Integer Dim i As Integer Dim obj As New Object() Dim cli As New Cliente() Dim pro As New Proveedor() Dim vend As New Vendedor() lstListado.Items.Clear() n = lstcoleccion.Count

For i = 1 To n obj = lstcoleccion.Item(i) If obj.GetType Is cli.GetType Then lstListado.Items.Add(CType(obj, Cliente).codigo + "- Cliente") End If If obj.GetType Is pro.GetType Then lstListado.Items.Add(CType(obj, Proveedor).codigo + "- Proveedor") End If If obj.GetType Is vend.GetType Then lstListado.Items.Add(CType(obj, Vendedor).codigo + "- Vendedor") End If Next End Sub

Private Sub cmdagregarvend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdagregarvend.Click Dim obj As New Vendedor() obj.codigo = txtcodigovend.Text obj.nombre = txtnombrevend.Text obj.correo = txtcorreovend.Text

Web Developer Microsoft.NET

Page 96: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

obj.service = txtservicevend.Text lstcoleccion.Add(obj) mostrar() End Sub

Private Sub cmdAgregarProveedor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAgregarProveedor.Click Dim obj As New Proveedor() obj.codigo = txtcodigoprov.Text obj.nombre = txtnombreprov.Text obj.Ruc = txtRucProc.Text lstcoleccion.Add(obj) mostrar() End Sub

Private Sub cmdAddProveedor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAddProveedor.Click tblControl.SelectedIndex = 2 End Sub

Private Sub cmdagregarProv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdagregarProv.Click tblControl.SelectedIndex = 1 End Sub

Private Sub cmdSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSalir.Click Me.Close() End SubEnd Class

8) ARQUITECTURA EN CAPAS . NET

Web Developer Microsoft.NET

Page 97: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

LIBNETBusinessEntity (Proyecto Biblioteca de Clases)

Public Class CPedidoBE Private iIdLibro As Integer Private iCantidad As Integer

Public Property IdLibro() As Integer Get Return iIdLibro End Get Set(ByVal Value As Integer) iIdLibro = Value End Set End Property

Public Property IDCantidad() As Integer Get Return iCantidad End Get Set(ByVal Value As Integer) iCantidad = Value End Set End Property

End Class

LIBNETBusinessLogic (Proyecto Biblioteca de Clases)

Imports LIBNETBusinessEntityImports LIBNETData

Public Class CPedidoBT Public Function RegistrarPedido(ByVal oCPedido As CPedidoBE) Dim oCPedidoD As New CPedidoD() If (oCPedidoD.RegistrarPedido(oCPedido)) Then Dim oCLibroD As New CLibroD() oCLibroD.ActualizarStock(oCPedido) Return True Else Return False End If End Function

Public Function listarB(ByVal oCPedido As CPedidoBE) As DataSet Dim oCPedidoD As New CPedidoD() Dim ds As New DataSet() ds = oCPedidoD.listarD(oCPedido) Return ds End Function Public Function listarLibrosB(ByVal oCPedido As CPedidoBE) As DataSet Dim oCLibroD As New CLibroD() Dim ds As New DataSet() ds = oCLibroD.listarLibrosD(oCPedido) Return ds End Function

End Class

Web Developer Microsoft.NET

Page 98: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

• LIBNETData(Proyecto Biblioteca de Clases)

Clase Libro

Imports LIBNETBusinessEntityImports System.Data.SqlClient

Public Class CLibroD

Private sCadenaConexion As New SqlConnection("server=Aguero;database=bdventas;uid=sa;pwd=password") Dim SQLHelp As New SQLHelper()

Public Function ActualizarStock(ByVal oCPedido As CPedidoBE) As Boolean Dim iIdLibro As Integer = oCPedido.IdLibro Dim iCantidad As Integer = oCPedido.IDCantidad

Try SQLHelp.Ejecutar(sCadenaConexion, "usp_ActualizarStockLibro", iIdLibro, iCantidad) Return True

Catch

Return False End Try

End Function

Public Function listarLibrosD(ByVal oCPedido As CPedidoBE) As DataSet Dim ds As New DataSet() ds = SQLHelp.TraerDataset(sCadenaConexion, "sp_listarLibros") Return ds End Function

End Class

Clase Pedido

Imports LIBNETBusinessEntityImports System.Data.SqlClientPublic Class CPedidoD

Private sCadenaConexion As New SqlConnection("server=Aguero;database=bdventas;uid=sa;pwd=password") Dim SQLHelp As New SQLHelper()

Public Function RegistrarPedido(ByVal oCPedido As CPedidoBE) As Boolean Dim iIdLibro As Integer = oCPedido.IdLibro Dim iCantidad As Integer = oCPedido.IDCantidad

Try SQLHelp.Ejecutar(sCadenaConexion, "usp_AgregarPedido", iIdLibro, iCantidad) Return True

Catch

Web Developer Microsoft.NET

Page 99: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Return False End Try End Function Public Function listarD(ByVal oCPedido As CPedidoBE) As DataSet Dim ds As New DataSet() ds = SQLHelp.TraerDataset(sCadenaConexion, "sp_listarPedido") Return ds End FunctionEnd Class

Clase SQLHelper

Imports System.DataImports System.XmlImports System.Data.SqlClientImports System.Collections

Public Class SQLHelper

Shared mColComandos As New System.Collections.Hashtable()

Protected Function Comando(ByVal Cn As SqlConnection, ByVal procedimientoAlmacenado As String) As System.Data.IDbCommand Dim mComando As System.Data.SqlClient.SqlCommand If mColComandos.Contains(procedimientoAlmacenado) Then mComando = CType(mColComandos.Item(procedimientoAlmacenado), System.Data.SqlClient.SqlCommand) Else Cn.Open() mComando = New System.Data.SqlClient.SqlCommand(procedimientoAlmacenado, Cn) Dim mContructor As New System.Data.SqlClient.SqlCommandBuilder() mComando.Connection = Cn mComando.CommandType = CommandType.StoredProcedure mContructor.DeriveParameters(mComando) Cn.Close() mColComandos.Add(procedimientoAlmacenado, mComando) End If Return mComando End Function

Protected Sub CargarParametros(ByVal Comando As System.Data.IDbCommand, ByVal Args() As Object) Dim i As Integer With Comando For i = 0 To Args.GetUpperBound(0) Try CType(.Parameters(i + 1), System.Data.SqlClient.SqlParameter).Value = Args(i) Catch Qex As Exception 'Throw (Qex) MsgBox(Qex.Message) End Try Next End With End Sub

Web Developer Microsoft.NET

Page 100: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Protected Function CrearDataAdapter(ByVal Cn As SqlConnection, ByVal ProcedimientoAlmacenado As String, ByVal ParamArray Args() As Object) _ As System.Data.IDataAdapter

Dim mCom As System.Data.SqlClient.SqlCommand = Comando(Cn, ProcedimientoAlmacenado) If Not Args Is Nothing Then CargarParametros(mCom, Args) End If Return New System.Data.SqlClient.SqlDataAdapter(mCom) End Function

Public Overloads Function TraerDataset(ByVal Cn As SqlConnection, ByVal ProcedimientoAlmacenado As String, ByVal ParamArray Argumentos() As System.Object) _ As System.Data.DataSet Dim mDataset As New System.Data.DataSet() CrearDataAdapter(Cn, ProcedimientoAlmacenado, Argumentos).Fill(mDataset) Return mDataset End Function

Public Function TraerDataReader(ByVal Cn As SqlConnection, ByVal ProcedimientoAlmacenado As String, ByVal ParamArray Argumentos() As System.Object) _ As System.Data.IDataReader Dim mCom As System.Data.SqlClient.SqlCommand = Comando(Cn, ProcedimientoAlmacenado) Dim dr As SqlDataReader = Nothing Cn.Open() mCom.Connection = Cn mCom.CommandType = CommandType.StoredProcedure CargarParametros(mCom, Argumentos) dr = mCom.ExecuteReader() Return dr End Function

Public Function Ejecutar(ByVal Cn As SqlConnection, ByVal ProcedimientoAlmacenado As String, ByVal ParamArray Argumentos() As System.Object) As Integer Dim mCom As System.Data.SqlClient.SqlCommand = Comando(Cn, ProcedimientoAlmacenado) Dim Resp As Integer Cn.Open() mCom.Connection = Cn mCom.CommandType = CommandType.StoredProcedure CargarParametros(mCom, Argumentos) Resp = mCom.ExecuteNonQuery Cn.Close() Return Resp End Function

Public Function ExecuteXmlReader(ByVal myXmlQuery As String, ByVal Cn As SqlConnection) As XmlReader Dim mCom As SqlCommand = New SqlCommand(myXmlQuery, Cn) Cn.Open() Dim myXmlReader As System.Xml.XmlReader = mCom.ExecuteXmlReader() Return myXmlReader mCom.Parameters.Clear() End FunctionEnd Class

Web Developer Microsoft.NET

Page 101: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

• LIBNETWinSolucion

Imports LIBNETBusinessEntityImports LIBNETBusinessLogicImports System.Data.SqlClientPublic Class frmPedido Inherits System.Windows.Forms.Form

Private Sub btnRegistrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click Dim iIdLibro As Integer = CboLibro.SelectedValue Dim iCantidad As Integer = CInt(txtCantidad.Text) Dim oCPedido As New CPedidoBE() oCPedido.IDCantidad = iCantidad oCPedido.IdLibro = iIdLibro

Dim oCPedidoBT As New CPedidoBT()

If (oCPedidoBT.RegistrarPedido(oCPedido)) Then lblMensaje.Text = "Se registró el Pedido" Else lblMensaje.Text = "No se registró el Pedido" End If

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPedidos.Click Dim oCPedido As New CPedidoBE()

Dim oCPedidoBT As New CPedidoBT() Dim ds As New DataSet() ds = oCPedidoBT.listarB(oCPedido) DataGrid1.DataSource = ds.Tables(0).DefaultView

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim oCPedido As New CPedidoBE() Dim oCPedidoBT As New CPedidoBT() Dim ds As New DataSet() ds = oCPedidoBT.listarLibrosB(oCPedido) CboLibro.DataSource = ds.Tables(0).DefaultView CboLibro.DisplayMember = "Titulo" CboLibro.ValueMember = "IdLibro"

End Sub

End Class

Web Developer Microsoft.NET

Page 102: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Procedimientos Almacenados

CREATE PROCEDURE usp_AgregarPedido@IdLibro int,@Cantidad intasDeclare @Precio decimal (18,2)

Select @Precio = Precio From Librowhere IdLibro=@IdLibro

Insert Into Pedido(Fecha,IdLibro,Cantidad,Total) values(GetDate(),@IdLibro,@Cantidad,@Precio *@Cantidad)

CREATE PROCEDURE usp_ActualizarStockLibro@IdLibro int,@cantidad intAsUpdate Libro set Stock = Stock - @cantidad where idLibro =@IdLibro

Create proc sp_listarLibrosasselect IdLibro,Titulo from libro

Create proc sp_listarPedidoasSelect p.IdPedido,

Web Developer Microsoft.NET

Page 103: Manual .Net

Creando Aplicaciones para Windows Microsoft Visual Basic .NET

Titulo=(select Titulo from libro where IdLibro=p.IdLibro),p.Cantidad,p.Total

from pedido p

Diagrama Entidad Relación

Web Developer Microsoft.NET