Vous êtes sur la page 1sur 331

Programación

Orientada a
Objetos I
2

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 3

ÍNDICE
Presentación 5
Red de contenidos 7
Unidad de aprendizaje 1
INTRODUCCION A LA PROGRAMACION ORIENTADA A OBJETOS 9
1.1 Tema 1 : Conceptos básicos de programación orientada a objetos 11
1.1.1. : Manejo de una clase, definir propiedades, métodos y 14
eventos
1.1.2. : Definir un constructor 15
1.1.3. : Definición de sobrecarga de un método 16
1.1.4. : Manejo de un objeto: instancia de una clase 16
1.2 Tema 2 : Herencia y Polimorfismo 37
1.2.1. : Definición de herencia 37
1.2.2. : Implementando una clase heredada 37
1.2.3. : Definición de polimorfismo 38
Unidad de aprendizaje 2
MANEJO DE COLECCIONES 57
2.1 Tema 3 : Manejo de colecciones y enumeradores 59
2.1.1. : Colecciones en .NET Framework 59
2.1.1.1 : Manejo de la colección ArrayList 60
2.1.1.2 : Manejo de la colección List(Of) 61
2.2 Tema 4 : LINQ y expresiones Lambda 79
2.2.1. : Lenguaje integrado de consultas 81
2.2.1.1 : LINQ, definición y claúsulas 81
2.21.2 : LINQ y consulta de datos 83
2.2.1.3 : Expresiones lambda, manejo de consultas 84
Unidad de aprendizaje 3
PROCESOS ASINCRONOS 99
3.1 Tema 5 : Procesos Asíncronos 103
3.1.1. : Manejo de un Thread: propiedades y métodos 105
3.1.2. : Manejo de una clase Thread 106
3.1.3 : Manejo de BackgroundWorker 108
Unidad de aprendizaje 4
ADMINISTRACIÓN DE DATOS 121

CIBERTEC CARRERAS PROFESIONALES


4

4.1 Tema 6 : Manejo de archivos 123


4.1.1. : Objetos Stream 126
4.1.1.1. : Manejo de StreamReader y StreamWriter 127
4.1.1.2. : Manejo de FileStream 129
4.1.1.3. : Manejo de MemoryStream 130
4.2 Tema 7 : Compresión de Datos 147
4.2.1. : Comprimir y descomprimir datos 149
4.2.1.1 : Clase GzipStream, propiedades y métodos 150
4.3 Tema 8 : Serialización de Datos 161
4.3.1. : Serialización Binaria 161
4.3.1.1. : Serializar y deserializar datos binarios: BinaryFormatter 162
4.3.2 : Serialización XML 162
4.3.2.1. : Serializar y deserializar datos en formato XML XmlSerializer 162
Unidad de aprendizaje 5
SEGURIDAD DE DATOS 177
5.1 Tema 9 : Encriptamiento de Datos 179
5.1.1 : Definición de criptografía o encriptamiento 179
5.1.2 : Tipos de encriptamiento 179
5.1.3 : Clases y servicios para encriptar y desencriptar datos 180
5.2 Tema10 : Almacenamiento Aislado 191
5.2.1 : Creando un área de almacenamiento aislado 193
5.2.2 : Almacenamiento de archivos y carpetas: IsolatedStorage 194
5.2.3 : Manejo de archivos aislados: IsolatedStorageFileStream 196
Unidad de aprendizaje 6
GESTION Y CONFIGURACION DE APLICACIONES .NET 205
6.1 Tema11 : Manejo de Componentes 207
6.1.1 : Exponiendo un componente al .NET Framework 207
6.1.2 : Invocando funciones DLLs no manejadas 207
6.1.3 : Manejo de Reflection 208
6.2 Tema12 : Globalización 227
6.2.1 : Manejo de globalización y cultura en una aplicación .NET 227
6.2.2 : Manejo de formatos utilizando la clase Culture 228
Unidad de aprendizaje 7
WINDOWS PRESENTATION FOUNDATION 239
7.1 Tema 13 : Windows Presentation Foundation 241
7.1.1 : Introducción al WPF 241

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 5

7.1.2 : Bases de WPF 242


7.1.3 : XAML 243
7.1.4 : Controles de interface de usuario 246
Unidad de aprendizaje 8
OPERACIONES CONECTADAS A UN ORIGEN DE DATOS 265
8.1 Tema 14 : Introducción a ADO.NET 267
8.1.1 : Arquitectura del ADO.NET 267
8.1.2 : Proveedores de datos en ADO.NET 268
8.1.3 : Admnistrando una cadena de conexión 271
8.2 Tema 15 Recuperación de datos 285
8.2.1 : Consultando datos sobre un origen de datos 288
8.2.1.1 : Manejo de la clase DataAdapter 288
8.2.1.2 : Realizando consulta utilizando SQL o procedimiento 289
almacenado
8.2.1.3 : Manejo de parámetros en el proceso de consulta 289
8.2.1.4 : Recuperando datos desde un DataReader 289
8.3 Tema 16 : Manipulación de datos 305
8.3.1 : Operaciones de modificación de datos sobre un origen de 307
datos
8.3.1.1 : Manejo de la clase Command 307
8.3.1.2 : Ejecutando operaciones de actualización de datos utilizando 308
sentencia SQL o procedimiento almacenado
8.3.1.3 : Manejo de parámetros en el proceso de actualización de 310
datos

CIBERTEC CARRERAS PROFESIONALES


6

PRESENTACIÓN

Visual Studio 2013 y su plataforma .NET FrameWork 4.5 es una plataforma de


desarrollo para compilar aplicaciones para Windows, Windows Phone, Windows
Server y Azure. Está formado por el Common Language Runtime y la biblioteca de
clases .Net Framework que incluye clases, interfaces y tipos de valor que son
compatibles con una amplia gama de tecnologías .NET Framework proporciona un
entorno de ejecución administrado, un desarrollo e implementación simplificados y la
integración con una variedad de lenguajes de programación, que incluye Visual Basic
y Visual C#.

Programación Orientada a Objetos I pertenece a la línea de tecnología y se dicta en


las carreras de tecnología de la institución. El curso brinda un conjunto de
herramientas de programación para trabajar con las librerías de .Net FrameWork 4.5
que permita al alumno realizar operaciones para el manejo de datos, configuración de
Windows, seguridad y ensamblados.

El manual para este curso ha sido diseñado bajo la modalidad de unidades de


aprendizaje, las que desarrollamos durante semanas determinadas. En cada una de
ellas, hallará los logros que se deberá alcanzar al final de la unidad; el tema tratado, el
cual será ampliamente desarrollado; y los contenidos, que debe desarrollar. Por último,
encontrará las actividades y trabajos prácticos que deberá desarrollar en cada sesión,
que le permitirán reforzar lo aprendido en la clase.

El curso es eminentemente práctico: consiste en programación orientada a objetos en


Visual C#. La primera parte de este manual nos enseña a familiarizarnos con la
programación orientada a objetos en .NET, almacenando los objetos en colecciones
para realizar las consultas y actualizaciones de éstos, mediante ejemplos didácticos.
Aprenderemos a manejar los procesos asíncronos e hilos. Luego, vamos a realizar
operaciones sobre los archivos realizando operaciones de lectura y escritura así como
operaciones de serializacion, encriptamiento y compresión de archivos; luego
desarrollamos procesos para el manejo de assemblies y componentes administrados
por Windows; a continuación desarrollamos aplicaciones con Windows Presentation
Foundation para la creación de controles de usuario; y por ultimo, desarrollamos
aplicaciones con acceso a datos para realizar operaciones de recuperación y
actualización de datos.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 7

RED DE CONTENIDOS

Programación Orientada a Objetos I

Unidad Unidad Unidad Unidad Unidad Unidad Unidad Unidad


1 2 3 4 5 6 7 8

Introduccion Herencia y Trabajan- Encripta- Almacena- Windows Acceso a


a la Polimor- do con miento de miento Presenta- datos
programacio fismo Multihilos datos aislado tion ADO.NET
n orientada Founda-
a objetos tion

Manejo de LINQ Manejo de Globali-


coleccio- Expresio- compo- zación y
nes y nes nentes Cultura
enumera- Lambda
dores

Manejo de Compre- Serializa-


archivos sión de ción de
datos datos

CIBERTEC CARRERAS PROFESIONALES


8

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 9

UNIDAD

1
INTRODUCCIÓN A LA
PROGRAMACION ORIENTADA A
OBJETOS
LOGRO DE LA UNIDAD DE APRENDIZAJE

Al finalizar la unidad, el alumno crea aplicaciones definiendo propiedades y métodos


dentro de clases definidas, las cuales se implementan y ejecutan en la aplicación.

TEMARIO
1.1. Tema 1: Conceptos básicos de programación orientada a objetos
1.1.1. Manejo de una clase, definir propiedades, métodos y eventos
1.1.2. Definición de un constructor
1.1.3. Definición de sobrecarga de un método.
1.1.4. Manejo de un objeto: instancia de una clase

1.2. Tema 2: Herencia y Polimorfismo


1.2.1. Definición de herencia
1.2.2. Implementando una clase heredada
1.2.3. Definición de polimorfismo
1.2.4. Implementando una clase heredada aplicando polimorfismo

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan los laboratorios de esta semana
 Los alumnos desarrollan aplicaciones con los controles básicos
 Los alumnos desarrollan aplicaciones utilizando la metodología orientada
a objetos: clases y objetos.

CIBERTEC CARRERAS PROFESIONALES


10

1.1. CONCEPTOS BASICOS DE PROGRAMACION


ORIENTADA A OBJETOS
ARQUITECTURA .NET FRAMEWORK
La nueva tecnología de Microsoft ofrece soluciones a los problemas de
programación actuales, como son la administración de código o la
programación para Internet. Para aprovechar al máximo las características de
.Net es necesario entender la arquitectura básica en la que esta implementada
esta tecnología y así beneficiarse de todas las características que ofrece esta
nueva plataforma.

El Framework de .Net es una infraestructura sobre la que se reúne todo un


conjunto de lenguajes y servicios que simplifican enormemente el desarrollo de
aplicaciones. Mediante esta herramienta se ofrece un entorno de ejecución
altamente distribuido, que permite crear aplicaciones robustas y escalables.

Los principales componentes de este entorno son:

 Lenguajes de compilación
 Biblioteca de clases de .Net
 CLR (Common Language Runtime)

Figura 1: Arquitectura .NET FrameWork


Referencia: Microsoft .NET Framework

Actualmente, el Framework de .Net es una plataforma no incluida en los


diferentes sistemas operativos distribuidos por Microsoft, por lo que es
necesaria su instalación previa a la ejecución de programas creados mediante
.Net. El Framework se puede descargar gratuitamente desde la web oficial de
Microsoft (ver link de descarga en los recursos del final).

.Net Framework soporta múltiples lenguajes de programación y aunque cada


lenguaje tiene sus características propias, es posible desarrollar cualquier tipo
de aplicación con cualquiera de estos lenguajes. Existen más de 30 lenguajes

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 11

adaptados a .Net, desde los más conocidos como C# (C Sharp), Visual Basic o
C++ hasta otros lenguajes menos conocidos como Perl o Cobol.

Common Language Runtime (CLR)


El CLR es el verdadero núcleo del Framework de .Net, ya que es el entorno de
ejecución en el que se cargan las aplicaciones desarrolladas en los distintos
lenguajes, ampliando el conjunto de servicios que ofrece el sistema operativo
estándar Win32.

La herramienta de desarrollo compila el código fuente de cualquiera de los


lenguajes soportados por .Net en un mismo código, denominado código
intermedio (MSIL, Microsoft Intermediate Lenguaje). Para generar dicho código
el compilador se basa en el Common Language Specification (CLS) que
determina las reglas necesarias para crear código MSIL compatible con el CLR.

De esta forma, indistintamente de la herramienta de desarrollo utilizada y del


lenguaje elegido, el código generado es siempre el mismo, ya que el MSIL es el
único lenguaje que entiende directamente el CLR. Este código es transparente
al desarrollo de la aplicación ya que lo genera automáticamente el compilador.

Sin embargo, el código generado en MSIL no es código máquina y por tanto no


puede ejecutarse directamente. Se necesita un segundo paso en el que una
herramienta denominada compilador JIT (Just-In-Time) genera el código
máquina real que se ejecuta en la plataforma que tenga la computadora.

De esta forma se consigue con .Net cierta independencia de la plataforma, ya


que cada plataforma puede tener su compilador JIT y crear su propio código
máquina a partir del código MSIL.

La compilación JIT la realiza el CLR a medida que se invocan los métodos en


el programa y, el código ejecutable obtenido, se almacena en la memoria caché
de la computadora, siendo recompilado sólo cuando se produce algún cambio
en el código fuente.

Biblioteca de clases de .Net


Cuando se está programando una aplicación muchas veces se necesitan
realizar acciones como manipulación de archivos, acceso a datos, conocer el
estado del sistema, implementar seguridad, etc. El Framework organiza toda la
funcionalidad del sistema operativo en un espacio de nombres jerárquico de
forma que a la hora de programar resulta bastante sencillo encontrar lo que se
necesita.

Para ello, el Framework posee un sistema de tipos universal, denominado


Common Type System (CTS). Este sistema permite que el programador pueda
interactuar los tipos que se incluyen en el propio Framework (biblioteca de
clases de .Net) con los creados por él mismo (clases). De esta forma se
aprovechan las ventajas propias de la programación orientada a objetos, como
la herencia de clases predefinidas para crear nuevas clases, o el polimorfismo
de clases para modificar o ampliar funcionalidades de clases ya existentes.

CIBERTEC CARRERAS PROFESIONALES


12

Figura 2: Biblioteca .NET FrameWork


Referencia: Microsoft .NET Framework

La biblioteca de clases de .Net Framework incluye, entre otros, tres


componentes clave:

 ASP.NET para construir aplicaciones y servicios Web.


 Windows Forms para desarrollar interfaces de usuario.
 ADO.NET para conectar las aplicaciones a bases de datos.

La forma de organizar la biblioteca de clases de .Net dentro del código es a


través de los espacios de nombres (namespaces), donde cada clase está
organizada en espacios de nombres según su funcionalidad. Por ejemplo, para
manejar ficheros se utiliza el espacio de nombres System.IO y si lo que se
quiere es obtener información de una fuente de datos se utilizará el espacio de
nombres System.Data.

La principal ventaja de los espacios de nombres de .Net es que de esta forma


se tiene toda la bliblioteca de clases de .Net centralizada bajo el mismo espacio
de nombres (System). Además, desde cualquier lenguaje se usa la misma
sintaxis de invocación, ya que a todos los lenguajes se aplica la misma
biblioteca de clases.

Ensamblados
Uno de los mayores problemas de las aplicaciones actuales es que en muchos
casos tienen que tratar con diferentes archivos binarios (DLL´s), elementos de
registro, conectividad abierta a bases de datos (ODBC), etc.

Para solucionarlo el Framework de .Net maneja un nuevo concepto


denominado ensamblado. Los ensamblados son ficheros con forma de EXE o
DLL que contienen toda la funcionalidad de la aplicación de forma
encapsulada. Por tanto la solución al problema puede ser tan fácil como copiar
todos los ensamblados en el directorio de la aplicación.

Con los ensamblados ya no es necesario registrar los componentes de la


aplicación. Esto se debe a que los ensamblados almacenan dentro de sí
mismos toda la información necesaria en lo que se denomina el manifiesto del

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 13

ensamblado. El manifiesto recoge todos los métodos y propiedades en forma


de meta-datos junto con otra información descriptiva, como permisos,
dependencias, etc.

Para gestionar el uso que hacen la aplicaciones de los ensamblados .Net utiliza
la llamada caché global de ensamblados (GAC, Global Assembly Cache). Así,
.Net Framework puede albergar en el GAC los ensamblados que puedan ser
usados por varias aplicaciones e incluso distintas versiones de un mismo
ensamblado, algo que no era posible con el anterior modelo COM.

Programacion Orientada A Objetos En .Net


Todo .NET Framework está basado en clases (u objetos). Visual Studio .NET
es una plataforma de desarrollo cuyo framework está desarrollado
exclusivamente en clases.
La programación orientada a objetos puede describirse como el conjunto de
disciplinas que desarrollan y modelizan software que facilitan la
construcción de sistemas complejos a partir de componentes.

El atractivo intuitivo de la orientación a objetos es que proporciona conceptos y


herramientas con las cuales se modela y representa el mundo real tan
fielmente como sea posible. Estos conceptos y herramientas orientados a
objetos son tecnologías que permiten que los problemas del mundo real sean
expresados de modo fácil y natural.

Las técnicas orientadas a objetos proporcionan mejoras y metodologías para


construir sistemas de software complejos a partir de unidades de software
modularizado y reutilizable. Se necesita un nuevo enfoque para construir
software en la actualidad. Este nuevo enfoque debe ser capaz de manipular
tanto sistemas grandes como pequeños y debe crear sistemas fiables que sean
flexibles, mantenibles y capaces de evolucionar para cumplir las necesidades
del cambio.

La programación orientada a objetos trata de cubrir las necesidades de los


usuarios finales, así como las propias de los desarrolladores de productos
software. Estas tareas se realizan mediante la modelización del mundo real. El
soporte fundamental es el modelo objeto

Pilares en la Programacion Orientada a Objetos


Todos los lenguajes basados en objetos, deben cumplir estos tres requisitos:

 Herencia
 Encapsulación
 Polimorfismo

Herencia
Esta es la característica más importante de la Programación Orientada a los
Objetos. Según la propia documentación de Visual Studio .NET:

"La herencia permite crear nuevas clases a partir de clases existentes. La


herencia puede simplificar el diseño de la aplicación proporcionando una
estructura de relaciones entre las distintas clases. También admite la
reutilización de código porque sólo se debe codificar el comportamiento de
clases nuevas o distintas.".

CIBERTEC CARRERAS PROFESIONALES


14

Una relación de herencia es una relación en la que un tipo (el tipo derivado) se
deriva de otro (el tipo base), de tal forma que el espacio de declaración del tipo
derivado contiene implícitamente todos los miembros de tipo no constructor del
tipo base.

Encapsulación
“La encapsulación es la capacidad de contener y controlar el acceso a un grupo
de elementos asociados. Las clases proporcionan una de las formas más
comunes de encapsular elementos."

Cuando usamos las clases, éstas tienen una serie de características (los datos
que manipula) así como una serie de comportamientos (las acciones a realizar
con esos datos). La encapsulación es esa capacidad de la clase de ocultarnos
sus interioridades para que sólo veamos lo que tenemos que ver, sin tener que
preocuparnos de cómo está codificada para que haga lo que hace...
simplemente nos debe importar que lo hace.

Polimorfismo
"El polimorfismo se refiere a la posibilidad de definir múltiples clases con
funcionalidad diferente, pero con métodos o propiedades denominados de
forma idéntica, que pueden utilizarse de manera intercambiable mediante
código cliente en tiempo de ejecución."

Dicho de otra manera, puede tener múltiples clases que se pueden utilizar de
forma intercambiable, si bien cada clase implementa las mismas propiedades o
los mismos métodos de maneras diferentes.

El polimorfismo es importante en la programación orientada a objetos puesto


que permite usar elementos que tienen el mismo nombre, independientemente
del tipo de objeto que se esté utilizando en ese momento.

1.1.1. Manejo una Clase, propiedades, métodos y eventos

Una clase es simplemente una representación de un tipo de objeto. Una


clase define las características de un objeto, incluyendo las propiedades
que definen los tipos de datos que ese objeto puede contener y los
métodos que describen el comportamiento del objeto. Estas
características determinan la manera en que otros objetos pueden
acceder y trabajar con los datos que se incluyen en el objeto.

Un objeto es una unidad de software que contiene una colección de


métodos y datos relacionados. Un objeto es una instancia específica de
una clase, e incluye las características de esa clase.

Las abstracciones de datos (atributos) que describen la clase están


encerradas por una “muralla” de abstracciones procedimentales
(llamadas operaciones, métodos y eventos) capaces de manipular los
datos de alguna manera. La única forma de alcanzar los atributos (y
operar sobre ellos) es ir a través de alguno de los métodos que forman
la muralla. Por lo tanto, la clase encapsula datos (dentro de la muralla) y
el proceso que manipula los datos (los métodos que componen la

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 15

muralla). Esto posibilita la ocultación de información y reduce el impacto


de efectos colaterales asociados a cambios.

Atributos
Los atributos están asociados a clases y objetos, y describen la clase o
el objeto de alguna manera. Las entidades de la vida real están a
menudo descritas con palabras que indican características estables. La
mayoría de los objetos físicos tienen características tales como forma,
peso, color y tipo de material. Las personas tienen características como
fecha de nacimiento, padres, nombre y color de los ojos.

Propiedades
Las propiedades son métodos que permiten acceder o recuperar los
valores de los atributos y se implementan mediante los procedimientos
Get y Set

Operaciones y Métodos
Un objeto encapsula datos (representados como una colección de
atributos) y algoritmos que procesan estos datos. Estos algoritmos son
llamados operaciones o métodos y pueden ser vistos como módulos en
un sentido convencional. Los métodos se definen como procedimientos
o funciones

Eventos
Los eventos son el medio a través del cual interactúan los objetos. Un
evento estimula la ocurrencia de cierto comportamiento en el objeto
receptor. El comportamiento se realiza cuando se ejecuta un método.

Un evento dentro de un objeto emisor genera un mensaje de la forma:

destino.operación (parámetros)

Donde destino define al objeto receptor el cual es estimulado por el


mensaje, operación se refiere al método que recibe el mensaje y
parámetros proporciona información requerida para el éxito de la
operación.

Los eventos proporcionan una visión interna del comportamiento de


objetos individuales, y del sistema Orientado a Objetos como un todo.

1.1.2. Definir un Constructor


Para inicializar los atributos los nuevos objetos se controla utilizando
constructores.

Un constructor es un método que permite inicializar los atributos de una


clase. Este método se ejecuta al momento de instanciar la clase.

Podemos sobrecargar constructores del mismo modo que se


sobrecarga cualquier otro método de una clase.

CIBERTEC CARRERAS PROFESIONALES


16

1.1.3. Definición de sobrecarga de un método


Es posible definir dos o más métodos dentro de la misma clase que
comparten el mismo nombre, siempre y cuando sus declaraciones de
parámetro son diferentes. Cuando esto sucede, los métodos se dicen a
sobrecargarse, y el proceso se conoce como la sobrecarga de métodos.

Sobrecarga de métodos es una de las maneras de implementar el


polimorfismo.

Cuando se invoca un método sobrecargado, se utiliza el número de


argumentos como su guía para determinar la versión del método
sobrecargado realmente a ejecutar. Por lo tanto, los métodos
sobrecargados deben ser diferentes en el tipo o el número de sus
parámetros. Aunque los métodos sobrecargados pueden tener
diferentes tipos de devolución, el tipo devuelto por sí sola no basta
distinguir dos versiones de un método.

1.1.4. Definir un Constructor


Un constructor inicializa un objeto inmediatamente tras su creación.
Tiene el mismo nombre que la clase en la que reside y es
sintácticamente similar a un método.

Una vez definido, automáticamente se llama al constructor, después de


crear el objeto, antes de que finalice el operador new. El constructor no
retorna valor. Es trabajo del constructor inicializar el estado interno de
un objeto, por lo que el código de creación de una instancia tendrá un
objeto totalmente inicializado, utilizable inmediatamente.

DEFINIR UNA CLASE EN VISUAL C#


Definiendo una clase
Para crear una clase se utiliza la sintaxis:

Class <Nombre de la Clase> {

Para definir la clase Cuenta, defina la siguiente sintaxis

public class Cuenta


{
}

Definiendo un atributo
Tras agregar una nueva clase a nuestro proyecto, podemos agregar
atributos a la clase. Cuando agregamos atributos a una clase,
especificamos el nivel de acceso estableciendo los modificadores de
acceso.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 17

Alcance Descripción
Public Acceso Total
Private Acceso solo a la Clase
Protected Acceso solo a clases heredadas

Para definir atributos a la clase Cuenta, agregue el siguiente código dentro


de la estructura Class

public class Cuenta


{
private double balance;
private string tipo;
}

Definiendo una propiedad


Para agregar la propiedad al atributo tipo

public class Cuenta


{
public double balance { get; set; }
public int tipo { get; set; }
}

Se puede observar que el nombre de la propiedad se le asigna get, set


para recuperar o asignar valor al atributo

Definiendo un método
Para agregar un método a la clase:

public class Cuenta


{
public double balance;

public void deposito(double monto)


{
balance += monto;
}
}

Se define sobrecarga de un método a aquellos métodos que tienen el


mismo nombre pero con diferentes firmas.

CIBERTEC CARRERAS PROFESIONALES


18

Definiendo un constructor
Para inicializar los atributos de la clase

public Cuenta()
{
balance = 0;

Los constructores se pueden aplicar sobrecarga de métodos: donde el


atributo _balance se le asignará un valor desde el constructor.

public Cuenta(double b)
{
balance = b;
}

Creando la instancia
Para ejecutar los métodos y utilizar las propiedades de una clase,
debemos crear una instancia de la clase.

Para crear una instancia de una clase, declaramos una variable del tipo de
la clase y utilizamos la palabra clave New, como se muestra en la siguiente
línea de código:

Cuenta c = new Cuenta();


c.deposito(1500);

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 19

LABORATORIO 1.1
Manejo de Clases y Objetos
La empresa Tapicería “FAST” nos pide realizar un programa que permita registrar la
Venta de Muebles que la empresa ofrece a los clientes.

En este proceso, debemos ingresar el numero de la boleta, la fecha, el nombre del


cliente, la descripción del mueble, y el precio del mismo. La empresa aplica el
siguiente descuento: si el precio es mayor a 500 su descuento es el 10% del precio,
sino el descuento es el 2% del precio. El precio de venta neto es la diferencia del
precio con su descuento.

Se pide realizar las siguientes actividades:


 Crear un proyecto Windows Form en Visual C#.
 Diseño de la Clase, sus atributos, propiedades y métodos.
 Diseñar el Formulario, agregando sus controles
 Programe el formulario instanciando la clase, ingrese sus datos y visualice los
resultados.

1. Inicio del Proyecto

 Cargar la aplicación del el Menú INICIO.


 Seleccione Microsoft Visual Studio 2013 el cual se visualiza el IDE

IDE de Visual
Studio 2013

CIBERTEC CARRERAS PROFESIONALES


20

 Haga click en la opción NUEVO PROYECTO, tal como se muestra

Selecciona la opción
Nuevo Proyecto para
crear

 En la Ventana Nuevo Proyecto , seleccione la plantilla Visual C#


 Luego, seleccione la plantilla Aplicación de Windows Forms
 A continuación, asigne un nombre al proyecto y su ubicación
 Presione el botón ACEPTAR

1. Selecciona la plantilla Visual C#

2. Selecciona la plantilla Aplicación de


Windows Form

3. Asigna el nombre del proyecto

4. Asigna la ubicación del proyecto

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 21

2. Creando la Clase

Para agregar una clase al proyecto, desde la opción de menú PROYECTO, selecciona
la opción Agregar clase, tal como se muestra en la gráfica

1. Selecciona la
opción AGREGAR

 En la ventana AGREGAR NUEVO ITEM, seleccione el Item Clase


 Asigne un nombre a la clase: Ventas
 Presione el botón AGREGAR

1. Selecciona la opción
CLASE

2. Asigne el nombre a la
clase: VENTA

CIBERTEC CARRERAS PROFESIONALES


22

Creada la plantilla clase Venta, se define tal como se muestra

Definición de la clase
VENTA

Clase Venta: Definiendo sus atributos y propiedades

Definida la Clase, a continuación definimos cada uno de los atributos y propiedades de


la clase. En C#, se puede definir un atributo junto con sus propiedades get y set.

Defina los atributos y propiedades de la clase Venta, tal como se muestra

Defina los atributos de la


clase, indicando su tipo de
dato

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 23

Clase Venta: Definiendo sus métodos.

Los métodos en C# son definidos por rutinas y funciones.


Una rutina es un procedimiento que ejecuta sentencias y no retorna valor:

public void Calculos(){

Una función es un método que ejecuta un conjunto de sentencias y retorna un valor.

public double Descuento(){


return valor;
}

En el desarrollo de la clase Venta, defina los metodos Descuento() y PrecioVenta(), tal


como se muestra

Función que retorna


el descuento
evaluando la
condición del precio

Función que retorna


el Neto: precio
menos descuento

CIBERTEC CARRERAS PROFESIONALES


24

3. Diseño del Formulario y programación

A continuación diseñamos la GUI (Formulario) tal como se muestra

TextBox, (name) txtNumero

TextBox, (name) txtFecha

TextBox, (name) txtCliente

TextBox, (name) txtMueble

TextBox, (name) txtPrecio

TextBox, (name) txtDescuento

TextBox, (name) txtPrecioVenta

Programación

A continuación programa el evento del botón Procesar: void btnProcesar_Click():

1. Instanciar la clase Ventas.

Instanciar la
clase Venta()

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 25

2. Ingrese los datos al objeto vta.

Ingrese los datos a


las propiedades

3. Ejecutar los cálculos, visualizar los resultados

Ejecutar los
métodos

CIBERTEC CARRERAS PROFESIONALES


26

Presione F5 para ejecutar el proyecto.

Ingrese los datos: número del documento, fecha, nombre del cliente, descripción del
mueble y precio. Al presionar el botón Procesar se visualiza los resultados.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 27

LABORATORIO 1.2
Manejo de Constructores y sobrecarga de métodos
La empresa de Transportes “FAST DRIVER” solicita un programa que permita registrar
el transporte de carga pesada a provincia.

En este proceso, debemos ingresar el número de la guía, la fecha del documento, el


nombre del Cliente, la descripción de la carga y la cantidad de Toneladas Métricas
(TM) de la carga.

La empresa cobra por cada TM de carga S/. 150; el costo del transporte es el producto
de la tarifa por TM por la cantidad de TM de la carga. Por concepto de seguro cobrará
el 2% del costo de transporte; el Monto es la suma de costo de transporte y el seguro.
Se aplicará el IGV que representa el 18% del Monto, donde el Monto Total se obtiene
de la suma del IGV y el Monto.

Se pide:
 Diseño de la Clase, sus atributos, propiedades, métodos y el constructor
 Diseñar el Formulario, agregando sus controles y programación.

1. Agregando una Clase


 Desde la venta Explorador de soluciones, hacer clic derecho en el proyecto
 De la opción Agregar  selecciona la opción Clase.

1. Selecciona la
opción AGREGAR

2. Selecciona la
opción CLASE

CIBERTEC CARRERAS PROFESIONALES


28

Diseño de la Clase
 En la ventana Nuevo Elemento, seleccione el Item Clase
 Asigne un nombre a la clase: Transporte
 Presione el botón AGREGAR

1. Selecciona la opción
CLASE

2. Asigne el nombre a la
clase: TRANSPORTE

Primero, defina la Clase, la cual se llamará Transporte, tal como se muestra

Definición de la clase
TRANSPORTE

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 29

Clase Transporte: Agregando sus atributos y propiedades


Defina cada uno de los atributos que integran la clase: número, fecha, cliente, carga,
TM.

Definimos los
atributos y
propiedades de la
clase

Defina el constructor para inicializar los atributos precio y TM.

public Transporte(){ }
Definimos el constructor para
inicializar los atributos precio y
TM

CIBERTEC CARRERAS PROFESIONALES


30

Clase Transporte: Agregando sus métodos


Defina los métodos del proceso, tal como se muestra

Defina cada una de las


funciones del proceso.

2. Diseño del Formulario


A continuación diseña el Formulario; para esto insertamos controles: Label, TextBox y
Button. Para asignar el nombre al control utilice la propiedad (Name) en la ventana de
propiedades del control; para visualizar esta ventana pulse el control F4

TextBox, (name) txtNumero

TextBox, (name) txtFecha

TextBox, (name) txtCosto

TextBox, (name) txtSeguro

TextBox, (name) txtMonto

TextBox, (name) txtIGV

TextBox, (name) txtMontoTotal

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 31

Programación
A continuación programa el evento del botón Procesar: void btnProcesar_Click():

1. Instanciar la clase Transporte

Instanciar la clase
Transporte()

2. Ingrese los datos al objeto tr.

Ingrese los datos a


las propiedades

CIBERTEC CARRERAS PROFESIONALES


32

3. Ejecutar los cálculos, visualizar los resultados

Ejecutar los métodos y


visualizar los resultados

Presione F5 para ejecutar el proyecto. Ingrese los datos: número del documento,
fecha, nombre del cliente, descripción de la carga y la cantidad de TM. Al presionar el
botón Procesar se visualiza los resultados

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 33

LABORATORIO 1.3
Ejercicio Propuesto
La distribuidora “Celima”” EIRL solicita un programa que permita registrar el pago de
Haberes de los empleados.

En este proceso, debemos ingresar el Nombre del Empleado, su categoría, el básico y


su bonificación y el tipo de aportación: AFP u ONP.

La suma del básico y la bonificación es la Remuneración.


Para calcular la aportación éste se aplicara de la siguiente forma: Si es AFP el
descuento será el 11 de la remuneración, sino el descuento será el 13% de la
Remuneración.
Calcule el Neto que será la remuneración menos el descuento.

A partir de estos datos:


• Diseñe de la Clase, donde defina los atributos de la Clase
• Defina el Constructor que permita el ingreso de datos
• Defina las Funciones que permitan realizar los cálculos

Dentro del formulario instanciar la clase, ingrese los datos y visualice los resultados.

CIBERTEC CARRERAS PROFESIONALES


34

Resumen
 El Framework de .Net es una infraestructura sobre la que se reúne todo un
conjunto de lenguajes y servicios que simplifican enormemente el desarrollo de
aplicaciones. Mediante esta herramienta se ofrece un entorno de ejecución
altamente distribuido, que permite crear aplicaciones robustas y escalables.
 Los principales componentes de este entorno son:
o Lenguajes de compilación
o Biblioteca de clases de .Net
o CLR (Common Language Runtime)
 La programación orientada a objetos puede describirse como el conjunto de
disciplinas que desarrollan y modelizan software que facilitan la construcción de
sistemas complejos a partir de componentes
 Todos los lenguaje basados en objetos, deben cumplir los siguientes requisitos:
o Herencia
o Encapsulación
o Polimorfismo
 Una clase es simplemente una representación de un tipo de objeto. Una clase
define las características de un objeto, incluyendo las propiedades que definen los
tipos de datos que ese objeto puede contener y los métodos que describen el
comportamiento del objeto.
 Un objeto es una instancia específica de una clase, e incluye las características de
esa clase.
 Las abstracciones de datos (atributos) que describen la clase están encerradas
por una “muralla” de abstracciones procedimentales (llamadas operaciones,
métodos y eventos) capaces de manipular los datos de alguna manera.
 Los atributos están asociados a clases y objetos, y describen la clase o el objeto
de alguna manera.
 Las propiedades son métodos que permiten acceder o recuperar los valores de los
atributos y se implementan mediante los procedimientos Get y Set
 Un objeto encapsula datos (representados como una colección de atributos) y
algoritmos que procesan estos datos. Estos algoritmos son llamados operaciones o
métodos y pueden ser vistos como módulos en un sentido convencional.
 Los eventos son el medio a través del cual interactúan los objetos. Un evento
estimula la ocurrencia de cierto comportamiento en el objeto receptor.
 Para inicializar los atributos los nuevos objetos se controla utilizando constructores.
Un constructor es un método que permite inicializar los atributos de una clase.
 Para ejecutar los métodos y utilizar las propiedades de una clase, debemos crear
una instancia de la clase.
 Para crear una instancia de una clase, declaramos una variable con el nombre de
la clase.
 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 htm http://support.microsoft.com/kb/307368/es
 http://msdn.microsoft.com/es-pe/library/dd460654.aspx

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 35

UNIDAD

1
INTRODUCCIÓN A LA
PROGRAMACION ORIENTADA A
OBJETOS
LOGRO DE LA UNIDAD DE APRENDIZAJE

Al finalizar la unidad, el alumno crea aplicaciones definiendo propiedades y métodos


dentro de clases definidas, las cuales se implementan y ejecutan en la aplicación.

TEMARIO

1.1. Tema 1: Conceptos básicos de programación orientada a objetos


1.1.1. Manejo de una clase, definir propiedades, métodos y eventos
1.1.2. Definición de un constructor
1.1.3. Definición de sobrecarga de un método.
1.1.4. Manejo de un objeto: instancia de una clase

1.2. Tema 2: Herencia y Polimorfismo


1.2.1. Definición de herencia
1.2.2. Implementando una clase heredada
1.2.3. Definición de polimorfismo
1.2.4. Implementando una clase heredada aplicando polimorfismo

ACTIVIDADES PROPUESTAS

 Los alumnos desarrollan los laboratorios de esta semana


 Los alumnos desarrollan aplicaciones con los controles básicos
 Los alumnos desarrollan aplicaciones utilizando la metodología orientada a
objetos: clases y objetos.

CIBERTEC CARRERAS PROFESIONALES


36

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 37

1.2 HERENCIA Y POLIMORFISMO


1.2.1 Definición de herencia

En la programación orientada a objetos, podemos compartir las características


de una clase base en otras clases derivadas de la clase base. Esto se
denomina herencia.

Imaginemos tres clases: Cuenta Corriente, Cuenta Ahorro y Cuenta


Inversión. Los atributos y operaciones de la clase base Cuenta también
pueden aplicarse a las clases heredadas. La reutilización de estos atributos y
operaciones es una técnica eficaz.

Figura 1: Diagrama de Herencia

Características
 Reuso del código: permite compartir atributos y métodos
 El compilador es el que hace la mayor parte del trabajo
 Es una parte integral del .NET
 Visual C# soporta herencia simple a nivel de clase, es decir, una
clase únicamente puede heredar de una sola clase base y herencia
de múltiples clases.

1.2.2 Implementando una clase heredada

La herencia puede utilizarse para derivar una clase de una clase


existente. La clase derivada puede heredar todas las propiedades,
métodos, miembros de datos, eventos y controladores de eventos de la
clase base, facilitando la reutilización de la clase base por toda la
aplicación.

Heredar una clase: Inherits


Para derivar una clase en C#:

Public Class Cuentas{


}
Public Class VerificaCuenta: Cuentas {
Private void ProcesoCheck( )
{
//Añadir código al proceso
}
}

CIBERTEC CARRERAS PROFESIONALES


38

Uso de la palabra Clave Protected


Utilizamos el acceso Protected para limitar el ámbito de una propiedad,
método, miembro de datos, evento o controlador de eventos a la clase
que los define y cualquier clase derivada basada en esa clase base.

public class ClaseBase {


//Alcance publico
public int counter;
// Alcande solo a su clase o su derivada
protected string name;
}

1.2.3. Definición de Polimorfismo


La mayoría de sistemas de programación orientada a objetos proporcionan
polimorfismo mediante herencia. El polimorfismo basado en herencia implica la
definición de métodos en una clase base y sobrecargarlos con nuevas
implementaciones en clases derivadas.

Polimorfismo hace referencia a la capacidad de definir múltiples clases con


diferentes funcionalidades pero con métodos o propiedades de nombres
idénticos que pueden utilizarse de forma intercambiable por el código cliente en
tiempo de ejecución. El nombre del método reside en la clase base. Las
implementaciones de métodos residen en las clases derivadas. Para gestionar
esto, únicamente puede declararse en la clase base el nombre del método (no
el código que proporciona la funcionalidad del método)

Supongamos que definimos una clase denominada Impuesto que proporciona


funcionalidad básica para calcular el impuesto sobre las ventas de un estado.
Las clases derivadas de Impuesto, como ImpuestoDistrito o
ImpuestoRegion, podrían implementar métodos como CalcularImpuesto().

Por ejemplo, el tipo impositivo de un distrito podría ser distinto del tipo
impositivo de una región. Las clases que hereden de ImpuestoBase tendrán
un método CalcularImpuesto, pero el modo como se calcule realmente el
impuesto podría variar en cada una de las clases derivadas.

Impuesto
CalcularImpuesto( )

ImpuestoDistrito ImpuestoRegion
CalcularImpuesto( ) CalcularImpuesto( )

Figura 2: Implementando Polimorfismo

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 39

1.2.4 Implementando una clase aplicando Polimorfismo


En Visual C#, un método que será reemplazado en una clase derivada se
declara con el modificador virtual. En una clase derivada, el método
reemplazado se declara con el modificador override.

En este ejemplo se puede implementar el método Promedio(), el cual realiza el


cálculo del promedio de las 2 notas ingresadas.

La clase Heredada implementa el método Promedio() sobreescribiendo su


proceso.

public class ClaseRegistro


{
public overridable double Promedio(int n1, int n2)
{
return (n1 + n2)/2
}
}
public class ClaseRegistroPOOI: ClaseRegistro
{

public override double Promedio(int n1, int n2)


{
// nuevo calculo del promedio de notas para el curso de POOI
return (n1 + 2*n2)/3
}
}

Definición de Herencia Múltiple: Interface


Las Interfaces definen las propiedades, métodos y eventos que pueden
implementar las clases. Las interfaces le permiten definir características como
grupos pequeños de propiedades, métodos y eventos estrechamente
relacionados; de esta forma se reducen los problemas de compatibilidad, ya
que pueden desarrollarse implementaciones mejoradas para las interfaces sin
poner en peligro el código existente.

Se pueden agregar nuevas características en cualquier momento, mediante el


desarrollo de implementaciones e interfaces adicionales.

Una clase se puede heredar de esta interfaz utilizando dos puntos en vez de
utilizar la palabra clave Implements.

CIBERTEC CARRERAS PROFESIONALES


40

LABORATORIO 2.1
Manejo de Clases Heredadas
Las empresas de producción necesitaban trasladar su materia prima a provincia y, es
por ello que se crean las empresas de Transportes las cuales se dedican al traslado
de la materia prima cobrando por ello un flete: costo de la tarifa por la cantidad de
Toneladas Métricas (TM). Estas empresas de transporte registraban el nombre del
Destinatario, la dirección del destino (Departamento del país) y la cantidad de TM que
trasladaban, la tarifa era estándar: S/.150 por TM.

La empresa IVOVIC está constituida bajo el concepto del costo de la tarifa única.

La empresa Leonidas maneja el costo de la tarifa según su destino: para Arequipa,


Ilo o Tacna la tarifa es S/.200; para Piura, Tumbes y Cajamarca la tarifa es de S/.220;
el resto conserva su mismo costo: S/.150; además toda empresa que traslade su
materia prima por esta empresa deberá pagar por concepto de seguro el importe del
0.5% del flete, obteniendo así el monto: suma del flete y del seguro.

 Diseñe la Clase Base, definiendo sus atributos, propiedades y métodos.


 Defina las Clases Derivadas.
 Realizar la programación de las Clases Derivadas.

Diseño de las Clases

Clase Transporte,
representa la clase
BASE

Clase IVOVIC, clase Clase LEONIDAS,


DERIVADA de la clase representa la clase
BASE Transportes DERIVADA de la clase
BASE Transportes

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 41

1. Inicio del Proyecto


 En la Ventana New Project , seleccione el Plantilla Visual C#
 Seleccione la plantilla Aplicacion de Windows Form
 Asigne un nombre al proyecto: appSemana02
 Presione el botón ACEPTAR

1. Selecciona la plantilla Visual C#

2. Selecciona la plantilla Aplicación


de Windows Form

3. Asigna el nombre del proyecto

4. Asigna la ubicación del


proyecto

2. Diseño de la Clase Base


Para agregar la clase base
• En el menú principal selecciona la opción PROYECTO
• Seleccione la opción Agregar Clase

Selecciona la opción
Agregar Clase

CIBERTEC CARRERAS PROFESIONALES


42

En la ventana Agregar Nuevo Elemento, seleccione la plantilla Clase.


Asigne el nombre de la clase: Transporte. Presione el botón AGREGAR.

1. Selecciona la opción
CLASE

2. Asigne el nombre a la
clase: TRANSPORTES

En la Clase Transporte, agregue los atributos y propiedades de la clase (el alcance


será Protected para que los atributos sean heredados).

Para una clase base, la


definición de atributos y
propiedades de la clase es
de alcance protected

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 43

Defina el constructor de la clase para inicializar los atributos.

Constructor de la clase,
inicializa los atributos

Para concluir defina el método Flete() la cual retorna el producto de la tarifa por las
toneladas métricas de la materia prima

Método que retorna el


valor del Flete, el cual se
obtiene del producto de la
tarifa por tm

CIBERTEC CARRERAS PROFESIONALES


44

3. Defina la Clase Derivada IVOVIC


Agregue al proyecto la clase IVOVIC, tal como se muestra

Asigne el nombre a
la clase: IVOVIC

La clase IVOVIC es la clase heredada de la clase Transporte, tal como se muestra.

Definición de la clase
IVOVIC como clase
heredada de la clase
Transporte

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 45

4. Diseño y Programación del Formulario


Procedemos a diseñar el Formulario: insertamos controles: Label, ComboBox, TextBox
y Button.

TextBox, (Name): txtcliente

ComboBox, (Name):
cbodestino

TextBox, (Name): txtTM

TextBox, (Name): txttarifa

TextBox, (Name): txtFlete

Editando el control comboBox.


Para agregar elementos al control comboBox, desde la opción tareas de ComboBox,
selecciona la opción Editar elementos. Agregar los elementos, tal como se muestra, al
finalizar presiona el botón ACEPTAR.

Selecciona la opción

CIBERTEC CARRERAS PROFESIONALES


46

A continuación programa el botón Procesar: instancia la clase IVOVIC, ingresar los


datos: destinatario, destino y TM y se mostraran los resultados: tarifa y flete.

Defina la instancia de
la clase IVOVIC
llamada IV

Ingreso de datos a
través de las
propiedades

Visualiza los
resultados

5. Ejecución del Formulario


Presione F5, para ejecutar; ingresamos datos en el cliente, destino y TM, al presionar
el botón Procesar se visualiza la tarifa y el flete.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 47

TRABAJANDO CON LA CLASE LEONIDAS


1. Defina la Clase Derivada LEONIDAS
A continuación, agregar al proyecto la clase llamada LEONIDAS, tal como se muestra:

Asigne el nombre a la
clase: LEONIDAS

Defina la clase LEONIDAS como clase heredada de la clase TRANSPORTE, tal como
se muestra.

Definición de la clase
LEONIDAS que hereda de
la clase Transportes

CIBERTEC CARRERAS PROFESIONALES


48

En la Clase LEONIDAS debe implementar métodos para calcular la tarifa por destino,
el seguro y el Monto

Método Tarifa()
retorna la tarifa
según el destino

Función Seguro() el cual


retorna un porcentaje del
valor del Flete()

Función Monto() que


retorna la suma del valor
del Flete() y el Seguro()

2. Diseño y Programación del Formulario para la Clase LEONIDAS


A continuación vamos a diseñar el Formulario; para esto insertamos controles: Label,
TextBox y Button.

TextBox, (Name):
txtcliente

ComboBox, (Name):
cbodestino

TextBox, (Name): txtTM

TextBox, (Name):
txttarifa

TextBox, (Name):
txtFlete

TextBox, (Name):
txtSeguro

TextBox, (Name):
txtMonto

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 49

A continuación vamos a programar el botón Procesar donde instanciamos la clase


LEONIDAS donde se ingresarán los datos: destinatario, destino y TM, se ejecutará el
método Tarifario() y se mostraran los resultados: tarifa, flete, seguro y monto.

Defina la instancia de la
clase LEONIDAS

Ingreso de datos a
través de las
propiedades

Ejecutar los métodos y


visualiza los resultados

3. Ejecución del Formulario


Ejecutamos el Formulario de la Empresa LEONIDAS. Ingresamos los datos del cliente,
destino y TM. Al presionar el botón Procesar se visualiza la tarifa, el seguro, el flete y
el monto.

CIBERTEC CARRERAS PROFESIONALES


50

LABORATORIO 2.2
Herencia y Polimorfismo
Las empresas Fotocopiadoras son empresas de Servicios que se dedican a realizar el
proceso de fotocopiado al por mayor.

En este proceso, debemos ingresar el Nombre del Cliente, la descripción del


documento y el número de copias por documento, por ejemplo: 2 copias de recibo por
honorarios.
Las empresas cobran por cada copia S/. 0.10, obteniendo el Importe de las fotocopias:
(costo de la fotocopia)(cantidad de documentos)(número de copias por documento).

La Empresa FULL COPY es una empresa fotocopiadora que realiza el servicio de


copia. El costo de su servicio está en función al tamaño del documento: si el
documento es A4 el costo de la copia es S/.0.08; si el documento es A3 el costo de la
copia es S/.0.15 y los demás es de S/0.10, obteniendo así el importe de las fotocopias.

Realizar:
 Diseñe la Clase Base FOTOCOPIAS definiendo sus atributos, propiedades,
métodos y el constructor.
 Defina la Clase Derivada FULL COPY la cual permita sobrescribir el cálculo del
importe
 Diseñar el Formulario para FULL COPY y programación sus controles.

Diseño de las Clases


Clase Fotocopias,
representa la clase
BASE

Clase FULLCOPY,
representa la clase
DERIVADA de la clase
Base FOTOCOPIAS

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 51

1. Diseño de la Clase Fotocopias


A partir del Diagrama de Clases, vamos a definir la clase Fotocopia.
 En la ventana Agregar Nuevo Elemento,
 Seleccione la plantilla Clase.
 Asigne el nombre Fotocopia, presione el botón AGREGAR

Asigne el nombre a
la clase: Fotocopia

En la Clase Fotocopias, agregue los atributos de la clase y el constructor.

Definición de los
atributos y
propiedades de la
clase Transporte

Defina el constructor,
inicializamos el
atributo tarifa y
cantidad

CIBERTEC CARRERAS PROFESIONALES


52

Defina la función Monto, esta función podrá ser sobrescrita por las clases derivadas a
través de la palabra clave virtual.

Método virtual Monto(), que


permita ser sobre escrita
por las clases heredadas

2. Diseño de la Clase FULLCOPY

Defina la Clase, la cual se llamará FULLCOPY la cual hereda de la clase base


Fotocopia, tal como se muestra

Asigne el nombre a
la clase: FULLCOPY

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 53

Definición de la clase
FULLCOPY que hereda de la
clase Fotocopias

Para trabajar con el tamaño del documento, defina el atributo tipo de tipo String. A
continuación, defina el método Monto() que permite realizar un nuevo cálculo.

Defina el método Monto() la


cual se sobre escribe de la
clase base para definir
nuevos procesos

CIBERTEC CARRERAS PROFESIONALES


54

3. Diseño y Programación del Formulario


A continuación vamos a diseñar el Formulario; para esto insertamos controles: Label,
TextBox y Button.

TextBox, (Name):
txtcliente

TextBox, (Name):
txtDescripcion

ComboBox, (Name):
cboTipo

TextBox, (Name):
txtCantidad

TextBox, (Name):
txttarifa

TextBox, (Name):
txtMonto

A continuación programa el botón Procesar: instancie la clase FULLCOPY, ingrese


los datos: cliente, descripción y tipo de documento y la cantidad de copias y se
mostraran los resultados: tarifa y monto.

Defina la instancia de la
clase FULLCOPY

Ingreso de datos a través


de las propiedades

Visualiza los resultados

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 55

4. Ejecución del Formulario

Presione F5, ingrese los datos: nombre del cliente, descripción del documento, el tipo
de documento y la cantidad, presione el botón Procesar y se visualizan los resultados.

LABORATORIO 2.3: Practica Propuesta


Las empresas de PRÉSTAMOS son empresas dedicadas al préstamo de dinero a
diversos clientes que vivan en Lima. Estas empresas de PRÉSTAMOS registran el
nombre del Cliente que solicita el préstamo, el monto de dinero solicitado y el tiempo
de duración del prestamos (meses). La tasa de interés mensual por el préstamo es del
3% mensual, visualizando el monto que el cliente abonará en forma mensual.

La empresa J&M PRESTAMOS también está constituida bajo el concepto de las


empresas de préstamos. Considerando que el cliente que solicita el préstamo lo puede
hacer con una determinada moneda, según el tipo de moneda que solicita el préstamo
se le asignará una tasa de interés mensual:

• Préstamo en soles: 2.8% de interés mensual


• Préstamo en dólares: 3.0% de interés mensual
• Préstamo en euros: 2.5% de interés mensual

Se deberá visualizar el monto mensual que abonará el cliente.


Se pide:
1. Diagrama de Clases donde se visualice la Clase Base y sus clases derivadas
2. Diseño de la Clase Base, definiendo sus atributos, propiedades y métodos
3. Defina las clases Derivadas implementando el concepto del Polimorfismo
4. Realizar la programación de las Clases Derivadas

CIBERTEC CARRERAS PROFESIONALES


56

Resumen
 En la programación orientada a objetos, podemos compartir las características de
una clase base en otras clases derivadas de la clase base. Esto se denomina
herencia.
 La herencia puede utilizarse para derivar una clase de una clase existente. La
clase derivada puede heredar todas las propiedades, métodos, miembros de datos,
eventos y controladores de eventos de la clase base, facilitando la reutilización de
la clase base por toda la aplicación.
 La palabra clave Inherits se utiliza para definir una clase derivada que hereda de
una clase base.
 La palabra clave MustInherit se utiliza para definir clases que no están pensados
para ser utilizados directamente como objetos instanciados. La clase resultante
debe ser heredada como una clase base para utilizarla en el objeto de una clase
derivada instanciada.
 La palabra clave NotInheritable se utiliza para definir una clase que no puede
utilizarse como clase base para herencia. Si otra clase intenta heredar de esta
clase, se generará un error de compilación.
 Utilizamos el acceso Protected para limitar el ámbito de una propiedad, método,
miembro de datos, evento o controlador de eventos a la clase que los define y
cualquier clase derivada basada en esa clase base.
 Polimorfismo hace referencia a la capacidad de definir múltiples clases con
diferentes funcionalidades pero con métodos o propiedades de nombres idénticos
que pueden utilizarse de forma intercambiable por el código cliente en tiempo de
ejecución.
 Para especificar que se quiere especializar o sobreescribir un método en una
nueva clase se declara este en la clase hija de la misma forma que está declarado
en la clase padre y se le coloca el modificador “Override”.
 Los métodos virtuales son declarados en Visual C# con el modificador virtual.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://msdn.microsoft.com/es-es/library/ms173149.aspx
http://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx
http://support.microsoft.com/kb/307205/es
http://msdn.microsoft.com/es-es/library/ms173152.aspx

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 57

UNIDAD

2
MANEJO DE COLECCIONES
LOGRO DE LA UNIDAD DE APRENDIZAJE

Al finalizar la unidad, el alumno elabora operaciones eficientes de almacenamiento,


búsqueda y consultas mediante el empleo de colecciones apropiadas del .NET
Framework 4.5

TEMARIO

2.1. Tema 3: Manejo de colecciones y enumeradores


2.1.1. Colecciones en NET FrameWork 4.5
2.1.1.1. Manejo de la colección ArrayList: métodos y propiedades
2.1.1.2. Manejo de la colección List(Of): métodos y propiedades

2.2. Tema 4: LINQ y expresiones Lambda


2.2.1. Lenguaje integrado de consultas
2.2.1.1. LINQ: definición, cláusulas
2.2.1.2. LINQ y consulta de datos
2.2.1.3. Expresiones lambda, manejo de consultas

ACTIVIDADES PROPUESTAS

 Los alumnos desarrollan los laboratorios de esta semana


 Los alumnos desarrollan aplicaciones para administrar datos a través de
colecciones.
 Los alumnos desarrollan aplicaciones utilizando la metodología orientada a
objetos: clases y objetos.

CIBERTEC CARRERAS PROFESIONALES


58

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 59

2.1 COLECCIONES EN .NET FRAMEWORK


Una colección es una forma de agrupar y manejar objetos relacionados. Por
ejemplo, cada formulario tiene una colección de controles, así, este objeto
representa a todos los controles que están contenidos en el formulario.

Esto permite que podamos acceder a un control especifico de la colección a través


de la estructura de control foreach en C#, For Each… Next en Visual Basic

.NET Framework ofrece clases especializadas para almacenamiento y


recuperación de datos. Estas clases proporcionan compatibilidad con pilas, colas,
listas y tablas hash. La mayoría de las clases de colección implementan las mismas
interfaces. Si es necesario, puede crear sus propias clases de colección
implementando estas interfaces. Debe determinar qué tipo de colección es el más
adecuado para sus necesidades.

2.1.1. Colecciones en NET Framework 4.5

Las clases de colección de .NET Framework se definen en los espacios de


nombres:
 System.Collections,
 System.Collections.Generic
 System.Collections.Specialized y
 System.Collections.ObjectModel.

SYSTEM.COLLECTIONS
Las clases del espacio de nombres System.Collections no almacenan los
elementos como objetos de un tipo específico, sino como objetos de tipo
Object.

Existe una amplia gama de clases que derivan de System.Collections y


que pueden utilizarse para implementar colecciones. Debemos tener
cuidado al momento de elegir un tipo de clase base para nuestra colección
con el fin de no limitar su funcionalidad. En la tabla siguiente se muestran
algunas de las clases que se utilizan comúnmente:

Clase Descripción
ArrayList Implementa la interfaz IList utilizando una matriz cuyo
tamaño aumenta dinámicamente cuando es necesario.
Stack Representa una colección simple no genérica de objetos
último en entrar, primero en salir (LIFO).
Queue Representa una colección de objetos primero en entrar,
primero en salir (FIFO).
HashTable Representa una colección de pares de clave y valor que
se organizan por código hash de la clave.
BitArray Administra una matriz compacta de valores de bit, que
se representan como valores Boolean, donde True
indica que el bit está activado (1) y False indica que el
bit está desactivado (0).

CIBERTEC CARRERAS PROFESIONALES


60

SYSTEM.COLLECTIONS.GENERIC
Los espacios de nombres System.Collections.Generic proporcionan tipos
genéricos que permiten crear colecciones con establecimiento inflexible de
tipos y especificar el tipo de datos de los elementos cuando se crean.

En la tabla siguiente se muestran algunas de las clases que se utilizan


comúnmente:

Clase Descripción
Dictionary Representa una colección de pares de clave y valor que
se organizan por claves.
Stack Representa una colección simple no genérica de objetos
último en entrar, primero en salir (LIFO).
Queue Representa una colección de objetos primero en entrar,
primero en salir (FIFO).
SortedList Representa una colección de pares de clave y valor que
se ordenan por claves según la implementación de la
interfaz IComparer asociada.
List(Of) Representa una lista de objetos fuertemente tipados a la
que se puede obtener acceso por índice. Proporciona
métodos para buscar, ordenar y manipular listas.

SYSTEM.COLLECTIONS.SPECIALIZED
El espacio de nombres System.Collections.Specialized proporciona
clases de colección especializadas y con establecimiento inflexible de tipos,
como colecciones de sólo cadena y diccionarios híbridos y de lista
vinculada.

En la tabla siguiente se muestran algunas de las clases que se utilizan


comúnmente:

Clase Descripción
HybridDictionary Implementa la interfaz IDictionary utilizando
ListDictionary mientras la colección es pequeña; a
continuación, cambia a Hashtable cuando la
colección aumenta.
OrderedDictionary Representa una colección de pares de clave y valor
que se ordenan por claves o por índices.
StringDictionary Implementa una tabla hash con la clave y el valor
con establecimiento inflexible de tipos de forma que
sean cadenas en lugar de objetos.

2.1.1.1 Manejo de la colección ARRAYLIST

Es aquella colección que almacena un conjunto de objetos, implementa la


interfaz IList mediante una matriz cuyo tamaño aumenta dinámicamente
según se requiera.

No se garantiza que la matriz ArrayList esté ordenada. Debe ordenar la


matriz ArrayList antes de realizar operaciones (como BinarySearch) que
requieren que la matriz ArrayList esté ordenada.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 61

La capacidad de un objeto ArrayList es el número de elementos que puede


contener el objeto ArrayList. La capacidad inicial predeterminada de un
objeto ArrayList es 0. Conforme se agregan elementos a un objeto
ArrayList, la capacidad aumenta automáticamente según lo requiera la
reasignación. Se puede disminuir la capacidad llamando al método
TrimToSize o estableciendo explícitamente la propiedad Capacity.

Se puede obtener acceso a los elementos de esta colección utilizando un


índice entero. Los índices de esta colección están basados en cero.

El objeto ArrayList acepta referencia de objeto null (Nothing en Visual


Basic) como valor válido y permite elementos duplicados.

Métodos del ArrayList

Método Descripción
AddRange Agrega los elementos de ICollection al final de
ArrayList.

Add Agrega un objeto al final de ArrayList.

Clear Quita todos los elementos de la clase ArrayList

GetEnumerator Sobrecargado. Devuelve un enumerador que recorre en


iteración la colección de objetos ArrayList.

IndexOf Sobrecargado. Devuelve el índice de base cero de la


primera aparición de un valor en la ArrayList o en una
parte de ella.

Insert Inserta un elemento en la clase ArrayList en el índice


especificado.

Remove Quita la primera aparición de un objeto concreto de


ArrayList.

RemoveAt Quita el elemento en el índice especificado de


ArrayList.
ToArray Sobrecargado. Copia los elementos de ArrayList en
una nueva matriz.

2.1.1.2 Manejo de la colección List (Of (T)

Representa una lista de objetos fuertemente tipados a la que se puede


obtener acceso por índice. Proporciona métodos para buscar, ordenar y
manipular listas.

La clase List(Of T) utiliza un comparador de igualdad y un comparador de


orden.

Los métodos como Contains, IndexOf, LastIndexOf y Remove utilizan un


comparador de igualdad para los elementos de lista.

CIBERTEC CARRERAS PROFESIONALES


62

Los métodos como BinarySearch y Sort utilizan un comparador de orden


para los elementos de lista. El comparador predeterminado para el tipo T se
determina de la siguiente manera. Si el tipo T implementa la interfaz
genérica IComparable(Of T), el comparador predeterminado será el
método CompareTo(T) de dicha interfaz.

En la tabla siguiente se muestran los métodos de la clase List(Of T):

Método Descripción
Add Agrega un objeto al final de List(Of T).

BinarySearch(T, Busca un elemento en toda la colección List(Of T)


IComparer(Of T)) ordenada utilizando el comparador predeterminado
y devuelve el índice de base cero del elemento.

Clear Quita todos los elementos de List(Of T).

Constaints Determina si un elemento se encuentra en List(Of


T).

Find Busca un elemento que cumpa las condiciones


definidas por el predicado especificado y devuelve
la primera aparición en el todo el objeto List(Of T).

GetEnumerator Devuelve un enumerador que itera por la colección


List(Of T).

IndexOf(T) Busca el objeto especificado y devuelve el índice de


base cero de la primera aparición en todo el objeto
List(Of T).

Insert Inserta un elemento en List(Of T) en el índice


especificado

Remove Quitar la primera aparición del objeto especificado


de List(Of T).

RemoveAt Quita el elemento situado en el índice especificado


del List(Of T).

Reverse Invierte el orden de los elementos de todo el objeto


List(Of T).

Sort Ordena los elementos de todo el objeto List(Of T),


utilizando el comparador definido.

ToArray Copia los elementos de List(Of T), en una nueva


matriz

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 63

Clase Genérica: Dictionary (TKey, TValue)


Inicializa una nueva instancia de la clase Dictionary que está vacía, tiene la
capacidad inicial predeterminada y utiliza el comparador de igualdad
predeterminado para el tipo de clave.

Cada clave de una colección Dictionary debe ser única de acuerdo con el
comparador de igualdad predeterminado.

Dictionary requiere una implementación de igualdad para determinar si las


claves son iguales. Este constructor utiliza el comparador de igualdad
genérico predeterminado, EqualityComparer.Default. Si el tipo TKey
implementa la interfaz genérica System.IEquatable, el comparador de
igualdad predeterminado utiliza esa implementación. De forma alternativa,
se puede especificar una implementación de la interfaz genérica
IEqualityComparer con un constructor que acepte un parámetro
Comparer.

En la tabla siguiente se muestran los métodos de la clase Dictionary:

Método Descripción
Add Agrega la clave y el valor especificados al diccionario

Clear Quita todas las claves y valores de la colección


Dictionary

ContainsKey Determina si la colección Dictionary contiene la clave


especificada

ContainsValue Determina si la colección Dictionary contiene un valor


específico.

GetEnumerator Devuelve un enumerador que itera por la colección


Dictionary

Remove Quitar la primera aparición del objeto especificado de


Dictionary

ToString Devuelve una clase String que representa la clase


Object actual

En la tabla siguiente se muestran las propiedades de la clase Dictionary:

Método Descripción
Comparer Se utiliza para determinar la igualdad de claves para el
diccionario

Count Obtiene el número de pares clave/valor incluidos en la


colección Dictionary

Item Obtiene o establece el valor asociado a la clave


especificada.

Keys Obtiene una colección que contiene las claves de la

CIBERTEC CARRERAS PROFESIONALES


64

colección Dictionary

Values Obtiene una colección que contiene los valores de la


colección Dictionary

Clase Genérica: HybridDictionary


Implementa IDictionary mediante ListDictionary mientras la colección es
pequeña, después cambia a Hashtable cuando la colección se hace
grande.

La instrucción foreach del lenguaje C# (for each en Visual Basic) requiere


el tipo de cada elemento de la colección. Como los elementos de
HybridDictionary son pares de clave y valor, el tipo del elemento no se
corresponde con el tipo de la clave ni con el del valor. En su lugar, el tipo de
elemento es la estructura DictionaryEntry.

En la tabla siguiente se muestran los métodos de la clase HybridDictionary:

Método Descripción
Add Agrega la clave y el valor especificados a la colección

Clear Quita todas las claves y valores de la colección

Contains Determina si la colección HybridDictionary contiene la


clave especificada

GetEnumerator Devuelve un enumerador que itera por la colección

Remove Quitar la primera aparición del objeto especificado

ToString Devuelve una clase String que representa la clase


Object actual

En la tabla siguiente se muestran las propiedades de la clase


HybridDictionary:

Método Descripción
Count Obtiene el número de pares clave/valor incluidos en la
colección Dictionary

Item Obtiene o establece el valor asociado a la clave


especificada.

Keys Obtiene una colección que contiene las claves de la


colección Dictionary

Values Obtiene una colección que contiene los valores de la


colección Dictionary

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 65

LABORATORIO 3.1
Manejo de datos en un ArrayList
Se desea implementar un programa que permita registrar los libros que se encuentran
en la biblioteca Nacional. En este proceso debemos ingresar: el código del libro, el
titulo, la materia del libro, el año de edición del libro y el nombre del autor.
Se pide:
1. Defina una clase llamada Libros que esté conformada por sus atributos,
propiedades y métodos.
2. Defina un ArrayList que permita almacenar los libros
3. Programe el botón Agregar para Agregar Libros
4. Programe el botón Listado para Listar los Libros.

AGREGANDO UN PROYECTO
Desde el IDE del Visual Studio, selecciona la opción NUEVO PROYECTO.
1. Selecciona la plantilla Visual C#
2. Selecciona aplicación de Windows Forms
3. Asigne un nombre al proyecto appSemana03
4. Presiona el botón ACEPTAR

1. Selecciona la plantilla Visual C#

2. Selecciona la plantilla Aplicación


de Windows Form

3. Asigna el nombre del proyecto

4. Asigna la ubicación del


proyecto

CIBERTEC CARRERAS PROFESIONALES


66

1. Definición de la clase Libro


Como primer paso defina la clase Libros los cuales están conformado por los atributos
y sus propiedades para cada atributo, tal como se muestra.

Definicion de los
atributos y
propiedades de la
clase

2. Diseño del Formulario


A continuación diseñe el formulario para el registro de libros, tal como se muestra

TextBox (Name): txtCodigo

TextBox (Name): txtTitulo

ComboBox (Name):
cboMateria

TextBox (Name): txtAutor

TextBox (Name): txtEdicion

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 67

Agregando elementos al control comboBox

Desde la lista de
tareas, selecciona
la opción

Agregar los
elementos al control

Para visualizar los registros, agrega el control ListView al Formulario, tal como se
muestra

Control ListView
(name) lvLibros

CIBERTEC CARRERAS PROFESIONALES


68

Para visualizar los registros, agrega el control ListView al Formulario. Para


configurarlo, seleccione en la Lista de Tareas la opción Edit Columns, tal como se
muestra en la figura.

Para agregar columnas,


selecciona desde la lista de
tareas la opción EDIT
COLUMNS

A continuación, vamos a configurar el ListView en el Editor

Para agregar columnas,


presione el botón ADD y
asigne el título de la columna
en la propiedad TEXT

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 69

Ingresada las columnas, debemos de configurar el ListView para visualizar éstas, en la


lista de tareas, seleccione de la opción View el ítem Details, tal como se muestra.

Asigne en la
propiedad View el
valor Details, para
visualizar las líneas
de cuadricula

Para que el ListView muestre líneas, en la ventana de propiedades seleccione la


propiedad GridLines y seleccione el valor de true.

Permite mostrar
líneas de
cuadricula en el
control ListView

CIBERTEC CARRERAS PROFESIONALES


70

3. Programación en el Formulario
Instanciar el ArrayList Biblioteca, a nivel de Formulario, tal como se muestra

Agregar la
referencia
System.Collections

Declara la instancia
del ArrayList
(Biblioteca) a nivel
Class.

Creamos el método Listado(), el cual permite visualizar los registros almacenados en


el ArrayList para visualizarlos en el control ListView

Primero limpiamos los


ítems del Listview

Recorrer los registros


de Biblioteca, uso del
foreach()

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 71

Para agregar libros debemos programar el botón Agregar: instancie la clase Libros,
ingrese los datos a la instancia, agregar el objeto al ArrayList Biblioteca y Listar

Instanciar la clase
Libro, ingreso de
datos al objeto

Agregar el objeto
book al ArrayList

Ejecutar el metodo
Listado()

Para eliminar un registro, recorremos los objetos de la colección; si encuentra el objeto


porsu código, se elimina de la colección y se vuelve a listar

Recorrer los
registros de la
colección

Si encuentra el
registro, eliminar por
su código

CIBERTEC CARRERAS PROFESIONALES


72

4. Ejecución del Formulario

Presione F5, ingrese los datos en los controles, para agregar el registro a la colección
presione el botón AGREGAR.
Para eliminar un registro, ingrese el código del libro y presiona el botón ELIMINAR

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 73

LABORATORIO 3.2
Se desea implementar un programa que permita registrar los participantes de un
SEMINARIO. En este proceso debemos ingresar: el DNI del participante, nombre y
apellido, teléfono y el email. Se pide:
1. Defina una clase llamada Postulante.
2. Defina
aA una colección de tipo List(Of Participante)
3. Programe el botón Agregar para Agregar Participante a la coleccion
4. Programe un procedimiento para listar
5. Programe el botón ACTUALIZAR que permite actualizar un participante por su DNI.

1. Diseño de la clase
Primero, diseña la clase llamado Datos el cual contiene los siguientes atributos menos
el atributo DNI, el cual será la llave de la colección

2. Diseño del Formulario


Agrega un formulario para el registro de Postulantes, tal como se muestra

TextBox (Name): txtDNI

TextBox (Name): txtNombre

TextBox (name): txtApellido

TextBox (Name): txtTelefono

TextBox (Name): txtEmail

ListView: lvParticipantes

CIBERTEC CARRERAS PROFESIONALES


74

3. Programación.
Defina una instancia de la colección List<Participante>, tal como se muestra

Para listar los elementos, defina el método Listado dentro del Formulario, tal como se
muestra

Primero limpiamos los


ítems del Listview

Recorrer los registros


de Participantes, uso
del foreach()

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 75

Programa el botón Agregar para ingresar un Postulante a la colección, tal como se


muestra

Instanciar la clase
Participante,
ingreso de datos

Agregar el objeto a
la colección List<>

Ejecutar el metodo
Listado()

Programa el botón Buscar para buscar un postulante por su DNI, si lo encuentra


visualiza los datos en los controles; sino visualice un mensaje, tal como se muestra

Recorrer los
registros de la
colección

Si encuentra el
registro por su DNI,
actualizar los datos

CIBERTEC CARRERAS PROFESIONALES


76

Para comprobar las operaciones, presione F5, ingrese los datos del Postulante y
presione el botón AGREGAR, donde se agrega a la colección y se visualiza el registro
en el ListView1.

LABORATORIO 3.3
Implemente una Colección de tipo ArrayList para registrar los vehículos que la
empresa ha comprado para su posterior venta. Defina una clase que almacene los
datos de un vehículo: placa, descripción, año, fabricante.
Defina una Colección de tipo ArrayList que permita almacenar los vehículos.
Realice los siguientes procesos:
Agregar: se agrega los vehículos a la colección ArrayList, donde se verificará que la
placa no se repita.
Listado: visualice en el ListView los datos de los vehículos almacenados en el
ArrayList.
Quitar: Se deberá ingresar el número de la placa del vehículo, si existe, quitarlo de la
cola, si no existe, enviar un mensaje indicando que no existe

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 77

LABORATORIO 3.4
Se desea implementar un programa que permita registrar el personal que trabajan en
TRIVECA SAC. En este proceso ingrese: el DNI, nombre y apellido, dirección y fecha
de nacimiento. Se pide:
1. Defina una clase llamada Personal que esté conformada por los datos del Personal.
2. Defina una colección de tipo List<Of> de Personal
3. Programe el botón Agregar para Agregar Personal
4. Programe el botón Eliminar que permite eliminar un Personal por su DNI.
5. Programe el botón Modificar, seleccione un registro desde el control ListView el cual
se visualiza los datos en el ListView, modifique los datos, menos el DNI, para realizar
la actualización de los datos y volver a listar los datos modificados

CIBERTEC CARRERAS PROFESIONALES


78

Resumen
 Una colección es una forma de agrupar y manejar objetos relacionados. Por
ejemplo, cada formulario tiene una colección de controles, así, este objeto
representa a todos los controles que están contenidos en el formulario.
 Las clases del espacio de nombres System.Collections no almacenan los
elementos como objetos de un tipo específico, sino como objetos de tipo Object.
 Los espacios de nombres System.Collections.Generic proporcionan tipos
genéricos que permiten crear colecciones con establecimiento inflexible de tipos y
especificar el tipo de datos de los elementos cuando se crean.
o Dictionary, representa una colección de pares de clave y valor que se organizan
por claves.
o SortedList, representa una colección de pares de clave y valor que se ordenan
por claves según la implementación de la interfaz IComparer asociada.
 El espacio de nombres System.Collections.Specialized proporciona clases de
colección especializadas y con establecimiento inflexible de tipos, como
colecciones de sólo cadena y diccionarios híbridos y de lista vinculada.
o HybridDictionary, implementa la interfaz IDictionary utilizando ListDictionary
mientras la colección es pequeña; a continuación, cambia a Hashtable cuando
la colección aumenta
o OrderedDictionary, representa una colección de pares de clave y valor que se
ordenan por claves o por índices.
 ArrayList, implementa la interfaz IList mediante una matriz cuyo tamaño aumenta
dinámicamente según se requiera. La capacidad de un objeto ArrayList es el
número de elementos que puede contener el objeto ArrayList. La capacidad inicial
predeterminada de un objeto ArrayList es 0. Conforme se agregan elementos a un
objeto ArrayList, la capacidad aumenta automáticamente según lo requiera la
reasignación. Se puede disminuir la capacidad llamando al método TrimToSize o
estableciendo explícitamente la propiedad Capacity
 La clase List(Of T), representa una lista de objetos fuertemente tipados a la que se
puede obtener acceso por índice. Proporciona métodos para buscar, ordenar y
manipular listas. La clase List(Of T) utiliza un comparador de igualdad y un
comparador de orden. Los métodos como Contains, IndexOf, LastIndexOf y
Remove utilizan un comparador de igualdad para los elementos de lista
 La clase Dictionary, inicializa una nueva instancia de la clase Dictionary que está
vacía, tiene la capacidad inicial predeterminada y utiliza el comparador de igualdad
predeterminado para el tipo de clave. Cada clave de una colección Dictionary
debe ser única de acuerdo con el comparador de igualdad predeterminado.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://msdn.microsoft.com/es-es/library/system.collections.generic(v=vs.80).aspx
 http://msdn.microsoft.com/es-es/library/system.collections.aspx
 http://www.elguille.info/NET/library/System.Collections.aspx

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 79

UNIDAD

2
MANEJO DE COLECCIONES
LOGRO DE LA UNIDAD DE APRENDIZAJE

Al finalizar la unidad, el alumno elabora operaciones eficientes de almacenamiento,


búsqueda y consultas mediante el empleo de colecciones apropiadas del .NET
Framework 4.5

TEMARIO

2.1. Tema 3: Manejo de colecciones y enumeradores


2.1.1. Colecciones en NET FrameWork 4.5
2.1.1.1. Manejo de la colección ArrayList: métodos y propiedades
2.1.1.2. Manejo de la colección List(Of): métodos y propiedades

2.2. Tema 4: LINQ y expresiones Lambda


2.2.1. Lenguaje integrado de consultas
2.2.1.1. LINQ: definición, cláusulas
2.2.1.2. LINQ y consulta de datos
2.2.1.3. Expresiones lambda, manejo de consultas

ACTIVIDADES PROPUESTAS

 Los alumnos desarrollan los laboratorios de esta semana


 Los alumnos desarrollan aplicaciones para administrar datos a través de
colecciones.
 Los alumnos desarrollan aplicaciones utilizando la metodología orientada a
objetos: clases y objetos.

CIBERTEC CARRERAS PROFESIONALES


80

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 81

2.2 LENGUAJE INTEGRADO DE CONSULTAS (LINQ)


2.2.1 Lenguaje integrado de consultas

LINQ (Language-Integrated Query) es un lenguaje de consulta de objetos en


memoria, bases de datos, y XML (Extensible Markup Language) el cual se
encuentra integrado en el Framework .NET desde la versión 3.5. Este lenguaje de
consulta es independiente de la fuente de datos, es decir, que contamos con un
único lenguaje que nos permite hacer consultas sobre cualquier fuente de datos sin
tener que aprender cada uno de los lenguajes disponibles (XQuery para XML, SQL
para bases de datos).

2.2.1.1. LINQ: definición, claúsulas

Utilizamos el término LINQ para indicar que las consultas son una característica
integrada del lenguaje de programación (por ejemplo C#, Visual Basic). El lenguaje
de consulta integrada permite que las expresiones de consulta se beneficien de los
metadatos ricos, verificación de sintaxis en tiempo de compilación, tipado estático y
ayuda IntelliSense que antes estaban disponibles solo para el código imperativo.
LINQ también hacen posible aplicar una única facilidad declarativa de propósito
general a toda la información en memoria, y no solo a la información proveniente de
fuentes externas.

Figura 1: Arquitectura de LINQ


Referencia: http://www.devjoker.com/

LINQ .NET definen un conjunto de operadores de consulta estándar de propósito


general que hacen posible que las operaciones de recorrido, filtro y proyección
sean expresadas de una manera directa pero declarativa en cualquier lenguaje de
programación. Los operadores de consulta estándar permiten aplicar las consultas
a cualquier fuente de información basada en IEnumerable<T>. LINQ permite que
terceros fabricantes aumenten el conjunto de operadores de consulta estándar,
añadiendo los operadores de dominio específico que sean apropiados para el
dominio o la tecnología de destino. Más importante aún es que terceros fabricantes
también pueden reemplazar los operadores de consulta estándar con sus propias
implementaciones que ofrezcan servicios adicionales como la evaluación remota,
traducción de consultas, optimización, etc. Al adherirse a los convenios del patrón
LINQ, tales implementaciones gozarán de la misma integración en los lenguajes y
soporte de herramientas que los operadores de consulta estándar.

CIBERTEC CARRERAS PROFESIONALES


82

Las expresiones lambda junto a las instrucciones que proporciona LINQ (Lenguaje
de Consulta Integrado) resultan en una dupla complementarias en materia de
desarrollo de software. La inclusión y el uso de expresiones lambda en consultas
de base de datos utilizando LINQ son elementales y poderosos.
Cabe señalar que mediante LINQ resulta posible construir suficiente y eficiente
código para, no solamente poder acceder bases de datos, tablas, consultas,
procedimientos almacenados, triggers, etc., sino que también resulta posible
manipular dichos datos en dichos centros de datos de forma directa y eficaz. No se
requiere de mucho esfuerzo y su principal ventaja es que no es necesario aprender
por completo el lenguaje SQL y todos sus artilugios, de manera que de esta forma,
se pueda explotar todas sus virtudes.

Ejecucion de una consulta en LINQ


Las consultas no se ejecutan en tiempo de diseño, sino en la región de
enumeración elementos, un método, o cualquiera otra sentencia que haga uso
explícito de los datos.

Figura 2: Ciclo de una consulta LINQ


Referencia: http://ortizol.blogspot.com/2014/06/expresiones-lambda-en-csharp-parte-3-expresiones-lambda-
y-linq.html

2.2.1.2 LINQ y consulta de datos


Las clases del espacio de nombres System.Linq y el resto de los espacios de
nombres que admiten consultas LINQ incluyen métodos a los que puede llamar
para crear y refinar consultas basándose en las necesidades de la aplicación.

Figura 2: Operadores de LINQ


Referencia: http://es.slideshare.net/antoniopalomaressender/framework-net-35-10-linq

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 83

From (Cláusula): Se necesita una cláusula From o Aggregate para iniciar


una consulta. Una cláusula From especifica una colección de origen y una
variable de iteración de una consulta. Por ejemplo:

Dim names = From cust In customers _


Where cust.State = "WA" _
Select cust.CompanyName

Select (Cláusula): Opcional. Declara un conjunto de variables de iteración


de una consulta. Por ejemplo:

Dim customerList = From cust In customers _


Select cust.CompanyName, cust.CustomerID

Where (Cláusula): Opcional. Especifica una condición de filtrado de una


consulta. Por ejemplo:

Dim names = From product In products _


Where product.Category = "Beverages" _
Select product.Name

Order By (Cláusula): Opcional. Especifica el criterio de ordenación de las


columnas de una consulta. Por ejemplo:

Dim titlesAscendingPrice = From b In books Order By b.price

Distinct (Cláusula): Opcional. Restringe los valores de la variable de


iteración actual para eliminar los valores duplicados de los resultados de la
consulta. Por ejemplo:

Dim cities = From item In customers _


Select item.City Distinct

2.2.1.3 EXPRESIONES LAMBDA, manejo de consultas

Una expresión lambda es una función o un método que utilizamos donde haya un
delegado válido.

Figura 1: Operador lambda

CIBERTEC CARRERAS PROFESIONALES


84

Una expresión lambda es una función anónima que se puede usar para crear tipos
delegados o de árbol de expresión. Utilizando expresiones lambda, puede escribir
funciones locales que se pueden pasar como argumentos o devolverse como valor
de llamadas a funciones. Las expresiones lambda son especialmente útiles para
escribir expresiones de consulta LINQ.

Para crear una expresión lambda, especifique parámetros de entrada (si existen) a
la izquierda del operador =>lambda, y coloque la expresión o bloque de
instrucciones en el otro lado. Por ejemplo, la expresión lambda x => x * x especifica
un parámetro denominado x y devuelve el valor x elevado al cuadrado.

Puede asignar esta expresión a un tipo delegado, como se muestra en el ejemplo


siguiente:

delegate int calculo(int i);


void Proceso()
{
calculo Delegado = x => x * x;
int j = Delegado(5); //j = 25
}

Expresiones Lambda y LINQ

En C# una expresión lambda es escrita, sintácticamente, como una lista de


parámetros, seguido del token “=>”, y seguido por una expresión o un bloque de
sentencias para que se ejecuten cuando se invoque la expresión.

param => expresion


param => param.Nombre==”Juan”;

En este ejemplo, la expresión lambda recibe un parámetro “param”, y que la


expresión del código que se va a ejecutar devuelve el valor p.Nombre que sea igual
a “Juan”. El hecho de que llamemos “param” al parámetro es irrelevante – podria
haberlo llamado “o”, “x”, “y” o cualquier nombre que hubiese querido.

La interfaz IQueryable
El mismo modelo de ejecución diferida es generalmente deseado para las fuentes
de datos que implementan la funcionalidad de consultas mediante árboles de
expresiones, como DLinq. Estas fuentes de datos pueden beneficiarse de
implementar la interfaz IQueryable, para la cual todos los operadores de consulta
requeridos por el patrón LINQ se implementan utilizando árboles de expresiones.

Cada IQueryable tiene una representación de “el código necesario para ejecutar la
consulta” en la forma de un árbol de expresión. Todos los operadores de consulta
diferidos devuelven un nuevo IQueryable que aumenta ese árbol de expresión con
una representación de una llamada a ese operador de consulta. Por esta razón,
cuando llega el momento de evaluar la consulta, generalmente porque el
IQueryable es enumerado, la fuente de datos puede procesar el árbol de expresión
que representa a la consulta entera en un solo “lote”.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 85

LABORATORIO 4.1
Se desea implementar un programa que permita calcular el promedio y el mayor de
dos números ingresados. Defina expresiones Lambda en el proceso.

1. DISEÑO DEL FORMULARIO.

A continuación diseñe el formulario, tal como se muestra

2. PROGRAMACION

Defina las estructuras Lambda dentro de la ventana del código del Form1

Definir la función
Promedio el cual
contiene 2 parámetros

Definir la función Mayor


el cual contiene 2
parámetros

CIBERTEC CARRERAS PROFESIONALES


86

Implementa cada el método de evento de cada uno de los botones para que ejecuten
su respectivo proceso, tal como se muestra

Programa el
evento del botón
Mayor y ejecuta el
método Mayor

Programa el
evento del botón
Promedio y
ejecuta el método
Promedio

Presiona la tecla F5, ingrese los datos, al presionar el botón Promedio, se muestra el
promedio de los números

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 87

LABORATORIO 4.2
Se desea implementar un programa que permita calcular el mayor de tres números
ingresados. Defina una expresión Lambda en el proceso

1. DISEÑO DEL FORMULARIO.


A continuación diseñe el formulario, tal como se muestra

2. PROGRAMACION
Defina la función Lambda llamado mayor dentro de la ventana del código del
Formulario

Definir la función Mayor


donde se define 3
parámetros y retorna el
mayor de tres números

CIBERTEC CARRERAS PROFESIONALES


88

Implementa cada el método de evento en el botón Mayor Numero para que ejecute su
respectivo proceso, tal como se muestra

Programa el evento del


botón Mayor y ejecuta
el método Mayor

3. EJECUTAR
A continuación ejecutamos el formulario (presiona la tecla F5). Ingresa los datos, tal
como se muestra, al presionar el botón Mayor Numero se visualiza el mayor de los tres
números.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 89

LABORATORIO 4.3
Se desea implementar un programa que permita listar los números almacenados en
una colección de tipo List<Of int>. En este proceso realice una consulta de los
números pares y los números impares

1. DISEÑO DEL FORMULARIO.

A continuación diseñe el formulario, tal como se muestra

Button: btnNumeros

Button: bnPares

Button: bnImpares

Control ListBox: lblNumeros

2. PROGRAMACION
Defina la colección lista de tipo List<int>, tal como se muestra

Definir la instancia de List(Of) de


Integer, almacenando una lista
de numeros

CIBERTEC CARRERAS PROFESIONALES


90

Programa el evento del Boton Numeros, donde visualizamos todos los números de la
colección List<int>. En este proceso utilizamos una función ToList(), par listar los
elementos de la colección.

Permite listar todos los


elementos de la colección

Programa el evento del Boton Pares, donde filtramos y visualizamos todos los
números que sean pares en la colección List<int>. En este proceso utilizamos la
función Where para realizar el filtro de los elementos de la colección.

Permite listar todos los


elementos que sean pares
en la colección

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 91

Programa el evento del Boton Impares, donde filtramos y visualizamos todos los
números que sean impares en la colección List<int>. En este proceso utilizamos la
función Where para realizar el filtro de los elementos de la colección

Permite listar todos los


elementos que sean
impares en la colección

Ejecutamos el formulario, donde al presionar un botón se puede visualizar los números


pares o los números impares.

CIBERTEC CARRERAS PROFESIONALES


92

LABORATORIO 4.4
Se desea implementar un programa que permita registrar y consultas cuentas
bancarias almacenadas en una colección de tipo List. Realice consulta de los registros
almacenados de las cuentas bancarias por diferentes criterios.

Desarrollo Práctico
1. Diseño de la Clase
En este paso vamos a diseñar la clase clsCuenta, donde definimos los atributos de la
clase y el constructor, tal como se muestra

Definir los atributos y


propiedades de la clase
Cuenta

2. Diseño del Formulario


Agrega en el Formulario el control TABCONTROL, control contenedor que contiene
TABPAGE. Para agregar un TABPAGE, desde la lista de tareas, selecciona la opción
AGREGAR PESTAÑA, tal como se muestra

Agregar un control
contenedor TABCONTROL
el cual agrupa Page

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 93

Para agregar mas pestañas, desde la lista de tareas del TabControl, selecciona la
opción Agregar pestaña, tal como se muestra.

Para agregar más páginas,


desde la lista de tareas,
selecciona la opción
AGREGAR PESTAÑA

3. Diseño de la Pestaña 1

En la pestaña 1, diseña la página para REGISTRAR CUENTAS

TextBox (Name): txtNumero

DateTimePicker (Name): dtFecha

TextBox (Name): txtCliente

ComboBox (Name): cbtipo

TextBox (Name): txtMonto

ListView (Name): lvCuenta

CIBERTEC CARRERAS PROFESIONALES


94

4. Programación de la pestaña 1

Defina a nivel Formulario una variable llamada Cuentas de tipo ArrayList; luego defina
un método llamado Listado() que permite listar los registros

Agregar la librería
System.Collections

Instanciar la colección
Cuentas, de tipo
List<Cuenta>

Defina el metodo Listado, el cual permite listar los elementos de la colección.

Metodo Listado(), el cual


permite visualizar los
elementos de la colección

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 95

Implementa el método del botón btnAgregar, donde se agrega un objeto de tipo


clsCuenta al ArrayList Cuentas, tal como se muestra.

Expresión Lambda que


verifica si se repita el
número de cuenta

Si no existe, instanciar la
clase, ingresar los datos y
agregarlo a la coleccion

Ejecutar el listado

5. Ejecutar

Para ejecutar presiona la tecla F5, ingrese datos en los controles, al presionar el botón
AGREGAR, se visualiza las cuentas registradas en el control lvCuentas. Si trata de
registrar una cuenta con el mismo número, visualiza un mensaje, tal como se muestra

CIBERTEC CARRERAS PROFESIONALES


96

6. Diseño de la Pestaña 2

En esta pestaña vamos a consulta las cuentas por el nombre del cliente, ingresando
sus iniciales del nombre

TextBox (Name)
txtBuscarCliente

ListView (Name)
lvConsultaNombre

7. Programación de la pestaña 2

Implementa el método del botón Consulta por Nombre, donde se realizara la búsqueda
de las cuentas por las iniciales del nombre del cliente, visualizando los registros en el
control ListView, tal como se muestra.

Expresión LINQ donde lista


los registros que coincida
con las iniciales del nombre
del cliente

Listar en el control Listview


los registros resultantes de
la consulta

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 97

8. Ejecutar

Para ejecutar presiona la tecla F5, ingrese las iniciales del nombre del cliente; al
presionar el botón CONSULTAR CLIENTE, se visualiza las cuentas registradas por las
iniciales del cliente en el control lvConsultaNombre.

9. Diseño de la Pestaña 3

En esta pestaña vamos a consulta las cuentas entre un rango de 2 fechas


seleccionadas desde los controles DateTimePicker

DateTimePicker (Name)
dtFecha1

DateTimePicker (Name)
dtFecha2

ListView (Name)
lvConsultaFechas

CIBERTEC CARRERAS PROFESIONALES


98

10. Programación de la pestaña 3

Implementa el método del botón Consulta por Fechas, donde selecciona el rango de
las fechas a través de los controles DateTimePicker, visualizando los registros en el
control ListView, tal como se muestra.

Expresión LINQ donde lista


los registros entre el rango
de fechas.

Listar en el control Listview


los registros resultantes de
la consulta

Para ejecutar presiona la tecla F5, registra datos en las cuentas, y realiza las consultas
en las páginas de consulta entre un rango de dos fechas, tal como se muestra.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 99

LABORATORIO 4.5
Se desea implementar un programa que permita registrar Cursos en una colección de
tipo List. Implementa consulta de los registros almacenados de los cursos a través de
la inicial de su nombre

CIBERTEC CARRERAS PROFESIONALES


100

LABORATORIO 4.6

Se desea implementar un
programa que permita
registrar FUTBOLISTAS en
una colección de tipo List.
Implementa una página que
permita los registros de los
futbolistas donde el DNI no
se repita

Implementa un Page que


permita consulta los
Futbolistas por Club, al
seleccionar un club listar los
futbolistas

Implementa un Page que


permita consulta los
Futbolistas por Año, ingrese
un Año desde el control
TextBox, al presionar el
botón CONSULTA listar los
futbolistas que coincida con
el año de su fecha de
nacimiento

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 101

Resumen
 Las expresiones lambda se crean utilizando la palabra clave Function o Sub, del mismo
modo que se crea una subrutina o función estándar. Sin embargo, las expresiones
lambda van incluidas en una instrucción.
 Una expresión lambda se construye en una sola línea de código. Su
comportamiento es muy similar a una función ordinaria, pero la construcción del
código resulta ser más simple. Algunos suelen llamar a las expresiones lambda
como “funciones de una sola línea”.
 Las expresiones lambda se combinan con los métodos que no retornan valor. Esta
técnica nos permitirá ahorrar código y optimizar nuestros algoritmos. Veamos el
siguiente código.
 Las expresiones lambda es una herramienta muy poderosa en el caso de las
funciones, que son los métodos que retornan valor.
 Las expresiones lambda junto a las instrucciones que proporciona LINQ (Lenguaje
de Consulta Integrado) resultan en una dupla complementarias en materia de
desarrollo de software. La inclusión y el uso de expresiones lambda en consultas
de base de datos utilizando LINQ son elementales y poderosos.
 Las clases del espacio de nombres System.Linq y el resto de los espacios de
nombres que admiten consultas LINQ incluyen métodos a los que puede llamar
para crear y refinar consultas basándose en las necesidades de la aplicación
 From (Cláusula): Se necesita una cláusula From o Aggregate para iniciar una
consulta. Una cláusula From especifica una colección de origen y una variable de
iteración de una consulta
 Select (Cláusula): Opcional. Declara un conjunto de variables de iteración de una
consulta.
 Where (Cláusula): Opcional. Especifica una condición de filtrado de una consulta..
 Order By (Cláusula): Opcional. Especifica el criterio de ordenación de las
columnas de una consulta.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

http://msdn.microsoft.com/es-
pe/library/bb763068(v=vs.90).aspx#VisualBasicLINQQueryOperators
http://www.devjoker.com/contenidos/articulos/341/LINQ-con-metodos-
Extensores-y-expresiones-lambda.aspx
 http://www.elguille.info/NET/library/System.Collections.aspx
http://ortizol.blogspot.com/2014/06/expresiones-lambda-en-csharp-parte-3-
expresiones-lambda-y-linq.html

CIBERTEC CARRERAS PROFESIONALES


102

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 103

UNIDAD

3
PROCESOS ASÍNCRONOS
Al finalizar la unidad, el alumno crea aplicaciones personalizadas para el manejo de
procesos asíncronos e hilos utilizando algoritmos y librerías del Framework .NET 4.5

Temario

3.1. Tema 5: Trabajando con MultiHilos


3.1.1 Manejo de un Thread: propiedades y métodos
3.1.2 Manejo de la clase Thread
3.1.2.1 Propiedades
3.1.2.2 Métodos
3.1.3 Manejo de BackGroundWorker

ACTIVIDADES PROPUESTAS

 Los alumnos desarrollan aplicaciones en Windows para consultar los servicios


que se administran por el Sistema Operativo
 Los alumnos desarrollan un servicio de Windows, lo instalan y lo ejecutan
 Los alumnos desarrollan los laboratorios de la semana.

CIBERTEC CARRERAS PROFESIONALES


104

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 105

3.1 PROCESOS ASINCRONOS


A veces necesitamos ejecutar tareas secundarias dentro de una aplicación que
no interfieran con las tareas principales, Java da la oportunidad de realizar
estas tareas en forma independiente, esto se le conoce como hilos. Nuestra
aplicación corre sobre un hilo principal al cual podemos integrarle más hilos
que corren detrás de la aplicación.

Cada hilo se programa como si ejecutara solo; como si la CPU fuera una sola.
Algún mecanismo del sistema operativo está dividiendo el tiempo de la CPU
para la aplicación, esto que hace la programación de múltiples hilos una tarea
mucho más fácil.
Un proceso son instrucciones al CPU que se ejecuta en su propio espacio. Un
sistema operativo multitarea es capaz de ejecutar más de un proceso a la vez,
haciendo que parezca que cada uno está por su cuenta, proporcionando
periódicamente ciclos de CPU para cada proceso. Un hilo es un solo flujo de
control dentro de un proceso. Un solo proceso puede tener múltiples hilos
ejecutándose al mismo tiempo. En resumen un proceso puede contener
múltiples hilos.

Figura 1: Threads
Referencia: http://nelson-venegas.blogspot.com/2012/05/procesos-hilos-threads-subproceso.html

3.1.1 Manejo de un Thread: propiedades y métodos

En la clase en la que queramos lanzar un Thread, deberemos hacer un


Imports System.Threading, crear una variable de tipo Thread y asignarle el
procedimiento que queramos ejecutar en dicho Thread.

Cuando un Thread se inicia, con Start, se continúa ejecutando el código que


sigue y así podremos seguir usando nuestra aplicación de forma paralela al
Thread que está en ejecución. Por supuesto se pueden crear y ejecutar varios
Threads a un mismo tiempo y cada uno de ellos hará su trabajo de forma
independiente.

Puede ser que en algunas ocasiones necesitemos saber si un Thread aún se

CIBERTEC CARRERAS PROFESIONALES


106

está ejecutando, para ello se puede usar la propiedad IsAlive del objeto
Thread:

if (mThreadFic.IsAlive())
{
}

3.1.2. Manejo de la clase THREAD

Crea y controla un subproceso, establece su prioridad y obtiene su estado. Un


proceso puede crear uno o varios subprocesos para ejecutar una parte del
código de programa asociado al proceso. Utilice un delegado ThreadStart o el
delegado ParameterizedThreadStart para especificar el código del programa
ejecutado por un subproceso. El delegado ParameterizedThreadStart permite
pasar datos al procedimiento de subproceso.

A lo largo de su existencia, un subproceso siempre se encuentra en uno o más


estados definidos por ThreadState. Se puede solicitar un nivel de prioridad de
programación (tal y como lo define ThreadPriority) para un subproceso, pero
no se garantiza que el sistema operativo lo conceda.

GetHashCode proporciona identificación a los subprocesos administrados.


Mientras dure el subproceso, no coincidirá con el valor de ningún otro
subproceso, independientemente del dominio de aplicación del que se obtenga
el valor.

3.2.2.1 Métodos

Método Descripción
Abort Produce una excepción ThreadAbortException en el
subproceso en el que se invoca, para iniciar el proceso de
finalización del subproceso. Normalmente, una llamada a este
método finaliza el subproceso.
Finalize Permite que un objeto Object intente liberar recursos y realizar
otras operaciones de limpieza antes de que el objeto Object sea
reclamado por el recolector de elementos no utilizados. (Se
hereda de Object).
Interrupt Anula un subproceso que se encuentra en estado de subproceso
WaitSleepJoin.
Join Bloquea el subproceso de la llamada hasta que un subproceso
finaliza, pero continúa realizando suministro de SendMessage y
COM estándar.
Sleep(Int32) Suspende el subproceso actual durante un período de tiempo
especificado.
Sleep(TimeSp Bloquea el subproceso actual durante un período de tiempo
an) especificado.
Start Hace que el sistema operativo cambie el estado de la instancia
actual a ThreadState.Running.
Suspend Suspende el subproceso y, si éste ya se ha suspendido, no tiene
efecto alguno.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 107

3.2.2.2 Propidades

Propiedad Descripción
CurrentCulture Obtiene o establece la referencia cultural del
subproceso actual.
CurrentPrincipal Obtiene o establece el principal del subproceso
actual (de la seguridad basada en funciones).
CurrentThread Obtiene el subproceso actualmente en ejecución.
CurrentUICulture Obtiene o establece la referencia cultural actual
utilizada por el administrador de recursos para
buscar recursos específicos de la referencia
cultural en tiempo de ejecución.
IsAlive Obtiene un valor que indica el estado de ejecución
del subproceso actual.
IsThreadPoolThread Obtiene o establece un valor que indica si un
subproceso es o no un subproceso en segundo
plano.
Priority Obtiene o establece un valor que indica la
prioridad de programación de un subproceso.
ThreadState Obtiene un valor que contiene los estados del
subproceso actual.

MULTITHREAD

Una de las características innovadoras e interesantes es la incorporación de la


programación multihilo (MultiThreading). Cuando se ejecuta una aplicación que
Multihilo, cada hilo ejecuta funciones de forma separada, y podemos afirmar
que el multithreading es una forma especializada de la multitarea.

En la siguiente grafica podemos visualizar como funcionan las aplicaciones


MultiHilo, las cuales permiten realizar tareas asíncronas “al mismo tiempo”,
aunque realmente no es asi. Por ejemplo para el proceso de paint el sistema
operativo le sede el control al hilo 1 de paint, y luego sede el control al siguiente
Thread y asi sucesivamente

Figura 2: MultiThreads
Referencia: http://nelson-venegas.blogspot.com/2012/05/procesos-hilos-threads-subproceso.html

CIBERTEC CARRERAS PROFESIONALES


108

3.1.3. BACKGROUNDWORKER

La clase BackgroundWorker permite ejecutar una operación en un subproceso


dedicado e independiente. La ejecución de operaciones que exigen mucho
tiempo, como las descargas y las transacciones de las bases de datos, puede
hacer que la interfaz de usuario deje de responder. Si desea una interfaz de
usuario con gran capacidad de respuesta y debe realizar operaciones que
exigen mucho tiempo, la clase BackgroundWorker proporciona una solución
práctica.

Para configurar una operación en segundo plano, agregue un controlador de


eventos para el evento DoWork. En este controlador de eventos, llame a la
operación que requiere mucho tiempo. Para iniciar una operación en segundo
plano, llame al método RunWorkerAsync. Para recibir notificaciones sobre las
actualizaciones de progreso, controle el evento ProgressChanged. Para
recibir una notificación cuando se complete la operación, controle el evento
RunWorkerCompleted.

Si la operación en segundo plano requiere un parámetro, llame a


RunWorkerAsync con el parámetro. Dentro del controlador de eventos
DoWork, puede extraer el parámetro de la propiedad
DoWorkEventArgs.Argument

En la tabla siguiente se muestran los eventos de BackGroundWorker:

Evento Descripción
DoWork Se produce cuando se llama a
RunWorkerAsync.
ProgressChanged Se produce cuando se llama a ReportProgress.
RunWorkerCompleted Se produce cuando la operación en segundo
plano se ha completado, se ha cancelado o ha
producido una excepción.

En la tabla siguiente se muestran los métodos de BackGroundWorker:

Método Descripción
CancelAsync Solicita la cancelación de una operación en
segundo plano pendiente.
Finalize Permite que un objeto Object intente liberar
recursos y realizar otras operaciones de limpieza
antes de que el objeto Object sea reclamado por
la recolección de elementos no utilizados. (Se
hereda de Object).
OnDoWork Genera el evento DoWork.
OnProgressChanged Genera el evento ProgressChanged.
OnRunWorkerCompleted Genera el evento RunWorkerCompleted.
ReportProgress( Int32) Genera el evento ProgressChanged

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 109

LABORATORIO 5.1
Trabajando con Hilo
Se desea implementar un programa que permita listar la serie numérica y se detendrá
cuando el número sea cero.

1. Agregando Aplicación tipo CONSOLA

Seleccionar Aplicación
por Consola.

Ingrese el nombre del


proyecto

2. Creando una clase llamado Asíncrono, la cual definimos un método Proceso()

Importar la librería
System.Threading

Método Proceso() donde


imprime números y se detiene
cuando el numero sea cero

CIBERTEC CARRERAS PROFESIONALES


110

3. Trabajando con el void Main(). Instanciar la clase Asincrono, defina un hilo con el
metodo de la clase e iniciar el proceso

Instanciar la clase
Asincrono

Definir un Thread con el metodo


Proceso(), iniciar el hilo

Mientras el hilo esté en ejecución


no imprimirá “Proceso
Terminado”

4. Ejecute el proceso, presiona la tecla F5. En la consola se imprimirá los números


hasta que el número sea cero, finalizará el proceso

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 111

LABORATORIO 5.2
Manejo de SubProcesos
Se desea implementar un programa que permita trabajar con dos hilos, visualizando
números al azar, finalizando los hilos cuando el número generado sea cero.

1. Creando un metodo static llamado Proceso definiendo un parámetro. En el proceso se


imprimirá el nombre del hilo y su numero generado al azar.

Importar la librería
System.Threading

Método Proceso() donde


imprime números y se detiene
cuando el numero sea cero

2. Trabajando con el void Main(). Instanciardos hilos con el metodo Proceso,


iniciándolos con el nombre del hilo, al finalizar terminar los hilos e imprimir mensaje

Instanciar los hilos y inicializarlos


con el nombre de cada hilo

Mientras estén vivos los hilos, no


se cerrarán

Mientras el hilo esté en ejecución


no imprimirá “Proceso
Terminado”

CIBERTEC CARRERAS PROFESIONALES


112

3. Ejecute el proceso, presiona la tecla F5. En la consola se imprimirá los números de


cada uno de los hilos hasta que el número sea cero, finalizará el proceso de los dos
hilos.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 113

LABORATORIO 5.3
Manejo de SubProcesos
Se desea implementar un programa que permita listar la serie numérica. Ingrese por
teclado un Número, visualice la serie numérica en el ListBox
Se pide:
1. Diseña un Formulario para listar los servicios.
2. Programe los eventos para listar la serie numérica utilizando Procesos Asíncronos.

1. DISEÑO DEL FORMULARIO.


A continuación diseñe el formulario para el registro de directorios, tal como se muestra

TextBox, (name): txtNumero

Button, (name): btnIniciar

ListBox, (name): lbNumeros

BackGroundWorker (name):
bwSerie

Asignando propiedades al control BackGroundWorker: Para imprimir los resultados, asigne a la


propiedad WorkerReportsProgress el valor de true, tal como semuestra

Asigne a la propiedad
WorkerReportsProgress el
valor de true

CIBERTEC CARRERAS PROFESIONALES


114

2. Programación.
En la ventana de Programación, hacemos referencia a la librería System.Threading

IMPORTAR LA LIBRERÍA DE
TRABAJO: THREADING

En el evento Clic del botón Iniciar, inice el trabajo del BackGroundWorker

Iniciar el BackGroundWorker

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 115

Definida las instrucciones en el evento DoWork del control BackGroundWorker para


desarrollo la serie

Defina las instrucciones en el método DoWork del


BackGroundWorker, para enviar la serie numérica

Al realizar la llamada del método ReportProgress, se ejecuta el método


ProgressChanged, el cual permite imprimir los datos en los controles.

ProgressChanged, imprime los


datos en el ListBox

RunWorkerCompleted, se
ejecuta al finalizar el proceso

Al finalizar, presione F5 y ejecute el Formulario, ingrese un Numero desde el control


TextBox, al presionar el botón INICIAR, se visualizará la serie numérica.

CIBERTEC CARRERAS PROFESIONALES


116

LABORATORIO 5.4
BackGroundWorker
Se desea implementar un programa que permita iniciar una barra de progreso,
visualizando su avance hasta que finalice. Programe esta aplicación a través de un
proceso asíncrono

1. DISEÑO DEL FORMULARIO.

Button, (name): btnIniciar

ProgressBar, (name):
pbProgreso

BackGroundWorker (name):
bwProgreso, asigne la propiedad
WorkerReportsProgress=true

2. Programación.
En la ventana de Programación, hacemos referencia a la librería System.Threading

IMPORTAR LA LIBRERÍA DE
TRABAJO: THREADING

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 117

En el evento Clic del botón Consulta, iniciamos el proceso Asíncrono en el control


BackGroundWorker.

Iniciamos el control
BackgroundWorker1

Programa el evento DoWork del backGroundWorker, donde enviamos el avance del


progreso.

Ejecutamos la consulta donde


enviamos el avance del progreso del
proceso

CIBERTEC CARRERAS PROFESIONALES


118

Al realizar la llamada del método ReportProgress, se ejecuta el método


ProgressChanged, el cual permite imprimir los datos en los controles

Mostrar el valor del progreso en el


control progressBar

Al finalizar, presione F5 y ejecute el Formulario.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 119

Resumen
 Un proceso son instrucciones al CPU que se ejecuta en su propio espacio. Un
sistema operativo multitarea es capaz de ejecutar más de un proceso a la vez,
haciendo que parezca que cada uno está por su cuenta, proporcionando
periódicamente ciclos de CPU para cada proceso. Un hilo es un solo flujo de
control dentro de un proceso. Un solo proceso puede tener múltiples hilos
ejecutándose al mismo tiempo. En resumen un proceso puede contener múltiples
hilos
 Cuando un Thread se inicia, con Start, se continúa ejecutando el código que sigue
y así podremos seguir usando nuestra aplicación de forma paralela al Thread que
está en ejecución. Por supuesto se pueden crear y ejecutar varios Threads a un
mismo tiempo y cada uno de ellos hará su trabajo de forma independienteLa clase
Process proporciona acceso a procesos locales y remotos, y permite iniciar y
detener procesos del sistema local.
 Un proceso puede crear uno o varios subprocesos para ejecutar una parte del
código de programa asociado al proceso. Utilice un delegado ThreadStart o el
delegado ParameterizedThreadStart para especificar el código del programa
ejecutado por un subproceso. El delegado ParameterizedThreadStart permite
pasar datos al procedimiento de subproceso.
 La clase BackgroundWorker permite ejecutar una operación en un subproceso
dedicado e independiente. La ejecución de operaciones que exigen mucho tiempo,
como las descargas y las transacciones de las bases de datos, puede hacer que la
interfaz de usuario deje de responder. Si desea una interfaz de usuario con gran
capacidad de respuesta y debe realizar operaciones que exigen mucho tiempo, la
clase BackgroundWorker proporciona una solución práctica.
 Para configurar una operación en segundo plano, agregue un controlador de
eventos para el evento DoWork. En este controlador de eventos, llame a la
operación que requiere mucho tiempo. Para iniciar una operación en segundo
plano, llame al método RunWorkerAsync. Para recibir notificaciones sobre las
actualizaciones de progreso, controle el evento ProgressChanged. Para recibir
una notificación cuando se complete la operación, controle el evento
RunWorkerCompleted.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://www.elguille.info/NET/VB/threads.htm#crear_threads

 http://msdn.microsoft.com/es-es/library/system.threading.thread_members.aspx
http://msdn.microsoft.com/es-
es/library/system.componentmodel.backgroundworker_members(v=vs.95).aspx
 http://eledwin.com/blog/tutorial-de-hilos-en-c-con-ejemplos-parte-2-35
 https://elburgues.wordpress.com/2011/02/22/backgroundworker/

CIBERTEC CARRERAS PROFESIONALES


120

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 121

UNIDAD

4
ADMINISTRACIÓN DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al finalizar la unidad, el alumno, utilizando algoritmos y librerías del NET Framework
4.5, construye aplicaciones Windows para optimizar el manejo de los datos y archivos.

Temario

4.1. Tema 6: Manejo de archivos


4.1.1. Objetos Stream Stream
4.1.1.1. Manejo del StreamReader y StreamWriter
4.1.1.2. Manejo del FileStream
4.1.1.3. Manejo del MemoryStream

4.2. Tema 7: Compresión de datos


4.2.1. Comprimir y descomprimir datos
4.2.1.1. Clase GzipStream: propiedades y métodos

4.3. Tema 8: Serialización de datos


4.3.1. Serialización Binaria
4.3.1.1. Serializar y deserializar datos: Clase BinaryFormatter
4.3.2. Serializacion XML
4.3.2.1. Clase XMLSerializer
4.3.2.2. Serialización y deserialización en formato XML: XmlSerializer

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para el manejo de archivos y
carpetas administradas por el Sistema Operativo
 Los alumnos desarrollan aplicaciones para el manejo de datos utilizando objetos
Stream.
 Los alumnos crear aplicaciones para serializar un tipo de objeto
 Los alumnos crean una aplicación para realizar la compresión y encriptamiento
de los datos
 Los alumnos desarrollan los laboratorios de la semana.

CIBERTEC CARRERAS PROFESIONALES


122

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 123

4.1 MANEJO DE ARCHIVOS


Todas las aplicaciones, excepto las más triviales, requieren algún tipo de entrada o
salida de datos y, en muchos casos, se efectúa contra archivos.

.NET Framework nos provee de un conjunto de clases que nos permiten acceder al
sistema de archivos del sistema, navegar por las carpetas, crear y eliminas archivos
y leer y escribir en los mismos, implementado mediante un modelo de streaming.

Adicionalmente podemos encriptar y comprimir los datos al almacenarlos en un


archivo o en memoria. Aunque dado que la gestión de datos en memoria tiene sus
limitaciones .NET nos suministra el almacenamiento aislado, para ayudarnos a
persistir los datos privados a disco, peor protegidos de programas maliciosos. Esta
técnica nos permite asignar un espacio de archivos para un usuario, aplicación o
ensamblado, el cual será independiente de cualquier otro usuario, aplicación o
ensamblado.

Lo primero que debemos conocer es el NameSpace: SYSTEM.IO, el cual nos


proporciona una serie de clases para el manejo de archivos, carpetas y hasta
unidades completas.

Podríamos decir que SYSTEM.IO se divide en dos tipos de clases, las de


información (derivadas de FileSystemInfo) y las de utilidades (File, Directory y Path)

System.IO
El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los
archivos y secuencias de datos, así como tipos que proporcionan compatibilidad
básica con los archivos y directorios.
System.IO está conformado por las siguientes clases:

En la tabla siguiente se muestran las clases del NameSpace System.IO:

Clases Descripción
DirectoryInfo Expone métodos de instancia para crear, mover y
enumerar archivos en directorios y subdirectorios. Esta
clase no se puede heredar.
DriveInfo Proporciona acceso a información sobre una unidad.
File Proporciona métodos estáticos para crear, copiar,
eliminar, mover y abrir archivos y contribuye a la
creación de objetos FileStream.

CIBERTEC CARRERAS PROFESIONALES


124

FileInfo Proporciona métodos de instancia para crear, copiar,


eliminar, mover y abrir archivos y contribuye a la
creación de objetos FileStream. Esta clase no se puede
heredar.
FileStream Expone un objeto Stream alrededor de un archivo; se
admiten operaciones de lectura y escritura sincrónica y
asincrónica.
IOException Excepción que se produce cuando se produce un error
de E/S.
MemoryStream Crea una secuencia cuyo almacén de respaldo es la
memoria.
Path Ejecuta operaciones en instancias de String que
contienen información de rutas de archivos o directorios.
Estas operaciones se ejecutan de forma adecuada para
múltiples plataformas.
Stream Proporciona una vista genérica de una secuencia de
bytes.
StreamReader Implementa un TextReader que lee los caracteres de
una secuencia de bytes en una codificación
determinada.
StreamWriter Implementa TextWriter para escribir los caracteres de
una secuencia en una codificación determinada.
StringReader Implementa TextReader que lee en una cadena.
StringWriter Implementa TextWriter para escribir información en una
cadena. La información se almacena en el
StringBuilder subyacente.

DRIVEINFO
Proporciona acceso a información sobre una unidad.

Esta clase modela una unidad y proporciona métodos y propiedades para consultar
información sobre la unidad. Utilice DriveInfo para determinar qué unidades están
disponibles y de qué tipo son. También puede determinar la capacidad de la unidad
y su espacio libre disponible.

En la tabla siguiente se muestran las Propiedades de la clase DriveInfo:

Propiedad Descripción
GetDrives() Retorna la colección de las unidades de disco
administrada por Windows
DriveType Tipo de la unidad de disco
TotalSize Tamaño de la unidad
TotalFreeSpace Espacio disponible del disco
IsReady Retorna un valor boolean indicando si el dispositivo
está disponible.
AvailableFreeSpace Disponibilidad del espacio de disco
RootDirectory Raíz del directorio

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 125

DIRECTORYINFO
Expone métodos de instancia para crear, mover y enumerar archivos en directorios
y subdirectorios. Esta clase no se puede heredar.

Utilice la clase DirectoryInfo para operaciones típicas como copiar, mover, cambiar
de nombre, crear y eliminar directorios.
Si va a utilizar un objeto varias veces, considere la posibilidad de usar el método de
instancia de DirectoryInfo en lugar de los correspondientes métodos estáticos de
la clase Directory, ya que no siempre será necesario realizar una comprobación de
seguridad.

En la tabla siguiente se muestran las propiedades de la clase DirectoryInfo:

Propiedad Descripción
Exists Determina si un directorio existe
GetDirectories() Retorna los subdirectorios del directorio
CreateDirectory Crea un directorio
CreateSubDirectory Crea un subdirectorio
Move Permite mover un directorio a otro directorio o unidad
Delete Elimina un directorio

PATH
Ejecuta operaciones en instancias de String que contienen información de rutas de
archivos o directorios. Estas operaciones se ejecutan de forma adecuada para
múltiples plataformas.

Una ruta de acceso es una cadena que proporciona la ubicación de un archivo o


directorio. Una ruta de acceso no apunta necesariamente a una ubicación de disco;
por ejemplo, una ruta de acceso puede asignarse a una ubicación en la memoria o
en un dispositivo. El formato exacto de una ruta de acceso está determinado por la
plataforma actual. Por ejemplo, en algunos sistemas, una ruta de acceso puede
empezar por una letra de unidad o de volumen, mientras que este elemento está
ausente en otros sistemas.

Una ruta de acceso puede contener información de ubicación absoluta o relativa.


Las rutas absolutas especifican por completo una ubicación: el archivo o directorio
puede identificarse de forma única independientemente de la ubicación actual. Las
rutas relativas especifican una ubicación parcial: la ubicación actual se utiliza como
punto de inicio cuando se busca un archivo especificado mediante una ruta relativa.
Para determinar el directorio actual, llame a Directory.GetCurrentDirectory.

La mayoría de los miembros de la clase Path no interactúan con el sistema de


archivos y no comprueban la existencia del archivo especificado por una cadena de
ruta de acceso. Los miembros de la clase Path que modifican una cadena de ruta
de acceso, como ChangeExtension, no afectan a los nombres de archivo del
sistema de archivos. Los miembros de Path, sin embargo, validan el contenido de
una cadena de ruta de acceso especificada y producen una excepción
ArgumentException si la cadena contiene caracteres que no son válidos en las
cadenas de ruta de acceso, tal y como están definidos en InvalidPathChars. Por
ejemplo, en plataformas de escritorio basados en Windows, los caracteres no
válidos de ruta de acceso podrían incluir signos como comillas ("), menor que (<),
mayor que (>), barra vertical (|), retroceso (\b), nulo (\0) y caracteres Unicode del 16
al 18 y del 20 al 25.

CIBERTEC CARRERAS PROFESIONALES


126

En la tabla siguiente se muestran las propiedades de la clase Path:

Propiedad Descripción
GetExtension Recupera la extensión de un nombre de archivo.
GetFullPath Recupera la ruta de acceso completa de un archivo.
ChangeExtension Cambia la extensión de un archivo
HasExtension Determina si la ruta tiene extensión valida.
InvalidPathChars Evalúa si la ruta tiene algún carácter valido.

4.1.1 OBJETOS STREAM


Proporciona una vista genérica de una secuencia de bytes.

Stream es la clase base de todas las secuencias. Una secuencia es una


abstracción de una secuencia de bytes, como un archivo, un dispositivo de
entrada/salida, un canal de comunicación interprocesos o un socket TCP/IP.

La clase Stream y sus clases derivadas proporcionan una visión genérica


de diferentes tipos de entrada y salida, aislando al programador de los
detalles específicos del sistema operativo y sus dispositivos subyacentes.
Una aplicación puede consultar las características de una secuencia
mediante las propiedades CanRead, CanWrite y CanSeek.

Figura 1: Objeto Stream


Referencia: http://www.slideshare.net/antoniopalomaressender/framework-net-35-14-gestin-de-archivos-y-
serializacin

Los métodos Read y Write leen y escriben datos en varios formatos. Para
secuencias que admiten búsquedas, se pueden utilizar los métodos Seek y
SetLength, y las propiedades Position y Length para consultar y modificar
la posición y longitud actuales de una secuencia.

Algunas implementaciones de secuencia almacenan los datos subyacentes


en un búfer local para mejorar el rendimiento. Para estas secuencias, puede
utilizarse el método Flush con el fin de borrar el contenido de los búferes
internos y asegurar la escritura de todos los datos en el origen de datos o
repositorio subyacente.

Al llamar a Close en Stream se vacían los datos almacenados en el búfer


mediante una llamada a Flush. Close libera también los recursos del
sistema operativo como los identificadores de archivo, las conexiones de
red o la memoria utilizada para el almacenamiento en el búfer interno. La

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 127

clase BufferedStream permite que una secuencia pueda estar contenida


en otra secuencia almacenada en búfer con el fin de mejorar el rendimiento
de lectura y escritura.

Si se necesita una secuencia sin almacén de respaldo (por ejemplo, un


sector de almacenamiento de bits), se usa Null.

Proporciona una vista genérica de una secuencia de bytes.


Stream es la clase base de todas las secuencias. Una secuencia es una
abstracción de una secuencia de bytes, como un archivo, un dispositivo de
entrada/salida, un canal de comunicación interprocesos o un socket TCP/IP.

Si se necesita una secuencia sin almacén de respaldo (por ejemplo, un


sector de almacenamiento de bits), se usa Null.
En la tabla siguiente se muestran las clases de los componentes Stream:

Clase Descripción
StreamReader Implementa un TextReader que lee los caracteres de
una secuencia de bytes en una codificación
determinada.
StreamWriter Implementa un TextWriter que escribe los caracteres
en una secuencia de bytes.
FileStream Expone un objeto Stream de un archivo; se admiten
operaciones de lectura y escritura sincrónica y
asincrónica
MemoryStream Crea una secuencia de bytes cuyo almacén de
respaldo es la memoria.
StringReader Implementa TextReader que lee en una cadena
StringWriter Implementa TextWriter para escribir información en
una cadena. La información se almacena en el
StringBuilder subyacente.

4.1.1.1 Manejo del StreamReader y StreamWriter

StreamReader
Está diseñado para la entrada de caracteres mediante una codificación
determinada, mientras que la clase Stream está diseñada para la entrada y
salida de bytes. Se utiliza StreamReader para leer líneas de información
desde un archivo de texto estándar.

StreamReader adopta la codificación UTF-8 de forma predeterminada, a


menos que se especifique otra, en lugar de utilizar la página de códigos ANSI
del sistema actual. UTF-8 utiliza los caracteres Unicode correctamente y
ofrece resultados coherentes en versiones traducidas del sistema operativo.

De forma predeterminada, StreamReader no es seguro para la ejecución de


subprocesos. Para obtener información sobre los contenedores seguros para
subprocesos, vea TextReader.Synchronized.

En la tabla siguiente se muestran los métodos del StreamReader:

Clase Descripción
Close Cierra el objeto StreamReader y la secuencia

CIBERTEC CARRERAS PROFESIONALES


128

subyacente, además de liberar todos los recursos


del sistema asociados al lector.
Read Lee el siguiente carácter o conjunto de caracteres
de la secuencia de entrada.
ReadBlock Lee el número máximo de caracteres especificado
por la variable count de la secuencia actual y
escribe los datos en buffer, empezando en index.
(Se hereda de TextReader).
ReadLine Lee una línea de caracteres de la secuencia
actual y devuelve los datos como una cadena.
ReadToEnd Lee la secuencia desde la posición actual hasta el
final de la secuencia.

StreamWriter

StreamWriter está diseñado para obtener caracteres como salida en una


codificación determinada, mientras que las clases derivadas de Stream están
diseñadas para entrada y salida de bytes.

StreamWriter utiliza de forma predeterminada una instancia de


UTF8Encoding, a menos que se especifique lo contrario. Esta instancia de
UTF8Encoding se construye sin marca de orden de bytes (BOM), por lo que
su método GetPreamble devuelve una matriz de bytes vacía. Para crear
StreamWriter mediante la codificación UTF-8 y una marca BOM, considere la
posibilidad de utilizar un constructor que especifique la codificación, como
StreamWriter(String, Boolean, Encoding).

En la tabla siguiente se muestran los métodos del StreamWriter:

Clase Descripción
Close Cierra el objeto StreamWriter y la secuencia
subyacente.
Flush Borra todos los búferes del sistema de escritura
actual y hace que todos los datos almacenados en
el búfer se escriban en la secuencia subyacente.
(Invalida a TextWriter.Flush).
Write Escribe la representación de texto de un valor de
tipo Boolean en la secuencia de texto. (Se hereda
de TextWriter).
WriteLine Escribe un terminador de línea en la secuencia de
texto. (Se hereda de TextWriter).

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 129

4.1.1.2 FileStream

Figura 2: Objeto FileStream


Referencia: http://www.slideshare.net/antoniopalomaressender/framework-net-35-14-gestin-de-archivos-y-
serializacin

Utilice la clase FileStream para leer, escribir, abrir y cerrar archivos en un


sistema de archivos, así como para manipular otros identificadores del
sistema operativo relacionados con archivos, incluidos los de canalizaciones,
entrada estándar y salida estándar. Puede especificar que las operaciones de
lectura y escritura sean sincrónicas o asincrónicas. FileStream almacena en
el búfer la entrada y la salida para obtener un mejor rendimiento.

Los objetos FileStream admiten el acceso aleatorio a los archivos mediante


el método Seek. Seek permite que se mueva la posición de lectura/escritura
a cualquier posición dentro del archivo. Esto se realiza mediante parámetros
de punto de referencia de desplazamiento de byte. El desplazamiento de byte
es relativo al punto de referencia de búsqueda, que puede ser el comienzo, la
posición actual o el final del archivo subyacente, según lo representado por
las tres propiedades de la clase SeekOrigin.

En la tabla siguiente se muestran los métodos del FileStream:

Clase Descripción
Close Cierra la secuencia actual y libera todos los recursos
(como sockets e identificadores de archivo) asociados
a ésta. (Se hereda de Stream).
Flush Borra todos los búferes de esta secuencia y hace que
todos los datos almacenados en el búfer se escriban
en el dispositivo subyacente.
Read Lee un bloque de bytes de la secuencia y escribe los
datos en un búfer dado.
ReadByte Lee un byte del archivo y avanza la posición de lectura
un byte.
Write Escribe un bloque de bytes en esta secuencia
mediante el uso de datos de un búfer.
WriteByte Escribe un byte en la posición actual de la secuencia
de archivo

CIBERTEC CARRERAS PROFESIONALES


130

4.1.1.3 MemoryStream

Figura 3: Objeto MemoryStream


Referencia: http://www.slideshare.net/antoniopalomaressender/framework-net-35-14-gestin-de-archivos-y-
serializacin

La clase MemoryStream crea secuencias que utilizan como almacén de


respaldo la memoria en lugar de un disco o una conexión de red.
MemoryStream encapsula los datos almacenados como una matriz de bytes
sin signo que se inicializa al crear un objeto MemoryStream; también se
puede crear una matriz vacía. Es posible obtener acceso directamente a los
datos encapsulados en la memoria. Las secuencias de memoria pueden
reducir la necesidad de archivos y búferes temporales en una aplicación.
current position de una secuencia es la posición donde se llevará a cabo la
siguiente operación de lectura o escritura. La posición actual puede
recuperarse o establecerse mediante el método Seek. Al crear una nueva
instancia de MemoryStream, la posición actual se establece en cero.

Si se agrega un objeto MemoryStream a un archivo ResX o un archivo


.resources, llame al método GetStream en tiempo de ejecución para
recuperarlo.

Si un objeto MemoryStream se serializa en un archivo de recursos, su


serialización se realizará realmente como si fuera
UnmanagedMemoryStream. Este comportamiento proporciona un mejor
rendimiento, así como la capacidad de obtener directamente un puntero a los
datos, sin necesidad de pasar por los métodos de Stream.

En la tabla siguiente se muestran los métodos del MemoryStream:

Clase Descripción
Close Cierra la secuencia actual y libera todos los
recursos (como sockets e identificadores de
archivo) asociados a ésta. (Se hereda de Stream).
Flush Borra todos los búferes de esta secuencia y hace
que todos los datos almacenados en el búfer se
escriban en el dispositivo subyacente.
Read Lee un bloque de bytes de la secuencia y escribe
los datos en un búfer dado.
ReadByte Lee un byte del archivo y avanza la posición de
lectura un byte.
Write Escribe un bloque de bytes en esta secuencia

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 131

mediante el uso de datos de un búfer.


WriteByte Escribe un byte en la posición actual de la
secuencia de archivo
ToArray Escribe el contenido de la secuencia en una
matriz de bytes, independientemente de la
propiedad Position.

CIBERTEC CARRERAS PROFESIONALES


132

LABORATORIO 6.1
Consulta de Carpetas de la Unidad C:
Se desea implementar un programa que permita listar las carpetas o directorios
almacenados en la Unidad C:\. En este proceso visualice: la raíz de la carpeta y su nombre.
Se pide:
1. Diseña un Formulario para listar los servicios.
2. Programe el evento del Formulario para listar los directorios de la Unidad C:\

1. Diseño del Formulario.


A continuación diseñe el formulario, para listar los directorios de la unidad C:

ListView (lvDirectorios),
visualiza los directorios
de la unidad C:

2. Programación.
En la ventana de Programación o código, primero hacemos referencia a la librería
System.IO.

Importar la librería
System.IO, para el
manejo de archivos

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 133

En el evento Form_Load instanciar la clase DirectoryInfo sobre el directorio C:\

Instanciar la clase
DirectoryInfo

Definida la consulta de los directorios de la unidad C:, procedemos a listar los


directorios en el ListView1.

Leer cada carpeta


del directorio C: para
visualizar en el
control ListView

Al finalizar, presione F5, donde se listará los directorios de la Unidad C:

CIBERTEC CARRERAS PROFESIONALES


134

LABORATORIO 6.2
Consulta de Directorios por una Unidad Seleccionada
Se desea implementar un programa que permita listar los directorios por una Unidad
Seleccionada. Selecciona desde un ComboBox la unidad para listar los directorios de
esa unidad.
Se pide:
1. Diseña un Formulario para listar los directorios por Unidad seleccionada
2. Programación del Combobox donde al seleccionar una Unidad, se listará sus
directorios

1. Diseño del Formulario.

A continuación diseñe el formulario, para listar los directorios de la unidad seleccionada

ComboBox
(cboUnidad)

ListView
(lvDirectorios)

2. Programación.
En la ventana de Programación, hacemos referencia a la librería System.IO

Importar la librería
System.IO, para el
manejo de archivos

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 135

En el evento Load del Formulario, listamos las unidades de tu PC o laptop, dichas


unidades se listarán en el ComboBox: cboUnidad.

Listar las unidades a través


de la colección GetDrives de
la clase DriveInfo

Programa el evento SelectedindexChanged del comboBox cboUnidad. Selecciona la


Unidad Seleccionada desde el comboBox visualizando las carpetas de dicha Unidad
en el control ListView

Definir el directorio de la
unidad seleccionada

Listar las carpetas de la


unidad seleccionada en
el control listView

CIBERTEC CARRERAS PROFESIONALES


136

3. Ejecutar
Al finalizar presione F5 para ejecutar la aplicación, selecciona una Unidad desde el
comboBox, visualizando sus carpetas en el control ListView

LABORATORIO 6.3
Consulta de Archivos de un Directorios seleccionado
Implemente un programa que permita listar los archivos de una unidad seleccionada
desde un control comboBonx
Se pide:
1. Diseña un Formulario para listar los archivos de una unidad seleccionada
2. Programe el ComboBox para el listado de los archivo de la unidad seleccionada.

1. Diseño del Formulario.


Diseña el formulario para visualizar los archivos por directorio seleccionado

ComboBox
(cboUnidad)

ListView
(lvArchivos)

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 137

2. Programación.
En la ventana de Programación o código, primero hacemos referencia a la librería
System.IO. Defina a nivel Formulario una variable llamada raíz la cual almacena la
unidad de los directorios de la unidad C:

Importar la librería
System.IO, para el
manejo de archivos

En el evento Load del Formulario, listamos las unidades de tu PC o laptop, dichas


unidades se listarán en el ComboBox: cboUnidad.

Listar las unidades a través


de la colección GetDrives de
la clase DriveInfo

CIBERTEC CARRERAS PROFESIONALES


138

Programa el evento SelectedindexChanged del comboBox cboUnidad. Selecciona la


Unidad Seleccionada desde el comboBox visualizando los archivos de dicha Unidad
en el control ListView

Definir el directorio de la
unidad seleccionada

Listar los archivos de la


unidad seleccionada en
el control listView

3. Ejecutar el Formulario.
Seleccione un directorio en el ComboBox y listaremos sus archivos, donde se visualiza
su nombre y raíz del archivo

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 139

LABORATORIO 6.4
Manejo de Archivos
Se desea implementar un programa que permita manejar un archivo de texto: escribir
el texto dentro de un TextBox guardando su contenido en un archivo de Texto (.txt);
así como leer el contenido de un archivo de Texto y visualizarlo en el control TextBox.
Se pide:
1. Diseña un Formulario para grabar y leer un archivo
2. Programe los eventos para realizar las operaciones.

1. Diseño del Formulario.


A continuación diseñamos el formulario.

TextBox: txtBlock
MultiLine: True
ScrollBars: Verticla

2. Programación.
En la ventana de Programación, importar la librería System.IO.

Importar la librería
System.IO, para el
manejo de archivos

CIBERTEC CARRERAS PROFESIONALES


140

Programa el evento Clic del botón Limpiar, se procede a limpiar el control txtBlock

Programa el evento Clic del botón Grabar, se procede a Grabar el contenido del
TextBox a un archivo de Texto utilizando un cuadro de dialogo para Grabar.

Definir cuadro de dialogo


para guardar un archivo
de texto

Si aceptas guardar, instanciar un


StreamWriter, escribir su
contenidoy cerrar

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 141

Programe el evento Clic del botón Abrir se procede a Abrir un Archivo de Texto
utilizando un cuadro de dialogo.

Definir cuadro de dialogo


para abrir un archivo de
texto

Si aceptas abrir, instanciar un


StreamReader, leer el contenido y
mostrarlo en el TextBox y cerrar

3. Ejecutar el Formulario.
Al finalizar presione F5 para realizar el proceso de Lectura y grabación de archivos.

CIBERTEC CARRERAS PROFESIONALES


142

LABORATORIO 6.5
Manejo de Archivos
Se desea implementar un programa que permita manejar un archivo de texto:
1. Abrir un archivo y leer su contenido;
2. Guardar el contenido del TextBox y almacenarlo en un archivo de Texto (.txt);
si el archivo ha sido abierto, sobreescribirlo
3. Guardar Como, pide cuadro de dialogo para almacenar el contenido del
textBox en un archivo de texto.

1. Diseño del Formulario.


A continuación diseñamos el formulario

TextBox: txtBlock
MultiLine: True
ScrollBars: Verticla

2. Programación.
En la ventana de Programación, importar la librería System.IO.

Importar la librería
System.IO, para el
manejo de archivos

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 143

En la ventana de Programación, declare una variable que almacena el nombre del


archivo.

Variable que almacena


el nombre del archivo

Programe el evento Clic del botón Abrir se procede a Abrir un Archivo de Texto
utilizando un cuadro de dialogo.

Definir cuadro de dialogo


para abrir un archivo de
texto

Si aceptas abrir, instanciar el FileStream


para abrir el archivo, defina StreamReader,
leer el contenido

CIBERTEC CARRERAS PROFESIONALES


144

Programa el evento Clic del botón Guardar Como, se procede a Grabar el contenido
del TextBox a un archivo de Texto utilizando un cuadro de dialogo para Grabar

Definir cuadro de dialogo


para guardar el contenido
un archivo de texto

Si aceptas guardar, instanciar el


FileStream para crear el archivo, defina
StreamWriter para escribir el contenido

Programa el evento Clic del botón Grabar, se procede a Grabar el contenido del
TextBox a un archivo de Texto utilizando un cuadro de dialogo para Grabar.
Presiona la tecla F5 para ejecutar el Formulario.

Si la variable archivo esta vacío, definir


cuadro de dialogo SaveFileDialog
donde almacena el nombre del archivo

Instanciar un FileStream para crear


el archiv, StreamWriter donde
escriba su contenidoy cerrar

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 145

Resumen
 El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los
archivos y secuencias de datos, así como tipos que proporcionan compatibilidad básica
con los archivos y directorios.
 La clase DriveInfo modela una unidad y proporciona métodos y propiedades para
consultar información sobre la unidad. Utilice DriveInfo para determinar qué unidades
están disponibles y de qué tipo son. También puede determinar la capacidad de la
unidad y su espacio libre disponible.
 Utilice la clase DirectoryInfo para operaciones típicas como copiar, mover, cambiar de
nombre, crear y eliminar directorios. Si va a utilizar un objeto varias veces, considere la
posibilidad de usar el método de instancia de DirectoryInfo en lugar de los
correspondientes métodos estáticos de la clase Directory, ya que no siempre será
necesario realizar una comprobación de seguridad.
 La clase Path ejecuta operaciones en instancias de String que contienen
información de rutas de archivos o directorios. Estas operaciones se ejecutan de
forma adecuada para múltiples plataformas.
 Stream es la clase base de todas las secuencias. Una secuencia es una abstracción
de una secuencia de bytes, como un archivo, un dispositivo de entrada/salida, un canal
de comunicación interprocesos o un socket TCP/IP.
 StreamReader está diseñado para la entrada de caracteres mediante una codificación
determinada, mientras que la clase Stream está diseñada para la entrada y salida de
bytes. Se utiliza StreamReader para leer líneas de información desde un archivo de
texto estándar.
 Utilice la clase FileStream para leer, escribir, abrir y cerrar archivos en un sistema de
archivos, así como para manipular otros identificadores del sistema operativo
relacionados con archivos, incluidos los de canalizaciones, entrada estándar y salida
estándar. Puede especificar que las operaciones de lectura y escritura sean sincrónicas
o asincrónicas. FileStream almacena en el búfer la entrada y la salida para obtener un
mejor rendimiento.
 La clase MemoryStream crea secuencias que utilizan como almacén de respaldo la
memoria en lugar de un disco o una conexión de red. MemoryStream encapsula los
datos almacenados como una matriz de bytes sin signo que se inicializa al crear un
objeto MemoryStream; también se puede crear una matriz vacía.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

http://msdn.microsoft.com/es-es/library/system.io.memorystream_members
(v=vs.80).aspx
 http://msdn.microsoft.com/es-es/library/system.io.streamwriter_members.aspx
http://www.slideshare.net/antoniopalomaressender/framework-net-35-14-gestin-de-
archivos-y-serializacin

CIBERTEC CARRERAS PROFESIONALES


146

UNIDAD

4
ADMINISTRACIÓN DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al finalizar la unidad, el alumno, utilizando algoritmos y librerías del NET Framework
4.5, construye aplicaciones Windows para optimizar el manejo de los datos y archivos.

Temario

4.1. Tema 6: Manejo de archivos


4.1.1. Objetos Stream Stream
4.1.1.1. Manejo del StreamReader y StreamWriter
4.1.1.2. Manejo del FileStream
4.1.1.3. Manejo del MemoryStream

4.2. Tema 7: Compresión de datos


4.2.1. Comprimir y descomprimir datos
4.2.1.1. Clase GzipStream: propiedades y métodos

4.3. Tema 8: Serialización de datos


4.3.1. Serialización Binaria
4.3.1.1. Serializar y deserializar datos: Clase BinaryFormatter
4.3.2. Serializacion XML
4.3.2.1. Clase XMLSerializer
4.3.2.2. Serialización y deserialización en formato XML: XmlSerializer

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para el manejo de archivos y
carpetas administradas por el Sistema Operativo
 Los alumnos desarrollan aplicaciones para el manejo de datos utilizando objetos
Stream.
 Los alumnos crear aplicaciones para serializar un tipo de objeto
 Los alumnos crean una aplicación para realizar la compresión y encriptamiento
de los datos
 Los alumnos desarrollan los laboratorios de la semana.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 147

CIBERTEC CARRERAS PROFESIONALES


148

4.2 COMPRESION DE DATOS


4.2.1. Comprimir y descomprimir datos

El intercambiar datos dentro de nuestra organización sería mucho más eficiente si


estos datos no ocuparan mucho espacio ya que de ese modo al ser transferidos
sobre nuestra red no la sobrecargarían y el transporte sería muchísimo más rápido.

Existen muchos algoritmos para compresión de datos tanto de carácter privado


como público y que pueden ser utilizados para este propósito.

Microsoft, conociendo la importancia de tener estos algoritmos y de su uso, ha


implementado dentro del Framework 4.5 un conjunto de clases que nos permita
utilizarlos de manera muy sencilla y rápida, estas clases las podemos encontrar
dentro del Namespace "System.IO.Compression", y se llaman DeflateStream y
GZipStream.

La clase DeflateStream usa el algoritno de compresión "DEFLATE" que lo


podemos encontrar detallado en el RFC 1951 (URL:
http://www.faqs.org/rfcs/rfc1951.html) y que es libre sin patentes ni nada por el
estilo e implementado en muchas herramientas de compresión, en si se basa en la
combinación del Algoritmo LZ77 y la codificación Huffman.

Ahora la clase GZipStream se basa también en el algoritmo de compresión


DEFLATE agregándole cierta metadata tanto en la cabecera y un pie de página.
Por lo mismo dentro del framework 4.5 se podría decir que GZipStream es una
simple extensión de la clase Deflate con el agregado de una cabecera y un pie de
página haciendolo compatible con otros comprimidores/descomprimidores tal como
es WinZip o Winrar (además de permitir comprimir/Descomprimir manejan también
el concepto de archivamiento por lo tanto los resultados que obtengamos
comparados a estos productos no van a ser los mismos).

System.IO.Compression

El espacio de nombres System.IO.Compression contiene clases que


proporcionan servicios de compresión y descompresión básica para las
secuencias.

Este NameSpace está conformado por dos clases:

DeflateStream: Proporciona métodos y propiedades para comprimir y


descomprimir secuencias mediante el algoritmo Deflate.

GZipStream: Proporciona los métodos y propiedades que permiten comprimir y


descomprimir secuencias.

SharpZipLib: En ocasiones ahí la necesidad de grabar el contenido de una


serie de datos dentro de un archivo comprimido tipo .ZIP o .RAR, la mejor y
más simple forma de realizarlo la encontré con la librería
ICSharpCode.SharpZipLib que está bajo licencia GPL y es gratuita. Los
métodos y propiedades que permiten comprimir y descomprimir secuencias.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 149

4.2.1.1 Clase GZipStream: propiedades y métodos


Proporciona los métodos y propiedades que permiten comprimir y
descomprimir secuencias.

Esta clase representa el formato de datos gzip, que utiliza un algoritmo


estándar del sector para la compresión y descompresión de archivos sin
pérdidas. El formato incluye un valor de prueba cíclica de redundancia para
detectar daños en los datos. El formato de datos gzip utiliza el mismo
algoritmo que la clase DeflateStream, pero se puede extender para que
utilice otros formatos de compresión. El formato se puede implementar con
facilidad de una manera no protegida por patentes. Esta clase no se puede
utilizar para comprimir archivos de un tamaño mayor que 4 GB.

Figura 2: Objeto GZipStream


Referencia: http://www.slideshare.net/antoniopalomaressender/framework-net-35-14-gestin-de-archivos-y-
serializacin

Los objetos GZipStream comprimidos escritos en un archivo con la


extensión .gz se pueden descomprimir con diversas herramientas de
compresión comunes; sin embargo, esta clase no proporciona de forma
inherente la funcionalidad para agregar o extraer archivos en archivos .zip.

La funcionalidad de compresión en DeflateStream y GZipStream se


expone como una secuencia. Los datos se leen byte a byte, por lo que no
es posible realizar varios pases a fin de determinar el método más
adecuado para comprimir archivos enteros o grandes bloques de datos. Las
clases DeflateStream y GZipStream se utilizan de forma óptima en
orígenes de datos sin comprimir. Si los datos de origen ya están
comprimidos, el uso de estas clases puede aumentar el tamaño de la
secuencia.

En la tabla siguiente se muestran los métodos de la clase GZipStream:

Método Descripción
Close Cierra la secuencia actual y libera todos los
recursos (como sockets e identificadores de
archivo) asociados a ésta. (Se hereda de Stream).
Finalize Permite que un objeto Object intente liberar
recursos y realizar otras operaciones de limpieza
antes de que el objeto Object sea reclamado por el
recolector de elementos no utilizados. (Se hereda
de Object).
Flush Vuelca el contenido del búfer interno del objeto de

CIBERTEC CARRERAS PROFESIONALES


150

secuencia actual en la secuencia subyacente.


(Invalida a Stream.Flush).
Read Introduce varios bytes descomprimidos leídos en la
matriz de bytes especificada. (Invalida a
Stream.Read(Byte(), Int32, Int32)).
ReadByte Lee un byte de la secuencia y hace avanzar la
posición de la secuencia en un byte, o devuelve -1
si está al final de la secuencia. (Se hereda de
Stream).
Write Escribe los bytes comprimidos en la secuencia
subyacente de la matriz de bytes especificada.
(Invalida a Stream.Write(Byte(), Int32, Int32)).
WriteByte Escribe un byte a la posición actual en la secuencia
y avanza la posición de la secuencia en un byte.
(Se hereda de Stream).

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 151

LABORATORIO 7.1
Comprimir datos utilizando el DeflateStream
Se desea implementar un programa que permita comprimir los datos en un archivo
secuencial comprimido. Ingrese datos desde un TextBox, al presionar el botón Comprimir
se visualiza un cuadro de dialogo para almacenar los datos comprimidos.
Se pide:
1. Diseña un Formulario para listar los servicios.
2. Programe los eventos de los controles Button para realizar las operaciones.

1. DISEÑO DEL FORMULARIO.


A continuación diseñe el formulario para guardar datos y comprimir, tal como se muestra

TextBox: txtBlock
MultiLine: True
ScrollBars: Verticla

2. Programación.
En la ventana de Programación referenciar las librerías System.IO y el IO.Compression

Referenciar las librerías


IO y el IO.Compression

CIBERTEC CARRERAS PROFESIONALES


152

En el evento clic del botón Guardar, definimos un cuadro de dialogo (SaveFileDialog),


para guardar el contenido en un archivo de Texto

Definir cuadro de dialogo


para guardar el contenido
un archivo de texto

Si aceptas guardar, instanciar un


StreamWriter para escribir el contenido

En el evento Clic del botón Comprimir, comprima el contenido del TextBox utilizando la
clase DeflateStream, almacenando el contenido en un archivo.

Almaceno el contenido
del textBox en un
MemoryStream

Defina el DeflateStream para


comprimir los datos del Memory

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 153

Al finalizar, presione F5, para ejecutar el proceso de comprimir el contenido del


TextBox en un archivo zip

LABORATORIO 7.2
Comprimir datos utilizando el GZipStream
Se desea implementar un programa que permita realizar operaciones sobre un archivo
secuencial: Comprimir y descomprimir datos.
Se pide:
1. Diseña un Formulario.
2. Programación de los botones Comprimir y Descomprimir utilizando la clase GZipStream

1. DISEÑO DEL FORMULARIO.


A continuación diseñe el formulario para el comprimir y descomprimir datos

TextBox: txtBlock
MultiLine: True
ScrollBars: Verticla

CIBERTEC CARRERAS PROFESIONALES


154

2. Programación.
En la ventana de código, referenciar las librerías: System.IO y System.IO.Compression

Referenciar las librerías


IO y el IO.Compression

En el evento Click del botón Comprimir procedemos a realizar el proceso de


compresión del contenido del TextBox; almacenando en un archivo zip.

Almaceno el contenido
del textBox en un
MemoryStream

Defina el GZipStream para


comprimir los datos del Memory

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 155

En el evento Click del botón Descomprimir, abrir el archivo comprimido y procedemos


a realizar el proceso de descompresión visualizando el contenido en el TextBox.

FileStream para abrir


el archivo y
descomprimir su
contenido

Almacenar los bytes


descomprimidos en datos

El Memory almacena los bytes


descomprimidos visualizando su
contenido en el TextBox

Al finalizar, presione F5 y ejecute el Formulario, para realizar el proceso de comprimir


y descomprimir datos utilizando la clase GZipStream

CIBERTEC CARRERAS PROFESIONALES


156

Resumen
 El intercambiar datos dentro de nuestra organización sería mucho más eficiente si
estos datos no ocuparan mucho espacio ya que de ese modo al ser transferidos sobre
nuestra red no la sobrecargarían y el transporte sería muchísimo más rápido.
 El espacio de nombres System.IO.Compression contiene clases que
proporcionan servicios de compresión y descompresión básica para las
secuencias.
 Esta clase representa el algoritmo Deflate, un algoritmo estándar en el sector para la
compresión y descompresión de archivos sin pérdidas. Utiliza una combinación del
algoritmo LZ77 y la codificación Huffman. Se pueden generar o se pueden utilizar
datos, incluso para un flujo de datos de entrada presentado secuencialmente y de
longitud arbitraria, usando únicamente una cantidad de almacenamiento intermedio
enlazada previamente
 Esta clase representa el formato de datos gzip, que utiliza un algoritmo estándar del
sector para la compresión y descompresión de archivos sin pérdidas. El formato incluye
un valor de prueba cíclica de redundancia para detectar daños en los datos.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

http://www.idg.es/pcworld/Criptografia-con-.NET_Como-utilizar-las-herramient/art154748.htm

http://msdn.microsoft.com/es-es/library/93bskf9z(v=vs.80).aspx

http://207.46.16.248/es-es/library/system.io.compression(VS.90).aspx

http://geeks.ms/blogs/imostacero/archive/2006/12/22/compresion-y-descompresion-en-el-net-
framework-2-0.aspx

http://www.slideshare.net/antoniopalomaressender/framework-net-35-14-gestin-de-archivos-
y-serializacin

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 157

CIBERTEC CARRERAS PROFESIONALES


158

UNIDAD

4
ADMINISTRACIÓN DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al finalizar la unidad, el alumno, utilizando algoritmos y librerías del NET Framework
4.5, construye aplicaciones Windows para optimizar el manejo de los datos y archivos.

Temario

4.1. Tema 6: Manejo de archivos


4.1.1. Objetos Stream Stream
4.1.1.1. Manejo del StreamReader y StreamWriter
4.1.1.2. Manejo del FileStream
4.1.1.3. Manejo del MemoryStream

4.2. Tema 7: Compresión de datos


4.2.1. Comprimir y descomprimir datos
4.2.1.1. Clase GzipStream: propiedades y métodos

4.3. Tema 8: Serialización de datos


4.3.1. Serialización Binaria
4.3.1.1. Serializar y deserializar datos binarios: Clase BinaryFormatter
4.3.2. Serializacion XML
4.3.2.1. Serializar y deserializar datos en formato XML: Clase XMLSerializer

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para el manejo de archivos y
carpetas administradas por el Sistema Operativo
 Los alumnos desarrollan aplicaciones para el manejo de datos utilizando objetos
Stream.
 Los alumnos crear aplicaciones para serializar un tipo de objeto
 Los alumnos crean una aplicación para realizar la compresión y encriptamiento
de los datos
 Los alumnos desarrollan los laboratorios de la semana.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 159

CIBERTEC CARRERAS PROFESIONALES


160

4.3 SERIALIZACION
La serialización es el proceso de convertir un objeto en una secuencia de bytes
para conservarlo en memoria, una base de datos o un archivo. Puede guardar y
volver a crear este tipo de objetos mediante la funcionalidad que proporciona .NET
Framework.

Como Funciona la Serialización


El objeto se serializa en una secuencia que, además de los datos, contiene
información sobre el tipo de objeto, como la versión, referencia cultural y nombre de
ensamblado. Esa secuencia se puede almacenar en una base de datos, un archivo
o en memoria.

Figura 1: Proceso de Serialización

Uso de la Serialización
La serialización permite al desarrollador guardar el estado de un objeto y volver a
crearlo cuando es necesario, y proporcionar almacenamiento de objetos e
intercambio de datos.

A través de la serialización, un desarrollador puede realizar acciones como enviar


un objeto a una aplicación remota por medio de un servicio Web, pasar un objeto
de un dominio a otro, pasar un objeto a través de un firewall como una cadena XML
o mantener la seguridad o información específica del usuario entre aplicaciones.

SERIALIZACION BINARIA Y XML


Se puede utilizar serialización binaria o XML. En la serialización binaria, se
serializan todos los miembros, incluso aquellos que son de sólo lectura, y se mejora
el rendimiento. La serialización XML proporciona código más legible, así como
mayor flexibilidad para compartir objetos y utilizarlos para fines de interoperabilidad.

4.3.1 Serialización Binaria


La serialización binaria utiliza la codificación binaria a fin de generar una
serialización compacta para usos como almacenamiento o secuencias de
red basadas en sockets. No es conveniente pasar los datos a través de un
firewall, pero proporciona mejor rendimiento al almacenarlos.

El espacio de nombres System.Runtime.Serialization.Formatters.Binary


contiene la clase BinaryFormatter, que se puede utilizar para serializar y
deserializar los objetos en formato binario.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 161

4.3.1.1 Clase BinaryFormatter


Serializa o deserializa un objeto o todo un gráfico de objetos conectados,
en formato binario.
En la tabla siguiente se muestran los métodos de la clase
BinaryFormatter:

Método Descripción
Deserialize Deserializa una secuencia en un gráfico
de objetos
Serialize Serializa un objeto o un gráfico de
objetos conectados en la secuencia
indicada
Deserialize Deserializa una respuesta a una llamada
de método remota a partir del Stream
proporcionado.

4.3.2 Serialización XML


La serialización XML serializa las propiedades y campos públicos de un
objeto o los parámetros y valores devueltos de los métodos en una
secuencia XML que se ajusta a un documento específico del lenguaje de
definición de esquemas XML (XSD).

La serialización XML produce clases con establecimiento inflexible de tipos


cuyas propiedades y campos se convierten a XML. La enumeración
System.Xml.Serialization contiene las clases necesarias para serializar y
deserializar XML.

La clase central del NameSpace es la clase XmlSerializer. Para utilizar


esta clase, utilice el constructor XmlSerializer para crear una instancia de la
clase definiendo el tipo de objeto a serializar. Una vez que el XmlSerializer
es creado, crear una instancia del objeto a serializar. Debes también crear
un objeto para escribir el archivo hacia un documento o stream, tal como
Stream, TextWriter, or XmlWriter. Puedes invocar el método Serialize
para convertir el objeto hacia un documento XML.

4.3.2.1 Clase XMLSerializer


La serialización XML es el proceso mediante el cual los campos y
propiedades públicos de un campo se convierten a un formato de serie
(en este caso, XML) a efectos de almacenamiento o transporte. La
deserialización vuelve a crear el objeto en su estado original a partir de
los resultados XML. Por consiguiente, la serialización puede
considerarse como una manera de guardar el estado de un objeto en
una secuencia o un búfer. Por ejemplo, ASP.Net utiliza la clase
XmlSerializer para codificar mensajes de servicios Web XML

En la tabla siguiente se muestran los métodos de la clase XMLSerializer:

Método Descripción
CanDeserialize Obtiene un valor que indica si este
XmlSerializer puede deserializar un
documento XML especificado.
DeSerialize Deserializa un documento XML.
Serialize Serializa un objeto en un documento

CIBERTEC CARRERAS PROFESIONALES


162

XML.

Para serializar un objeto en XML


1. Cree el objeto y establezca sus campos y propiedades públicos.
2. Construya una clase XmlSerializer con el tipo del objeto. Para
obtener más información, vea los constructores de clase
XmlSerializer.
3. Llame al método Serialize para generar una secuencia XML o una
representación de archivo de los campos y propiedades públicos del
objeto. En el ejemplo siguiente se crea un archivo.

Para deserializar un objeto en XML


1. Construya un XmlSerializer con el tipo del objeto que se va a
deserializar.
2. Llame al método Deserialize para producir una réplica del objeto. Al
deserializar, debe convertir el objeto devuelto al tipo del original,
como se muestra en el siguiente ejemplo, en el que se deserializa el
objeto en un archivo (aunque también puede deserializarse en una
secuencia).

Controlar la Serialización de Matrices


Los atributos XmlArrayAttribute y XmlArrayItemAttribute están
diseñados para controlar la serialización de matrices. Con estos atributos,
puede controlar el nombre del elemento, el espacio de nombres y el tipo de
datos de los esquemas XML (XSD), como se define en el documento del
W3C, en www.w3.org, titulado "XML Schema Part 2: Datatypes".

XmlArrayAttribute determinará las propiedades del elemento XML


envolvente que resulta cuando se serializa una matriz.

Por ejemplo, de manera predeterminada, al serializar la matriz inferior se


creará un elemento XML denominado Employees. El elemento Employees
contendrá una serie de elementos con el nombre del tipo de matriz
Employee

Serializar un ArrayList
Los atributos XmlArrayAttribute y XmlArrayItemAttribute están
diseñados para controlar la serialización

La clase ArrayList puede contener una colección de varios objetos. Por


tanto, puede utilizar ArrayList igual que una matriz. En lugar de crear un
campo que devuelva una matriz de objetos con tipo, puede crear un campo
que devuelva una sola ArrayList. No obstante, al igual que sucede con las
matrices, debe informar a XmlSerializer de los tipos de objetos que
contiene ArrayList. Para ello, asigne varias instancias de
XmlElementAttribute al campo.

Hay dos atributos que pueden aplicarse a una clase (y sólo una clase):
XmlRootAttribute y XmlTypeAttribute. Estos atributos son muy similares.
XmlRootAttribute puede aplicarse únicamente a una clase: aquella que,
cuando se serializa, representa el elemento de apertura y cierre del
documento XML; en otras palabras, el elemento raíz. Por otra parte,
XmlTypeAttribute puede aplicarse a cualquier clase, incluso a la clase raíz.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 163

Por ejemplo, en los ejemplos anteriores, la clase Group es la clase raíz y


todas sus propiedades y campos públicos se convierten en los elementos
XML encontrados en el documento XML. Por lo tanto, sólo puede haber una
clase raíz. Al aplicar el atributo XmlRootAttribute, puede controlar la
secuencia XML que genera el XmlSerializer. Por ejemplo, puede cambiar
el espacio de nombres y el nombre del elemento.

XmlTypeAttribute permite controlar el esquema del XML generado. Esta


capacidad resulta útil cuando necesita publicar el esquema a través de un
servicio Web XML. En el ejemplo siguiente se aplica XmlTypeAttribute y
XmlRootAttribute a la misma clase.

CIBERTEC CARRERAS PROFESIONALES


164

LABORATORIO 8.1
Serialización Binaria
Se desea implementar un programa que serialice un texto en formato binario. Ingrese
el texto en un control TextBox, al presionar el botón SERIALIZAR, guardar el contenido
del TextBox en un archivo binario.
Se pide:
1. Diseña un Formulario para realizar el cifrado de datos.
2. Programe los eventos Serializar y Deserializar en formato binario

1. Diseño de Formulario.
A continuación diseñe el formulario para realizar la serialización de datos.

TextBox: txtBlock
MultiLine: True
ScrollBars: Verticla

2. Programación.
En la ventana de código, referenciar las librerías System.IO y
System.Runtime.Serialization.Formatters.Binary (serialización binaria)

Importar las librerías para


el manejo de archivos y
serializacion binaria

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 165

Programa el evento del botón Serializar, donde almacena los datos en formato binario.

Cuadro de dialogo para


guardar archivo binario

Si aceptas, definir el FileStream para


crear el archivo, definir el formateador
Binario y serializar el contenido del
TextBox en f

Programa el evento del botón Serializar, donde almacena los datos en formato binario.

Cuadro de dialogo para abrir


archivo binario

Si aceptas, definir el FileStream para


abrir el archivo, definir el formateador
Binario y deserializar el contenido
visualizando en el TextBox

CIBERTEC CARRERAS PROFESIONALES


166

Al finalizar, presione F5 y ejecute el Formulario, para ejecutar los procesos de


serialización en formato binario.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 167

LABORATORIO 8.2
Serialización XML
Implemente un programa que permita serializar el registro de un Alumno en un archivo
XML. Se pide:
1. Defina una clase para registrar los datos del Alumno
2. Diseña un Formulario para ingresar los datos del Alumno.
3. Programe el evento para Serializar el registro del Alumno en un archivo XML y el
evento para Deserializar el archivo XML visualizando los datos del Alumno

1. Definir la clase Alumno


Para serializar en formato XML, defina una clase, declare los atributos de la clase

2. Diseña el Formulario

DateTimePicker:
(name):dtFechaNac
Format: short

CIBERTEC CARRERAS PROFESIONALES


168

2. Programación.
En la ventana de código, referenciar las librerías System.IO y el
System.Xml.Serialization

Importar las librerías de la


aplicación

Programa el evento Click del Boton Limpiar, donde borramos el contenido de los
controles, y enfocando en el control txtDNI.

Evento del botón Limpiar,


borra el contenido de los
controles

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 169

Programa el evento del botón Serializar, para serializar los datos registrados de un
alumno en una estructura XML.

Cuadro de dialogo
para guardar el
archivo

Instanciar la clase
Alumno e ingresar
los datos

FileStream para
crear el archivo

Defina el serializador xml de tipo


Alumno, ejecuta el metodo
Serialize()

Para verificar el proceso, ejecutar la aplicación. Ingresa los datos y presiona el botón
Serializar, donde los datos se almacenan en formato xml, tal como se muestra.

CIBERTEC CARRERAS PROFESIONALES


170

En el evento Click del Boton Deserializar, abrimos un archivo XML, al ejecutar el


método Deserialize, el objeto será asignado a una variable tipo Alumno y procedemos
a mostrar los datos en los controles

Cuadro de dialogo
para abrir el archivo

FileStream que
permite abrir el
archivo

Defina al Serializador de tipo


Alumno y procedes a
deserializar, visualizando los
datos en los controles

Ejecutar el Formulario, para mostrar los datos almacenados, presione el botón


Deserializar el cual buscara el archivo XML donde se visualizara los datos.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 171

LABORATORIO 8.3
Serialización de una colección
Implemente un programa que permita serializar los registros de los Alumnos que
estarán almacenados en una colección dentro de un archivo XML.
Se pide:
1. Defina una clase para registrar los datos del Alumno
2. Defina una clase para almacenar la colección de Alumno
3. Diseña un Formulario para ingresar los datos del Alumno.
4. Programe los procesos:
a. Agregar un Alumno a la colección
b. Serializar la colección de los registros del Alumno en un archivo XML

1. Definir las clases de la aplicación

Defina la clase
Alumno

Defina la clase Listado. Declare una colección de tipo Alumno definiéndole el atributo
<XmlArrayItem>

Referencia la librería de
la serializacion

Defina la clase Alumnos


donde almacena un a
colección de Alumno

CIBERTEC CARRERAS PROFESIONALES


172

2. Diseña el Formulario

ListView: lvAlumnos

3. Programación.
En la ventana de código, referenciar System.IO y el System.Xml.Serialization

Defina las librerias

Instanciar la clase Alumnos a nivel class Formulario, tal como se muestra

Instanciar la clase
Alumnos en el
Formulario

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 173

Defina el método Listado, que cual listará los elementos de la colección Lista en el
control ListView: lvAlumnos

Programa el evento Click del botón Agregar, donde un registro de Alumno será
agregado a la colección Lista

Instancia la clase
Registro y
almacenar los
datos en el objeto

Agregar el objeto al
arrayList lista

CIBERTEC CARRERAS PROFESIONALES


174

Programa el evento del botón Serializar, donde el contenido de la colección se


guardará en un archivo XML

Cuadro de dialogo
para guardar en
formato xml

FileStream para
crear archivo

Definir el
serializador de tipo
Alumnos

Serializar y cerrar el
FileStream

Ejecute el programa, agregue los registros de los Alumnos, para almacenar los
registros de alumnos en el archivo XML

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 175

Resumen
 La serialización es el proceso de convertir un objeto en una secuencia de bytes para
conservarlo en memoria, una base de datos o un archivo. Puede guardar y volver a
crear este tipo de objetos mediante la funcionalidad que proporciona .NET Framework.
 La serialización permite al desarrollador guardar el estado de un objeto y volver a
crearlo cuando es necesario, y proporcionar almacenamiento de objetos e intercambio
de datos.
 Se puede utilizar serialización binaria o XML. En la serialización binaria, se serializan
todos los miembros, incluso aquellos que son de sólo lectura, y se mejora el
rendimiento. La serialización XML proporciona código más legible, así como mayor
flexibilidad para compartir objetos y utilizarlos para fines de interoperabilidad.
 La serialización binaria utiliza la codificación binaria a fin de generar una serialización
compacta para usos como almacenamiento o secuencias de red basadas en sockets.
El espacio de nombres System.Runtime.Serialization.Formatters.Binary contiene la
clase BinaryFormatter, que se puede utilizar para serializar y deserializar los objetos
en formato binario.
 La serialización XML serializa las propiedades y campos públicos de un objeto o los
parámetros y valores devueltos de los métodos en una secuencia XML que se ajusta a
un documento específico del lenguaje de definición de esquemas XML (XSD).
 La serialización XML es el proceso mediante el cual los campos y propiedades
públicos de un campo se convierten a un formato de serie (en este caso, XML) a
efectos de almacenamiento o transporte. La deserialización vuelve a crear el objeto en
su estado original a partir de los resultados XML.
 Los atributos XmlArrayAttribute y XmlArrayItemAttribute están diseñados para
controlar la serialización. La clase ArrayList puede contener una colección de varios
objetos. Por tanto, puede utilizar ArrayList igual que una matriz. En lugar de crear un
campo que devuelva una matriz de objetos con tipo, puede crear un campo que
devuelva una sola ArrayList. No obstante, al igual que sucede con las matrices, debe
informar a XmlSerializer de los tipos de objetos que contiene ArrayList. Para ello,
asigne varias instancias de XmlElementAttribute al campo.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

http://msdn.microsoft.com/es-es/library/ms233836(v=vs.80).aspx

http://msdn.microsoft.com/es-es/library/system.runtime.serialization.
formatters.binary(v=VS.80).aspx
http://stackoverflow.com/questions/17739330/xmlserializer-convert-c-sharp-object-to-xml-
string
 https://www.udemy.com/blog/csharp-serialize-to-xml/

CIBERTEC CARRERAS PROFESIONALES


176

UNIDAD

5
SEGURIDAD DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al finalizar la unidad, el alumno, utilizando algoritmos y librerías del NET Framework
4.5, construye aplicaciones para optimizar el manejo, control y seguridad de los datos
y archivos.

Temario

5.1 Tema 9: Encriptamiento de datos


5.1.1 Definición de Criptografía o encriptamiento
5.1.2 Tipos de encriptamiento
5.1.3 Clases y servicios para encriptar y desencriptar datos
5.1.3.1 Clase CryptoStream
5.1.3.2 Servicio Sha1CryptoServiceProvider
5.1.3.3 Servicio DEScryptoServiceProvider

5.2 Tema 10: Almacenamiento Aislado


5.2.1 Creando un área de almacenamiento aislado
5.2.2 Almacenamiento de archivos y carpetas: IsolatedStorageFile
5.2.2.1 Manejo de carpetas aisladas
5.2.2.2 Manejo de archivos aislados
5.2.3 Manejo de archivos aislados: IsolatedStorageFileStream

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para el manejo de archivos y
carpetas administradas en forma aislada por el Sistema Operativo
 Los alumnos crear aplicaciones para encriptar los datos definiendo un tipo de
servicio criptográfico.
 Los alumnos desarrollan los laboratorios de la semana.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 177

CIBERTEC CARRERAS PROFESIONALES


178

5.1 ENCRIPTAMIENTO DE DATOS


Las redes públicas como Internet no proporcionan un medio de comunicación
segura entre entidades. La comunicación en esas redes es susceptible de que
terceras personas, sin autorización, tengan acceso a ella o la modifiquen. Además
de permitir el cifrado de los archivos de los discos locales, la criptografía ayuda a
crear medios de comunicación seguros sobre canales que, de otro modo, serían
inseguros, proporcionando a su vez integridad de datos y autenticación.

Las clases del espacio de nombres de criptografía de .NET Framework se ocupan


de administrar muchos de los detalles de la criptografía. Algunos son contenedores
para Microsoft CryptoAPI no administrado, mientras que otros son meramente
implementaciones administradas. No necesita ser un experto en criptografía para
utilizar estas clases. Cuando crea una nueva instancia de una de las clases de
algoritmos de cifrado, se generan automáticamente claves para facilitar el uso y las
propiedades predeterminadas son lo más seguras posible.

5.1.1 Definición de criptografía o encriptamiento


La encriptación es el proceso para volver ilegible información considere importante.
Se trata de una medida de seguridad que es usada para almacenar o transferir
información delicada que no debería ser accesible a terceros. Pueden ser
contraseñas, números de tarjetas de crédito, conversaciones privadas, etc.

Para encriptar la información se utilizan formulas matemáticas y para desencriptar,


se debe usar una clave como parámetro para estas formulas. El texto que esta
encriptado o cifrado se llama criptograma

5.1.2. Tipos de encriptamiento


NET proporciona implantaciones de numerosos algoritmos criptográficos
estándares: cifrado simétrico y asimétrico, hash, generación de números
pseudoaleatorios, firma de mensajes, derivación de claves a partir de
contraseñas, etc. Estos algoritmos son fáciles de utilizar y disponen de las
propiedades predeterminadas más seguras.

El sistema de seguridad de .NET implanta un modelo extensible de


herencia de clases derivadas. La jerarquía es la siguiente:

1. En primer lugar, la clase base abstracta que define el tipo genérico de


algoritmo, como por ejemplo, SymmetricAlgorithm o HashAlgorithm. Esta
clase base abstracta define métodos y propiedades que son comunes a
todos los algoritmos derivados de ella.

2. A continuación, la clase abstracta del algoritmo concreto hereda de la


clase base abstracta del tipo de algoritmo, como por ejemplo, RC2 para
SymmetricAlgorithm o SHA1 para HashAlgorithm. Este nivel también es
abstracto. Estas clases abstractas tienen dos funciones. Por un lado,
exponen detalles específicos del algoritmo, como tamaños de bloque o de
clave.

3. Por último, la implantación concreta de la clase de algoritmo hereda de la


clase abstracta del algoritmo, por ejemplo RC2CryptoServiceProvider para
RC2 o SHA1Managed para SHA1. Este nivel está completamente
implantado. Es importante señalar que cada vez que se crea un objeto de
estas clases, .NET rellena todos los parámetros del algoritmo (claves,

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 179

vectores de inicialización, modos de operación, etc.) automáticamente,


utilizando valores tan seguros como sea posible.

La convención de nombres para las clases que implantan los algoritmos


consiste en utilizar el nombre del algoritmo seguido de una cadena que
identifica al origen de la implantación. El sufijo CryptoServiceProvider
denota una implantación basada en los Proveedores de Servicios
Criptográficos de Microsoft (CSP), integrados en la CryptoAPI.

El CLR utiliza un diseño basado en secuencias o streams para implantar


algoritmos de cifrado simétrico y algoritmos de hash. El núcleo de este
diseño es la clase CryptoStream, derivada de la clase System.IO.Stream,
que implanta la interfaz ICryptoTransform. ICryptoTransform representa
cualquier transformación matemática bloque a bloque, como es la
operación de cifrado de un cifrador simétrico en bloque o como son las
operaciones de codificación, por ejemplo, en Base64.
Las transformaciones sobre secuencias se realizan envolviendo un
ICryptoTransform alrededor de la secuencia de entrada utilizando la clase
CryptoStream. El CryptoStream se crea especificando: a) la secuencia de
entrada, b) el ICryptoTransform a aplicar sobre los datos de entrada, y c) el
modo de operación (lectura o escritura).

5.1.3 Clases y servicios para encriptar y desencriptar datos

5.1.3.1 Algoritmos de hash


Las funciones de resumen (hash) se utilizan para producir un resumen de
longitud fija a partir de un mensaje de longitud variable, siendo la longitud
del resumen muy inferior a la del mensaje, entre 64 y 160 bits, típicamente.

Los resúmenes criptográficos se caracterizan porque resulta prácticamente


imposible regenerar el mensaje conociendo sólo el resumen (propiedad de
unidireccionalidad). Poseen además una tasa de colisiones muy baja, es
decir, la probabilidad de que a partir de dos mensajes distintos se obtenga
el mismo resumen es muy baja.

Figura 1: Algoritmo Hash

Los algoritmos más utilizados actualmente para resúmenes criptográficos


son MD5 y SHA-1.

CIBERTEC CARRERAS PROFESIONALES


180

.NET representa las funciones criptográficas de hash mediante la clase


base abstracta HashAlgorithm. Las clases abstractas derivadas
corresponden a los algoritmos MD5, SHA-1, SHA-256, SHA-384 y SHA-
512, siendo el de uso más extendido hoy día SHA-1, con una longitud de
160 bits. A su vez, estos algoritmos están implantados por las siguientes
clases: MD5CryptoServiceProvider, SHA1CryptoServiceProvider y
SHA1Managed, SHA256Managed, SHA384Managed y SHA512Managed.

Para crear el hash de una cadena de datos, basta con crear un objeto
HashAlgorithm correspondiente al algoritmo elegido y llamar al método
ComputeHash() del objeto.

Para crear el hash SHA-1 de un array de bytes almacenado en la variable


arrDatos:

SHA1Managed sha1 = new SHA1Managed();


byte[] hash = sha1.ComputeHash(arrDatos);

El objeto sha1 también podría haberse creado llamando directamente al


método Create() de la clase base:

SHA1 sha = SHA1.Create();

5.1.3.2 Algoritmo de Cifrado Simetrico


El cifrado consiste en transformar mediante un algoritmo matemático un
texto en claro inteligible por todos en un texto cifrado, totalmente ininteligible
excepto para el legítimo destinatario del mismo, que será el poseedor de la
clave secreta. Se distinguen dos métodos generales de cifrado: cifrado
simétrico y cifrado asimétrico.

Figura 2: Encriptar con cifrado simétrico

Cuando se emplea la misma clave en las operaciones de cifrado y


descifrado, se dice que el criptosistema es simétrico o de clave secreta.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 181

Figura 3: Algoritmo de clave simétrica

Estos sistemas son mucho más rápidos que los de clave pública, por lo que
resultan apropiados para el cifrado de grandes volúmenes de datos. Ésta
es la opción utilizada para cifrar el cuerpo de los mensajes en el correo
electrónico o los datos intercambiados en las comunicaciones digitales a
través de Internet o el contenido de un archivo del disco duro o los registros
de una base de datos.

Estos criptosistemas pueden dividirse en dos categorías:


- Cifradores en flujo: trabajan sobre flujos continuos de bits.
- Cifradores de bloque: cifran los datos utilizando bloques de tamaño fijo.

En .NET, todo algoritmo simétrico necesita que se definan una serie de


parámetros heredados de la clase base abstracta SymmetricAlgorithm:
 Key: el valor de la clave secreta.
 Mode: el modo de encadenamiento del cifrado de bloques. Es un
valor enumerado CipherMode con cinco miembros: CBC, CFB,
CTS, ECB y OFB. El valor predeterminado es encadenamiento de
bloques cifrados (CipherMode.CBC).
 IV: el vector de inicialización (IV) del algoritmo cuando se utiliza en
un modo de encadenamiento, como por ejemplo, CBC. Los
vectores de inicialización no necesitan mantenerse en secreto,
aunque siempre deberían elegirse de forma aleatoria.

El primer paso en el cifrado consiste en crear una instancia de una clase


que implante un algoritmo simétrico particular. De la clase base abstracta
SymmetricAlgorithm derivan cuatro clases abstractas: DES, RC2, Rijndael y
TripleDES. A su vez, las siguientes clases implantan los respectivos
algoritmos: DESCryptoServiceProvider, RC2CryptoServiceProvider,
RijndaelManaged y TripleDESCryptoServiceProvider.

Por lo tanto, hay que instanciar una cualquiera de estas cuatro clases,
según el algoritmo deseado. Por ejemplo, para crear un objeto que implante
el algoritmo DES se puede utilizar:

DESCryptoServiceProvider servicio =
new DESCryptoServiceProvider();

CIBERTEC CARRERAS PROFESIONALES


182

También se puede llamar al método Create() de la clase abstracta que


representa el algoritmo:

DES servicio = DES.Create();

En tal caso, .NET utilizará la clase derivada predeterminada, que en este


caso es DESCryptoServiceProvider.

A continuación, se crean sendos objetos ICryptoTransform que representen


las operaciones de cifrado y descifrado para la elección determinada de
cifrador/clave/IV.
Estos objetos se crean utilizando los métodos CreateEncryptor() y
CreateDecryptor().

5.1.3.3. Clase CryptoStream

Por último, la secuencia con los datos de entrada se envuelve en el


CryptoStream y se cifran o descifran los datos. Este procedimiento queda
ilustrado en el siguiente ejemplo, en el que los datos de entrada están
almacenados en el array de bytes arrInput.

MemoryStream ms=new MemoryStream();


byte[] DESIV=new byte[]{10,61,235,120,122,120,80,248};
byte[] DESKey=new byte[] {23,12,132,99,2,123,221,190};

DESCryptoServiceProvider des=new DESCryptoServiceProvider();


ICryptoTransform ic=des.CreateEncryptor(DESKey,DESIV);

CryptoStream cs=new CryptoStream(ms,ic,CryptoStreamMode.Write);

cs.Write(arrInput,0,arrInput.Length);
cs.FlushFinalBlock();
cs.Close();
arrResultado = ms.ToArray();

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 183

LABORATORIO 9.1
Encriptando una cadena
Se desea implementar un programa que realice el cifrado de una cadena. Ingrese una
cadena en un control TextBox, al presionar el botón CIFRAR, visualice la cadena
cifrada como una secuencia de bytes
Se pide:
1. Diseña un Formulario para realizar el cifrado de datos.
2. Programe el evento del Button Cifrar Datos, para realizar la operación del cifrado

1. Diseño del Formulario.


A continuación diseñe el formulario para realizar el cifrado de datos, tal como se
muestra

TextBox: txtcadena

Button: btncifrar

TextBox: txtcadenacifrada

2. Programación.
En la ventana de código, referenciar las librerías System.IO y de cifrado de datos
System.Security.Cryptography

Definir las librerías del


programa

CIBERTEC CARRERAS PROFESIONALES


184

En el evento clic del botón Abrir, procedemos a cifrar los datos de una cadena
almacenada en el TextBox: txtcadena, donde se visualiza el cifrado en el TextBox:
txtcadenacifrada.

Definir el MemoryStream
para almacenar la
secuencia de bytes del
textBox

Definir el servicio y
calcular el valor hash

Mostrar los datos en


el TextBox txtcifrado

Al finalizar, presione F5, ingrese una cadena en el TextBox txtcifrado, al presionar el botón
CIFRAR DATOS, se visualiza la secuencia de datos cifrados

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 185

LABORATORIO 9.2
Encriptar texto
Implemente un programa que permita realizar el cifrado y descifrado de los datos
almacenando en un archivo de Texto. Escriba un texto en el control TextBox, al
presionar el botón CIFRAR DATOS, los datos serán cifrados y almacenados en un
archivo de texto. Para realizar el descifrado de datos, Abrir un archivo el cual se ha
cifrado y visualice su contenido descifrado.
Se pide:
1. Diseña un Formulario para realizar el cifrado y descifrado de datos
2. Programe los botones para realizar con el proceso.

1. Diseño de Formulario

Button: btnCifrado

Button: btnDescrifrado

TextBox: txtTexto
MultiLine:true
ScrollBars: vertical

2. Programación.
En la ventana de Programación o código, primero hacemos referencia a la librería
System.IO y el System.Security.Cryptography

Importar las librerías

CIBERTEC CARRERAS PROFESIONALES


186

Declare a nivel Formulario el servicio de Criptografia: DESCryptoServiceProvider para


realizar el cifrado y descifrado de los datos. Defina la llave (key) y el vector de
inicialización (iv) para los procesos de cifrado y descifrado.

Definir el servicio de
encriptado, defina su llave
y su vector de
inicialización

En el evento Click del botón Cifrar Datos, procedemos a cifrar los datos que se
visualiza en el TextBox, utilizando un CryptoStream y almacenar el cifrado en el
FileStream

MemoryStream que
almacena la secuencia de
bytes del TextBox

Defina el cryptoStream para


encriptar los datos
almacenados en el
Cerrar
MemoryStream

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 187

En el evento Click del botón Descifrar Datos, abrir un archivo cifrado, visualizar en el
TextBox txtdatos la información descifrada.

Defina el FileStream
para abrir el encriptado

Defina el cryptonStream
para desencriptar y
almacenar en el Array

Almacenar la secuencia
desencriptada en el
MemoryStream para visualizar
los datos

Ejecutar el Formulario. Abrir un archivo y visualizar su contenido, al presionar el botón


Cifrar Datos, se abrirá un cuadro de dialogo para guardar el Cifrado.

CIBERTEC CARRERAS PROFESIONALES


188

LABORATORIO 9.3
Encriptando texto con TripleDescriptorServiceProvider
Se desea implementar un programa que permita ecnriptar y desencriptar datos desde un
archivo de texto. Abrir un archivo secuencial desde el botón ABRIR, al presionar el botón
CIFRADO para encriptar los datos almacenando en un archivo de texto, al presionar el
botón DESCIFRADO, abrir el archivo y visualizar los datos descifrado. Utilice el servicio
TripleDescriptorServiceProvider

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 189

Resumen
 El intercambiar datos dentro de nuestra organización sería mucho más eficiente si
estos datos no ocuparan mucho espacio ya que de ese modo al ser transferidos sobre
nuestra red no la sobrecargarían y el transporte sería muchísimo más rápido.
 Las clases del espacio de nombres de criptografía de .NET Framework se ocupan de
administrar muchos de los detalles de la criptografía. Algunos son contenedores para
Microsoft CryptoAPI no administrado, mientras que otros son meramente
implementaciones administradas.
 Net proporciona implantaciones de numerosos algoritmos criptográficos estándares:
cifrado simétrico y asimétrico, hash, generación de números pseudoaleatorios, firma de
mensajes, derivación de claves a partir de contraseñas, etc. Estos algoritmos son
fáciles de utilizar y disponen de las propiedades predeterminadas más seguras.
 .NET representa las funciones criptográficas de hash mediante la clase base abstracta
HashAlgorithm.
 El cifrado consiste en transformar mediante un algoritmo matemático un texto en claro
inteligible por todos en un texto cifrado, totalmente ininteligible excepto para el legítimo
destinatario del mismo, que será el poseedor de la clave secreta. Se distinguen dos
métodos generales de cifrado: cifrado simétrico y cifrado asimétrico.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

http://www.idg.es/pcworld/Criptografia-con-.NET_Como-utilizar-las-herramient/art154748.htm

http://msdn.microsoft.com/es-es/library/93bskf9z(v=vs.80).aspx

http://207.46.16.248/es-es/library/system.io.compression(VS.90).aspx

http://geeks.ms/blogs/imostacero/archive/2006/12/22/compresion-y-descompresion-en-el-net-
framework-2-0.aspx

CIBERTEC CARRERAS PROFESIONALES


190

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 191

UNIDAD

5
SEGURIDAD DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al finalizar la unidad, el alumno, utilizando algoritmos y librerías del NET Framework
4.5, construye aplicaciones para optimizar el manejo, control y seguridad de los datos
y archivos.

Temario

5.1 Tema 9: Encriptamiento de datos


5.1.1 Definición de Criptografía o encriptamiento
5.1.2 Tipos de encriptamiento
5.1.3 Clases y servicios para encriptar y desencriptar datos
5.1.3.1 Clase CryptoStream
5.1.3.2 Servicio Sha1CryptoServiceProvider
5.1.3.3 Servicio DEScryptoServiceProvider

5.2 Tema 10: Almacenamiento Aislado


5.2.1 Creando un área de almacenamiento aislado
5.2.2 Almacenamiento de archivos y carpetas: IsolatedStorageFile
5.2.2.1 Manejo de carpetas aisladas
5.2.2.2 Manejo de archivos aislados
5.2.3 Manejo de archivos aislados: IsolatedStorageFileStream

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para el manejo de archivos y
carpetas administradas en forma aislada por el Sistema Operativo
 Los alumnos crear aplicaciones para encriptar los datos definiendo un tipo de
servicio criptográfico.
 Los alumnos desarrollan los laboratorios de la semana.

CIBERTEC CARRERAS PROFESIONALES


192

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 193

10.1 ALMACENAMIENTO AISLADO


Cuando una aplicación almacena datos en un archivo, el nombre de archivo y
la ubicación de almacenamiento se deben elegir con cuidado para minimizar el
riesgo de que otra aplicación llegue a conocer dicha ubicación, lo que la haría
susceptible de recibir daños. Si no se dispone de un sistema estándar que
controle estos problemas, el desarrollo de técnicas ad hoc para minimizar los
conflictos de almacenamiento puede ser complicado y los resultados poco
confiables.

El almacenamiento aislado es un mecanismo de almacenamiento de datos


que proporciona aislamiento y seguridad mediante la definición de modos
estándar de asociar código a los datos guardados. La estandarización ofrece
además otras ventajas. Los administradores pueden usar herramientas
diseñadas para manipular el almacenamiento aislado para configurar el espacio
de almacenamiento de archivos, establecer directivas de seguridad y eliminar
los datos no utilizados. Con el almacenamiento aislado, el código ya no
requiere rutas de acceso únicas para especificar ubicaciones seguras en el
sistema de archivos y los datos están protegidos de otras aplicaciones que solo
tienen acceso a un almacenamiento aislado.

5.2.1 Creando un área de almacenamiento aislado

La utilización de un almacenamiento aislado permite que las aplicaciones que


no son de plena confianza almacenen datos de una forma controlada por la
directiva de seguridad del equipo. Esto resulta especialmente útil para
componentes descargados que quizás el usuario desee usar con cautela. La
directiva de seguridad raramente permite que este tipo de código tenga acceso
al sistema de archivos mediante los mecanismos de E/S estándar. Sin
embargo, de forma predeterminada, el código que se ejecuta desde el equipo
local, una red local o Internet tiene derecho a utilizar almacenamiento aislado.

Ubicaciones del Almacenamiento Aislado

La ubicación cambia dependiendo del sistema operativo. En la siguiente lista


se muestran las ubicaciones raíz en que se crea el almacenamiento aislado en
algunos de los sistemas operativos más frecuentes. Busque el directorio
Microsoft\IsolatedStorage bajo esta ubicación raíz. Para que se muestren los
archivos y carpetas ocultas y ver el almacenamiento aislado en el sistema de
archivos debe cambiar la configuración de carpetas.

Windows XP, Windows Server 2003 - instalación nueva (y actualizaciones


desde Windows 2000 y Windows 98):
Almacenes con movilidad =
<UNIDAD_DEL_SISTEMA>\Documents and Settings\<usuario>\Datos de
programa

Almacenes sin movilidad =


<UNIDAD_DEL_SISTEMA>\Documents and Settings\<usuario>\Configuración
local\Datos de programa

Windows Vista:
Almacenes con movilidad =
<UNIDAD_DEL_SISTEMA>\Users\<usuario>\AppData\Roaming

CIBERTEC CARRERAS PROFESIONALES


194

Almacenes sin movilidad =


<UNIDAD_DEL_SISTEMA>\Users\<usuario>\AppData\Local

Crear, Enumerar y Eliminar Almacenamiento Aislado

Se proporcionan tres clases principales para ayudar a realizar tareas


relacionadas con el almacenamiento aislado:

 IsolatedStorageFile, que deriva de IsolatedStorage, proporciona


administración básica de archivos de aplicación y ensamblado almacenados.
Una instancia de la clase IsolatedStorageFile representa un único almacén
ubicado en el sistema de archivos.
 IsolatedStorageFileStream, que deriva de System.IO.FileStream,
proporciona acceso a los archivos de un almacén.
 IsolatedStorageScope es una enumeración que permite crear y seleccionar
un almacén con el tipo de aislamiento adecuado.

Las clases de almacenamiento aislado permiten crear, enumerar y eliminar


almacenamiento aislado. Los métodos para realizar estas tareas están
disponibles mediante el objeto IsolatedStorageFile. Algunas operaciones
requieren disponer de IsolatedStorageFilePermission que representa el
derecho a administrar el almacenamiento aislado.

5.2.2 Almacenamiento de archivos y carpetas: IsolatedStorageFile

El espacio de nombres System.IO.IsolatedStorage contiene tipos que


permiten la creación y el uso de almacenes aislados. Con estos
almacenes, se pueden leer y escribir los datos a los que no puede
tener acceso el código de menor confianza y se puede evitar la
exposición de información confidencial que puede guardarse en otro
lugar del sistema de archivos.

Los datos se almacenan en compartimentos aislados por el usuario


actual y el ensamblado en que existe el código. Además, los datos
pueden aislarse según el dominio. Junto al almacenamiento aislado
pueden utilizarse perfiles móviles, de forma que los almacenes
aislados trabajarán con el perfil del usuario. La enumeración
IsolatedStorageScope indica los distintos tipos de aislamiento.

En la tabla siguiente se muestran las clases del nameSpace


IsolatedStorage:

Clase Descripción
IsolatedStorage Representa la clase base abstracta de la
que deben derivarse todas las
implementaciones de almacenamiento
aislado.
IsolatedStorageException Excepción que se inicia cuando una
operación del almacenamiento aislado
produce un error
IsolatedStorageFile Representa un área de almacenamiento
aislado que contiene archivos y
directorios

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 195

IsolatedStorageFileStream Expone un archivo dentro del


almacenamiento aislado.

Clase IsolatedStorageFile

Este objeto corresponde a un ámbito de almacenamiento aislado


específico, donde los archivos representados por
IsolatedStorageFileStream existen objetos. Las aplicaciones pueden
utilizar el almacenamiento aislado para guardar los datos en su propia
área aislada del sistema de archivos, sin tener que especificar una ruta
en particular dentro del sistema de archivos.

Desde almacenes aislados pertenecen al ámbito de las asambleas


particulares, más otro código administrado no será capaz de acceder a
los datos de su código (código administrado de plena confianza y las
herramientas de administración pueden tener acceso a las tiendas de
otros montajes). El código no administrado puede acceder a cualquier
almacén aislado.

Métodos
Nombre Descripción
CopyFile (String, String) Copia un archivo existente en un
archivo nuevo.
CreateDirectory Crea un directorio en el ámbito de
almacenamiento aislado.
CreateFile Crea un archivo en el almacén
aislado.
DeleteDirectory Elimina un directorio en el ámbito
de almacenamiento aislado
DirectoryExists Determina si la ruta especificada se
refiere a un directorio existente en
el almacén aislado.
FileExists Determina si la ruta especificada se
refiere a un archivo existente en el
almacén aislado.
GetDirectoryNames () Enumera los directorios en la raíz
de un almacén aislado.
GetFileNames () Enumera los nombres de los
archivos en la raíz de un almacén
aislado.
GetUserStoreForApplication Obtiene el ámbito del usuario de
almacenamiento aislado que se
corresponde con la identidad de
aplicación del código de llamada
GetUserStoreForAssembly Obtiene ámbito del usuario el
almacenamiento aislado
correspondiente a la identidad de
ensamblado del código de llamada.
GetUserStoreForSite Infraestructura. Obtiene un almacén
de usuarios de ámbito aislado para
el uso de aplicaciones en un
dominio de host virtual.
OpenFile (String, FileMode) Abre un archivo en el modo
especificado.

CIBERTEC CARRERAS PROFESIONALES


196

OpenFile (String, FileMode, Abre un archivo en el modo


FileAccess) especificado, con la lectura
especificada / escritura.

5.2.3 Clase IsolatedStorageFileStream

Utilice esta clase para leer, escribir y crear archivos en el


almacenamiento aislado.

Dado que esta clase extiende FileStream, puede utilizar una


instancia de IsolatedStorageFileStream en la mayoría de las
situaciones en las que un FileStream puede ser utilizado de otra
manera, como por ejemplo la construcción de un StreamReader y
StreamWriter.

Constructores
Nombre Descripción
IsolatedStorageFileStream Inicializa una nueva instancia de un
(String, FileMode) objeto IsolatedStorageFileStream
que da acceso al archivo designado
por el camino en el modo
especificado.
IsolatedStorageFileStream Inicializa una nueva instancia de la
(String, FileMode, FileAccess) clase IsolatedStorageFileStream
que da acceso al archivo designado
por el camino, en el modo
especificado, con el tipo de acceso
solicitado.
IsolatedStorageFileStream Inicializa una nueva instancia de la
(String, FileMode, clase IsolatedStorageFileStream
IsolatedStorageFile) que da acceso al archivo designado
por el camino, en el modo
especificado, y en el contexto de la
IsolatedStorageFile especificada
por la FIA.
IsolatedStorageFileStream Inicializa una nueva instancia de la
(String, FileMode, FileAccess, clase IsolatedStorageFileStream
FileShare) que da acceso al archivo designado
por el camino, en el modo
especificado, con el acceso a
archivos especificado, utilizando el
modo de intercambio de archivos
especificado por acción, con el
buffersize especificado.

Métodos
Nombre Descripción
Close Cierra la secuencia actual y libera
todos los recursos (como sockets e
identificadores de archivo)
asociados a la secuencia actual
CopyTo (Stream) Lee los bytes de la secuencia actual
y los escribe en otra secuencia

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 197

Dispose () Libera todos los recursos utilizados


Flush () Borra los búferes de esta secuencia
y hace que todos los datos
almacenados en el búfer se
escriban en el archivo.
Read Copia los bytes del objeto
IsolatedStorageFileStream buffer
actual en una matriz
ReadByte Lee un byte del objeto
IsolatedStorageFileStream en el
almacenamiento aislado
Write Escribe un bloque de bytes en el
objeto IsolatedStorageFileStream
utilizando los datos leídos de una
matriz de bytes
WriteByte Escribe un único byte del objeto
IsolatedStorageFileStream.
Seek Establece la posición actual de este
objeto IsolatedStorageFileStream
en el valor especificado.

CIBERTEC CARRERAS PROFESIONALES


198

LABORATORIO 10.1
Manejo de Carpetas Aisladas
Implemente una aplicación que permita crear carpetas o directorios en un área de espacio
aislado a nivel usuario

1. Diseño del Formulario


A continuación diseñamos el Formulario de trabajo

TextBox: txtNombre

ListBox: lbCarpetas

2. Programación
Defina las librerías de trabajo para el almacenamiento aislado

Importa librería de
almacenamiento
aislado

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 199

Defina el almacenamiento aislado a nivel Usuario

Defina el
almacenamiento a
nivel usuario

Programe el botón Agregar para agregar un Directorio al espacio de almacenamiento


aislado.

Evalúa si existe su
directorio

Crear un directorio
aislado

Listar los directories


aislados en el control
ListView1

CIBERTEC CARRERAS PROFESIONALES


200

Programe el botón Quitar para eliminar un Directorio del espacio de almacenamiento


aislado

Evalúa si NO existe
su directorio

Si existe, eliminar
el directorio

Listar los directories


aislados en el control
ListView1

Presione F5 y ejecute el Formulario, ingrese el nombre de la carpeta dentro del


TextBox, al presionar el botón AGREGAR se listara la carpeta en el ListView1

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 201

LABORATORIO 10.2
Manejo de Archivos en un Espacio Aislado
Implemente una aplicación que permita almacenar y recuperar archivos en un área de
espacio aislado a nivel usuario

1. Diseño del Formulario


A continuación diseñamos el Formulario de trabajo

TextBox: (Name)
txtArchivo

2. Programación
Defina las librerías de trabajo

Librería de
almacenamiento
aislado

CIBERTEC CARRERAS PROFESIONALES


202

Defina el almacenamiento aislado a nivel Usuario

Definir el
almacenamiento
aislado a nivel User
for Assembly

Programa el botón ALMACENA, el cual permita guardar un archivo, en el área de


almacenamiento.
Para trabajar con el InputBox, agregar la referencia Microsoft.VisualBasic, definir el
InputBox con la clase Interaction.InputBox

Defina el
FileStream para
crear el archivo

Defina el escritor para


escribir en el objeto F

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 203

Programa el botón Abrir, el cual permita abrir un archivo en el área de almacenamiento


aislado para visualizar su contenido.

Defina el FileStream para abrir


el archivo aislado

Definir el lector de F y leer su


contenido visualizando en
txtArchivo

Presione F5, ejecute la aplicación para almacenar y recuperar archivos en espacio de


almacenamiento aislado.

CIBERTEC CARRERAS PROFESIONALES


204

Resumen
 El almacenamiento aislado es un mecanismo de almacenamiento de datos que
proporciona aislamiento y seguridad mediante la definición de modos estándar de
asociar código a los datos guardados. La estandarización ofrece además otras
ventajas.
 La utilización de un almacenamiento aislado permite que las aplicaciones que no
son de plena confianza almacenen datos de una forma controlada por la directiva
de seguridad del equipo.
 La ubicación cambia dependiendo del sistema operativo. En la siguiente lista se
muestran las ubicaciones raíz en que se crea el almacenamiento aislado en algunos de
los sistemas operativos más frecuentes. Busque el directorio Microsoft\IsolatedStorage
bajo esta ubicación raíz.
 Las clases de almacenamiento aislado permiten crear, enumerar y eliminar
almacenamiento aislado. Los métodos para realizar estas tareas están disponibles
mediante el objeto IsolatedStorageFile. Algunas operaciones requieren disponer de
IsolatedStorageFilePermission que representa el derecho a administrar el
almacenamiento aislado.
 El espacio de nombres System.IO.IsolatedStorage contiene tipos que permiten la
creación y el uso de almacenes aislados. Con estos almacenes, se pueden leer y
escribir los datos a los que no puede tener acceso el código de menor confianza y se
puede evitar la exposición de información confidencial que puede guardarse en otro
lugar del sistema de archivos.
 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://www.developerfusion.com/article/84438/isolated-storage/

http://msdn.microsoft.com/es-es/library/93bskf9z(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile.aspx

http://www.reflectionit.nl/Blog/2003/c-inputbox

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 205

UNIDAD

6
GESTIÓN Y CONFIGURACIÓN DE APLICACIONES
.NET
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones de mejor rendimiento y
acceso asignando recursos, permisos, componentes, cultura y una adecuada
distribución de la misma para su implementación.

Temario

6.1 Tema 11: Manejo de componentes COM


6.1.1. Exponiendo un componente al .NET Framework
6.1.2. Invocando funciones DLLs no manejadas
6.1.3. Manejo de Reflection

6.2 Tema 12: Globalización


6.2.1. Manejo de globalización y cultura en una aplicación en .NET
6.2.2. Manejo de formatos utilizando la clase Culture

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para el manejo de unidades
aisladas
 Los alumnos crean clases que puedan interoperar en aplicaciones COM.
 Los alumnos crear aplicaciones que usan Reflection
 Los alumnos crean aplicaciones con etiquetas según la cultura que utiliza la PC.
 Los alumnos desarrollan los laboratorios de la semana.

CIBERTEC CARRERAS PROFESIONALES


206

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 207

6.1 MANEJO DE COMPONENTES COM


6.1.1 Exponiedo un componente al NET Framweork

Un ensamblado de interoperabilidad primario es un ensamblado único,


suministrado por el proveedor, que contiene definiciones de tipo (como
metadatos) de tipos implementados con COM. Sólo puede haber un
ensamblado de interoperabilidad primario, que debe estar firmado con un
nombre seguro por el editor de la biblioteca de tipo COM. Un único
ensamblado de interoperabilidad primario puede englobar más de una
versión de la misma biblioteca de tipos.

No puede ser un ensamblado de interoperabilidad primario una biblioteca de


tipos COM que se importa como ensamblado y está firmado por alguien que
no sea el editor de la biblioteca de tipos original. Sólo el editor de una
biblioteca de tipos puede crear un verdadero ensamblado de
interoperabilidad primario, lo que se convierte en la unidad de las
definiciones de tipo oficiales para interoperar con los tipos COM
subyacentes.

Los editores de componentes COM crean ensamblados de interoperabilidad


primario y los distribuyen a los programadores para que los utilicen en
aplicaciones de .NET Framework. Esta sección proporciona información
para los editores sobre cómo crear ensamblados de interoperabilidad
primario. Y describe a los programadores cómo programar con ensamblados
de interoperabilidad primario

6.1.2 Invocando funciones DLLs no manejadas

A partir de .NET Framework versión 4, puede usar el hospedaje en paralelo


en el mismo proceso para ejecutar varias versiones de Common Language
Runtime (CLR) en un único proceso. De forma predeterminada, los
componentes COM administrados se ejecutan con la versión de .NET
Framework con la que se compilaron, sin tener en cuenta la versión de .NET
Framework que está cargada para el proceso.

.NET Framework siempre ha proporcionado hospedaje en paralelo para


aplicaciones de código administrado, pero antes de .NET Framework 4 no
proporcionaba esa funcionalidad para componentes COM administrados. En
el pasado, los componentes COM administrados que se cargaban en un
proceso se ejecutaban con la versión del runtime que ya estaba cargada o
con la última versión instalada de .NET Framework. Si esta versión no era
compatible con el componente COM, se producía un error en el
componente.
.NET Framework 4 proporciona un nuevo enfoque al hospedaje en paralelo
que garantiza lo siguiente:
 La instalación de una nueva versión de .NET Framework no tiene ningún
efecto en las aplicaciones existentes.
 Las aplicaciones se ejecutan con la versión de .NET Framework con la
que se compilaron. No utilizan la nueva versión de .NET Framework a
menos que se indique expresamente. Sin embargo, es más fácil para las
aplicaciones realizar la transición a una nueva versión de .NET
Framework.

CIBERTEC CARRERAS PROFESIONALES


208

6.1.3 SYSTEM.REFLECTION
El espacio de nombres System.Reflection contiene clases e interfaces que
proporcionan una vista administrada de los campos, los métodos y los tipos
cargados, con la posibilidad de crear e invocar tipos dinámicamente.

Clase Assembly
Define un objeto Assembly, que es un bloque constructivo reutilizable,
versionable y autodescriptivo de una aplicación de tipo Common Language
Runtime.

Los ensamblados proporcionan la infraestructura que permite al motor en


tiempo de ejecución comprender completamente el contenido de una
aplicación y hacer cumplir las reglas del control de versiones y de
dependencia definidas por la aplicación. Estos conceptos son cruciales para
resolver el problema del control de versiones y para simplificar la
implementación de aplicaciones en tiempo de ejecución.

En la tabla siguiente se muestran las propiedades del Assembly:

Propiedad Descripción
Codebase Obtiene la ubicación del ensamblado tal y
como se especificó originalmente, por
ejemplo en un objeto AssemblyName.
EntryPoint Obtiene el punto de entrada de este
ensamblado.
Evidence Obtiene la evidencia para este ensamblado
FullName Obtiene el nombre de la presentación del
ensamblado
Location Obtiene la ruta de acceso o la ubicación
UNC del archivo cargado que contiene el
manifiesto
ManifestModule Obtiene el modulo que contiene el manifiesto
para el ensamblado actual.

En la tabla siguiente se muestran los métodos del Assembly:

Propiedad Descripción
GetName Obtiene un objeto AssemblyName para este
ensamblado.
GetCustomAttributes Obtiene los atributos personalizados para
este ensamblado.
GetFile Obtiene los archivos en la tabla de archivos
de un manifiesto de ensamblado.
GetFiles Obtiene los archivos en la tabla de archivos
de un manifiesto de ensamblado.
GetModules Obtiene todos los módulos que forman parte
de este ensamblado.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 209

LABORATORIO 11.1
INVOCANDO UNA DLL EN JAVASCRIPT
Implemente una dll en C# para ser invocado en JavaScript

1. EjecutandoVisual Studio como Administrador


Para crear un DLL en .NET, ejecutamos el Visual Studio como Administrador. Hacer
click derecho al acceso directo, selecciona la opción Ejecutar como Administrador, tal
como se muestra.

2. Creando un proyecto ClassLibrary


A continuación creamos un Nuevo Proyecto en C#, de tipo Biblioteca de clases, tal
como se muestra

Selecciona biblioteca de
clases en C#

Nombre de la Aplicación

CIBERTEC CARRERAS PROFESIONALES


210

2. Creando una GUID


Antes de iniciar el desarrollo, lo primero es crear una GUID, es decir, una clave que
nos identificará nuestra librería.

Desde la opción
HERRAMIENTAS,
seleccionar Crear GUID

Selecciona la opción 2 (DEFINE_GUID) y presionamos el botón Copiar, donde


copiamos la clase, la cual se muestra de color verde

2. presionar el
botón Copiar
(copia la clave)

1. Seleccionar
la opción 2

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 211

3. Programacion
En la clase impotar la librería System.Runtime.InteropServices, tal como se muestra. A
continuación hacemos algunas declaraciones a la clase, la cual será expuesta al
exterior.

Importar la librería

Hacer visible al
componente

Identificador de la
librería o GUID

Identificador para acceder


desde el exterior

Defina una función Bienvenida() la cual retorna un mensaje, tal como se muestra.

Funcion que retorna un


mensaje de Bienvenida

CIBERTEC CARRERAS PROFESIONALES


212

Definido el código en la clase,


selecciona las propiedades del
proyecto, tal como se muestra.

Seleccionar Propiedades
del proyecto (Librería)

Una vez dentro de las propiedades nos dirigimos a Compilar y chequeamos la opción
Registrar para interoperabilidad COM.

Chequear esta opción

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 213

Para finalizar, Generamos el proyecto


llamado Libreria, desde el explorador de
soluciones, selecciona la opción Generar,
tal como se muestra

Selecciona la opción

4. HTML y JavaScript
Con la DLL lista ahora diseñamos la “interfaz gráfica”, para visualizar el mensaje
desde una página Web. Diseña la pagina web, tal como se muestra.

CIBERTEC CARRERAS PROFESIONALES


214

Para testear la página, se guardará con extensión hta, tal como se muestra.

Guardar la pagina con


la extensión hta

Al ejecutar la pagina, presiona el botón donde se visualiza el mensaje

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 215

LABORATORIO 11.2
CREANDO UN COMPONENTE COM
Implemente un Componente COM para realizar operaciones numéricas.

1. EjecutandoVisual Studio como Administrador


Para crear un DLL en .NET, ejecutamos el Visual Studio como Administrador. Hacer
click derecho al acceso directo, selecciona la opción Ejecutar como Administrador, tal
como se muestra.

2. Creando un proyecto ClassLibrary


A continuación creamos un Nuevo Proyecto en C#, de tipo Biblioteca de clases, tal
como se muestra

Selecciona biblioteca de
clases en C#

Nombre de la Aplicación

CIBERTEC CARRERAS PROFESIONALES


216

2. Creando una GUID


Antes de iniciar el desarrollo, lo primero es crear una GUID, es decir, una clave que
nos identificará nuestra librería.

Desde la opción
HERRAMIENTAS,
seleccionar Crear GUID

Selecciona la opción 2 (DEFINE_GUID) y presionamos el botón Copiar, donde


copiamos la clase, la cual se muestra de color verde

2. presionar el
botón Copiar
(copia la clave)

1. Seleccionar
la opción 2

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 217

3. Programacion
En la clase impotar la librería System.Runtime.InteropServices, tal como se muestra. A
continuación hacemos algunas declaraciones a la clase, la cual será expuesta al
exterior.

Importar la librería

Hacer visible al
componente

Identificador de la
librería o GUID

Identificador para acceder


desde el exterior

Tipo de Interface

A continuación, defina los métodos de la clase clsNumerico

Definiendo los métodos de


la clase

CIBERTEC CARRERAS PROFESIONALES


218

Definido el código en la clase,


selecciona las propiedades del
proyecto, tal como se muestra.

Seleccionar Propiedades del


proyecto (COMNumerico)

Una vez dentro de las propiedades nos dirigimos a Compilar y chequeamos la opción
Registrar para interoperabilidad COM.

Chequear esta opción

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 219

Para finalizar, Generamos el


proyecto llamado Libreria, desde el
explorador de soluciones,
selecciona la opción Generar, tal
como se muestra
Selecciona la opción

4. Trabajando en una Aplicación Windows Forms


A continuación creamos un proyecto Aplicación de Windows Forms, tal como se
muestra

Selecciona la plantilla

Asigne el nombre del


proyecto

CIBERTEC CARRERAS PROFESIONALES


220

A continuación agregamos el
componente a la aplicación.
Selecciona desde la opción
PROYECTO, la opción Agregar
referencia, tal como se muestra

Seleccionar

Agregar la dll a la aplicación, tal como se muestra

Seleccionar

Seleccionar la DLL

Presionar para
agregar

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 221

En la ventana de código, hacer una referencia a la DLL: COMNumerico, tal como se


muestra; en la clase Form1 instanciar la clase clsNumerico

Referencia a la
DLL

Instanciar la
clase

Dibuja la GUI, tal como se muestra

TextBox: txtn1

TextBox: txtn2

TextBox:
txtResultado

CIBERTEC CARRERAS PROFESIONALES


222

Programa cada uno de los botones del Formulario, tal como se muestra

Programa cada
botón ejecutandoun
metodo del
componente

Presiona la tecla F5, ingresa los números, al presionar cada uno de los botones,
retornara un resultado

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 223

Resumen
 Un ensamblado de interoperabilidad primario es un ensamblado único, suministrado
por el proveedor, que contiene definiciones de tipo (como metadatos) de tipos
implementados con COM. Sólo puede haber un ensamblado de interoperabilidad
primario, que debe estar firmado con un nombre seguro por el editor de la biblioteca de
tipo COM. Un único ensamblado de interoperabilidad primario puede englobar más de
una versión de la misma biblioteca de tipos
 A partir de .NET Framework versión 4, puede usar el hospedaje en paralelo en el
mismo proceso para ejecutar varias versiones de Common Language Runtime
(CLR) en un único proceso. De forma predeterminada, los componentes COM
administrados se ejecutan con la versión de .NET Framework con la que se
compilaron, sin tener en cuenta la versión de .NET Framework que está cargada
para el proceso..
 El espacio de nombres System.Reflection contiene clases e interfaces que
proporcionan una vista administrada de los campos, los métodos y los tipos cargados,
con la posibilidad de crear e invocar tipos dinámicamente..

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://support.microsoft.com/kb/817248/es

 https://estebanfuentealba.wordpress.com/tag/how-to-call-c-net-dll-in-java-script/

 http://www.elguille.info/NET/revistas/dotNetmania/pdf/dotnetmania

 https://estebanfuentealba.wordpress.com/tag/registrar-para-interoperabilidad-com/

 http://blogs.msdn.com/b/dynamics_latam/archive/2010/09/27/como-crear-un-
ensamble-con-interoperabilidad-com-para-uso-con-microsoft-dexterity.aspx

CIBERTEC CARRERAS PROFESIONALES


224

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 225

UNIDAD

6
GESTIÓN Y CONFIGURACIÓN DE APLICACIONES
.NET
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones de mejor rendimiento y
acceso asignando recursos, permisos, componentes, cultura y una adecuada
distribución de la misma para su implementación.

Temario

6.1 Tema 11: Manejo de componentes COM


6.1.1. Exponiendo un componente al .NET Framework
6.1.2. Invocando funciones DLLs no manejadas
6.1.3. Manejo de Reflection

6.2 Tema 12: Globalización


6.2.1. Manejo de globalización y cultura en una aplicación en .NET
6.2.2. Manejo de formatos utilizando la clase Culture

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para el manejo de unidades
aisladas
 Los alumnos crean clases que puedan interoperar en aplicaciones COM.
 Los alumnos crear aplicaciones que usan Reflection
 Los alumnos crean aplicaciones con etiquetas según la cultura que utiliza la PC.
 Los alumnos desarrollan los laboratorios de la semana.

CIBERTEC CARRERAS PROFESIONALES


226

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 227

6.2 GLOBALIZACION
6.2.1 Manejo de globalización y cultura en una aplicación .NET

Ahora, los namespaces que envuelven la funcionalidad .NET para la creación


de globalización y localización de aplicaciones son: System.Globalization,
System.Resources, System.Text. Desarrollar aplicaciones para uso global
usando .NET Framework (internalización de aplicaciones) incluye tanto
localización como globalización:
Localización es el proceso de traducir los recursos para una cultura específica.

La clasesResourceManager (más conocido como ResourceManager) es ideal


para esta parte, mientras que, globalización es el proceso de diseñar y
desarrollar aplicaciones que se adapten a culturas diferentes, es decir, esto
incluye el uso de interfaces de usuario localizadas y datos regionales para
usuarios de varias referencias culturales. La clase CultureInfo es usada en esta
parte.

El espacio de nombres System.Globalization contiene clases que definen


información relativa a la referencia cultural, incluido el idioma, el país o región,
los calendarios utilizados, los modelos de formato para las fechas, la moneda y
los números y el criterio de ordenación de las cadenas.

Estas clases son útiles para escribir aplicaciones globalizadas


(internacionalizadas). Las clases como StringInfo y TextInfo proporcionan
funciones avanzadas de globalización, por ejemplo, compatibilidad para
suplentes y procesamiento de elementos de texto.

En la tabla siguiente se muestran las clases del nameSpace Globalization:

Clase Descripción
Calendar Representa divisiones de tiempo, como semanas,
meses y años.
CompareInfo Implementa un conjunto de métodos para la
comparación de cadenas que tienen en cuenta la
referencia cultural.
CultureInfo Representa información acerca de una referencia
cultural específica que incluye los nombres de la
referencia cultural, el sistema de escritura y el
calendario utilizado, así como el acceso a objetos
específicos de la referencia cultural que
proporcionan información para operaciones
comunes, como la aplicación de formato a fechas
y la ordenación de cadenas.
DateTimeFormatInfo Define el modo en que se aplica formato y se
muestran los valores DateTime, dependiendo de
la referencia cultural.
NumberFormatInfo Define el modo en que se aplica formato y se
muestran los valores numéricos, dependiendo de
la referencia cultural.
RegionInfo Contiene información sobre el país o la región.
StringInfo Proporciona funciones para dividir una cadena en
elementos de texto y recorrer en iteración dichos

CIBERTEC CARRERAS PROFESIONALES


228

elementos.

6.2.2 Manejo de CultureInfo, y formatos

La clase CultureInfo contiene información específica de la referencia


cultural, como el idioma, el país o región, el calendario y las convenciones
culturales asociadas a una referencia cultural específica. Esta clase también
proporciona la información necesaria para realizar operaciones específicas
de la referencia cultural, como la distinción de mayúsculas y minúsculas, el
formato de fechas y números, y la comparación de cadenas.

La clase CultureInfo contiene información específica de la referencia


cultural, como el idioma asociado, el idioma secundario, el país o región, el
calendario y las convenciones culturales. Esta clase proporciona además
acceso a instancias de DateTimeFormatInfo, NumberFormatInfo,
CompareInfo y TextInfo específicas de la referencia cultural. Estos objetos
contienen la información necesaria para las operaciones específicas de la
referencia cultural, como la distinción entre mayúsculas y minúsculas, la
aplicación de formato a fechas y números y la comparación de cadenas.

Las aplicaciones .NET Framework pueden tener acceso a funciones no


administradas en las bibliotecas de vínculos dinámicos usando el servicio
de invocación de plataforma. Sin embargo, cuando la aplicación pasa un
objeto CultureInfo a la función de Win32 GetLocaleInfo, recuerde que el
valor devuelto por la función no siempre es coherente con el valor devuelto
desde el constructor de clase RegionInfo.

6.2.3 RegionInfo

El objeto RegionInfo de .NET Framework corresponde a un país o región.


Para inicializar un objeto RegionInfo mediante un objeto CultureInfo, su
aplicación debe especificar un objeto CultureInfo que represente una
referencia cultural concreta, como ar-DZ para el árabe de Argelia. Si se
intenta inicializar un objeto RegionInfo con un objeto CultureInfo que
representa una referencia cultural neutra (por ejemplo, "ar" para árabe), se
produce una excepción. La referencia cultural neutra no especifica la
información de país o región necesaria para la asignación a un país o
región.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 229

LABORATORIO 12.1
CONSULTA DE CULTURAS
Implemente una aplicación que permita listar las culturas administradas por Windows

1. Diseño del Formulario


A continuación diseñamos el Formulario de trabajo

ListBox:
lbCulturas

2. Programación
Defina las librerías de trabajo

Importar la
librería de
Globalización

CIBERTEC CARRERAS PROFESIONALES


230

Programe el botón Cultura Actual para visualizar el nombre de la cultura actual de tu


Windows

Nombre de la
cultura actual

Programe el botón Todas las Culturas para listar todas las culturas administradas por
el .NET Framework

Recorrer las
culturas de tipo
AllCultures

Tipo de Cultura

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 231

Programe el botón Culturas Especificas donde liste las culturas especificas: país –
región

Recorrer las
culturas de tipo
AllCultures

Tipo de Cultura

Presione F5 para ejecutar la aplicación, al presionar un boton Listar las culturas de


acuerdo a su especificación.

CIBERTEC CARRERAS PROFESIONALES


232

LABORATORIO 12.2
FORMATO DE FECHA
Implemente una aplicación que permita dar formato de fecha según el tipo de cultura
seleccionada

1. Diseño del Formulario


A continuación diseñamos el Formulario de trabajo

ComboBox: cboCultura

DateTimePicker: dtFecha

2. Programación
Defina las librerías de trabajo para trabajar con la globalización.

DEFINA LA LIBRERÍA
DE GLOBALIZACIÓN

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 233

Programe en Evento Load del Formulario para listar las culturas en el ComboBox1, tal
como se muestra
Recorrer las
culturas de tipo
Específicas

Agregar el
nombre al
comboBox

Programe el botón Visualizar para dar formato de fecha corta y larga según el tipo de
cultura seleccionada

Definir el formato de
fecha de cultura
seleccionada

Visualizar el formato
de fecha corta y
larga

CIBERTEC CARRERAS PROFESIONALES


234

Presione F5 para ejecutar la aplicación

LABORATORIO 12.3
FORMATO DE CULTURA ESPECÍFICA
Implemente una aplicación que permita dar formato según el tipo de cultura
seleccionada

1. Diseño del Formulario


A continuación diseñamos el Formulario

ComboBox: cboCultura

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 235

2. Programación
Defina las librerías de trabajo para trabajar con la globalización.

DEFINA LA LIBRERÍA
DE GLOBALIZACIÓN

Programe en Evento Load del Formulario para listar las culturas en el ComboBox
cboCultura, tal como se muestra

Recorrer las
culturas de tipo
Específicas

Agregar el
nombre al
comboBox

CIBERTEC CARRERAS PROFESIONALES


236

Programe el botón Visualizar, al seleccionar una cultura, se visualiza el nombre de la


cultura, su símbolo monetario y formato de fecha corta y larga.

Instanciar la
cultura
seleccionada

Visualizar los
formatos

Presione F5 para ejecutar la aplicación

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 237

Resumen
 Ahora, los namespaces que envuelven la funcionalidad .NET para la creación de
globalización y localización de aplicaciones son: System.Globalization,
System.Resources, System.Text. Desarrollar aplicaciones para uso global usando
.NET Framework (internalización de aplicaciones) incluye tanto localización como
globalización.
 La clase CultureInfo contiene información específica de la referencia cultural, como el
idioma, el país o región, el calendario y las convenciones culturales asociadas a una
referencia cultural específica. Esta clase también proporciona la información necesaria
para realizar operaciones específicas de la referencia cultural, como la distinción de
mayúsculas y minúsculas, el formato de fechas y números, y la comparación de
cadenas.
 El objeto RegionInfo de .NET Framework corresponde a un país o región. Para
inicializar un objeto RegionInfo mediante un objeto CultureInfo, su aplicación debe
especificar un objeto CultureInfo que represente una referencia cultural concreta,
como ar-DZ para el árabe de Argelia. Si se intenta inicializar un objeto RegionInfo con
un objeto CultureInfo que representa una referencia cultural neutra (por ejemplo, "ar"
para árabe), se produce una excepción.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

http://msdn.microsoft.com/es-es/library/system.globalization.aspx

http://www.elguille.info/NET/library/System.Globalization.aspx

 http://msdn.microsoft.com/es-es/library/aax7sdch.aspx

CIBERTEC CARRERAS PROFESIONALES


238

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 239

UNIDAD

7
TRABAJANDO CON WINDOWS PRESENTATION
FOUNDATION

LOGRO DE LA UNIDAD DE APRENDIZAJE


Al término de la unidad, el alumno elabora aplicaciones Windows de mejor calidad y
funcionalidad de las interfaces de usuario en sus aplicaciones.

Temario

7.1. Tema 13: Windows Presentation Foundation


7.1.1. Introducción al WPF
7.1.2. Framework de Windows Presentation Foundation
7.1.3. XAML
7.1.4. Controles de interface de usuario

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows

CIBERTEC CARRERAS PROFESIONALES


240

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 241

7.1 WINDOWS PRESENTATION FOUNDATION


7.1.1 Introducción

Windows Presentation Foundation (WPF) es una de las novedosas tecnologías


de Microsoft. Potencia las capacidades de desarrollo de interfaces de
interacción integrando y ampliando las mejores características de las
aplicaciones Windows y de las aplicaciones web. Ofrece una amplia
infraestructura y potencialidad gráfica para desarrollar aplicaciones de atractiva
apariencia, con mayores y más funcionales facilidades de interacción que
incluyen animación, vídeo, audio, documentos, navegación, gráfica 3D. Separa,
con el lenguaje declarativo XAML y los lenguajes de programación de .NET, la
interfaz de interacción de la lógica del negocio, propiciando una arquitectura
Modelo Vista Controlador para el desarrollo de las aplicaciones.

Framework de WPF

Figura 1: Arquitectura de FrameWork WPF


Referencia: http://www.onglasses.net/wwwroot/upfiles/user/manual_wpf.pdf

Avalon ofrece un cambio fundamental en el modo en que se interactúa con la


computadora, que probablemente sea el cambio más significativo de la
Interface de Usuario desde Windows 1.0. Esto ocasiona modificaciones en la
tecnología, como la forma en que se “buferean” los gráficos internamente.
Estas características van a brindar una interacción más eficiente con sonido,
video y transparencias.

i. Document
1. WPF provee muchas características para combinar documentos, IU y
contenidos audiovisuales. Los documentos usualmente contienen un flujo
de controles e imágenes, los cuales son difíciles de proporcionar con los
controles tradicionales de Windows.
ii. UI
1. Los controles UI permiten una alta interacción con el usuario, pero no se
concentran tanto en el soporte para textos.
iii. Media

CIBERTEC CARRERAS PROFESIONALES


242

1. Enriquecen la visión de las presentaciones interactivas, como video,


audio y más.

iv. Desktop Services


1. Provee un alto rango de servicios que permiten el uso eficiente de las
aplicaciones de escritorio.

v. Administrador de ventanas
1. Maneja la mayor parte del trabajo duro de la administración de ventanas,
como maximizar, minimizar y cuadros de dialogo.

vi. Controls Interop Engine


1. Provee soporte para controles .NET, HTML y Win32.

vii. Animation and Composition


1. Provee un fuerte soporte para una alta representación de vectores
gráficos y estándares como SVG (Scalable Vector Graphics)

viii. Media Processing


1. Provee procesamiento de audio y video, como también nuevos codecs y
APIs.

Capacidades de Windows Presentation Foundation


a. Contiene varios componentes comunes de interfaz de usuario,
incluidos buttons, sliders y edit boxes.
b. Ofrece animación 2D y 3D.
c. Contiene hyperlinks para navegar entre documentos y tablas.
d. Presenta varios tipos de grillas y paneles para asistir en el
formato.
e. Contiene formatos de documento fijo y flotante, estilos y
storyboards.
f. Efectos, enlace a datos, etc.

7.1.2 Bases de WPF


Un gran porcentaje de las clases de WPF hereda de 4 clases que
son las siguientes:

a. UIElement
b. FrameworkElement
c. ContentElement
d. FrameworkContentElement

UIElement y ContentElement heredan de la clase


DependencyObjetc, a través de diferentes caminos. En términos de
herencia, UIElement también posee la clase Visual, que expone el
nivel más bajo de gráficos soportado en WPF, definiendo regiones
rectangulares independientes en la plantilla.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 243

Freezable Objects
Los objetos del tipo Freezable presentan características especiales
que ayudan a desarrollar una aplicación con mejor funcionamiento.
Los objetos del tipo Freezable incluyen brushes, pen,
transformaciones y animaciones.

El objeto Freezable es un tipo especial de objeto que tiene dos


estados posibles:
Unfrozen: cuando el objeto Freezable se comporta como cualquier
otro objeto
Frozen: cuando ya no puede ser modificado.

Un objeto Freezable provee un evento Changed para notificar


cualquier modificación del objeto.

La mayoría de los objetos del tipo Freezable de WPF pertenece al


sistema de gráficos.

Por ejemplo: creamos la apariencia de un botón cambiando el fondo


del control

Dim mybrush As New SolidColorBrush


mybrush.Color = Colors.Yellow

Dim miboton As New Button


miboton.Background = mybrush

El método Freeze permite deshabilitar la capacidad de un objeto de


actualizarse por sí mismo. Se puede usar este método para hacer
que un Brush se congele o no se modifique.

If mybrush.CanFreeze Then
mybrush.Freeze()
End If

7.1.3 XAML

XAML siglas de Extensible Application Markup Language. Es un lenguaje


declarativo basado en XML para describir gráficamente interfaces de usuario
visuales. Fue diseñado para soportar las clases y los métodos de la plataforma
de desarrollo .NET que tienen relación con la aplicación.

XAML se utiliza para crear interfaces de usuario de WPF, Silverlight, declarar


los flujos de trabajo de WF y de papel electrónico en el estándar XPS.

Todas las clases de WPF tienen constructores sin parámetros y hacer un uso
excesivo de las propiedades. Esto se hace para que sea perfectamente apto
para lenguajes XML como XAML.

CIBERTEC CARRERAS PROFESIONALES


244

Ventajas de XAML
Todo lo que puedes hacer en código de programación se puede
hacer también en XAML. XAML es sólo otra manera de crear e
inicializar objetos.

Podemos utilizar WPF sin utilizar XAML. Declare su interfaz de


usuario en XAML tiene algunas ventajas:

• Código XAML es corto y claro de leer


• Separa el código del diseñador y la lógica
• Es una herramienta de diseño gráfico como Expression Blend el
cual requiere XAML como fuente.
• La separación de la lógica de la interfaz de usuario XAML y le
permite separar claramente los roles de diseñador y
desarrollador.

Ejemplo de XAML

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pre
sentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Hola" HorizontalAlignment="Left"
Margin="87,83,0,0" VerticalAlignment="Top"
Width="176" Height="48"/>
</Grid>
</Window>

En este ejemplo se muestra para escribir la expresión “Hola” en


XAML.

Los archivos XAML son archivos XML con extensión .xaml y un


espacio de nombre referenciado a los namespaces de XML.

XAML fue diseñado para soportar las clases y los métodos de la


plataforma de desarrollo .NET que tienen relación con la interacción
con el usuario, en especial, el despliegue en pantalla. XAML significa
Extensible Avanlon Markup Language (Lenguaje de Marcas
Extensibles de Avalon), habiendo sido Avalon el nombre clave
original de la base de presentación de Windows, nombre que
engloba a este grupo de clases de .NET.

Declaraciones de Espacios de Nombre en XAML


Existen dos declaraciones:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

La primera referencia el total de los namespaces de WPF como


predeterminado
La segunda referencia a un namespace de XAML separado, que
típicamente empieza con el prefijo “x:”

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 245

XAML vs Código
A continuación vamos a construir un StackPanel con un texBlock y
un control Button en etiquetas XAML y con código en Visual Basic.

<StackPanel>
<TextBlock Margin="80" Width="100" Height="30"
FontSize="20" >Bienvenido</TextBlock>
<Button Margin="60" Content="Hola" Width="60"
Height="30"></Button>
</StackPanel>

Dim st As New StackPanel


Dim txt As New TextBlock
txt.Margin = New Thickness(120)
txt.Text = "Hola"
st.Children.Add(txt)

Dim bt As New Button


bt.Margin = New Thickness(80)
bt.Content = "Hola"
st.Children.Add(bt)

Como se puede ver el código XAML es mucho más corto y más fácil
de interpretar.

Propiedades como Elementos


Las propiedades se escriben normalmente inline como se conoce a
partir de XML <Button Content="OK" />; pero lo que si queremos
colocar un objeto más complejo como el contenido de una imagen o
tal vez un panel de cuadrícula entera, para ello podemos utilizar la
sintaxis de elementos de propiedad.
Esto nos permite extraer la propiedad como un elemento de su
propio hijo.

<Button>
<Button.Content>
<Image Source="imagenes/ok.png" Width="40"
Height="30"></Image>
</Button.Content>
</Button>

CIBERTEC CARRERAS PROFESIONALES


246

Programando en XAML
Para la creación de aplicaciones productivas será necesario trabajar con
eventos, donde proporcionamos la lógica de programación o incluir
operaciones que no tengan nada que ver con la interface de usuario.
La lógica de programación se redacta en el code-behind.

Figura 2: Forma de escribir aplicaciones


Referencia: http://www.onglasses.net/wwwroot/upfiles/user/manual_wpf.pdf

XAML es un lenguaje declarativo basado en XML, que puede ser


utilizado para programar en el modelo de objetos de Windows
Presentation Foundation. Es especialmente útil a la hora de
implementar las Interfaces de Usuario de sus aplicaciones. Cada
etiqueta, llamada también tag, de XAML corresponde a una clase de
modelo de objetos. Un tag también posee una colección de atributos
que remiten a las propiedades de la clase asociada de etiqueta.

7.1.4 Interfaces de Usuario - Controles


Un control es cualquier cosa que requiere interacción del usuario. Avalon tiene
un conjunto rico de controles, entre los cuales incluye controles muy parecidos
a los de Win32. La diferencia que encontramos entre los controles de Avalon y
los controles de una aplicación de Windows, es la apariencia y su
comportamiento el cual puede ser modificado con un código fuente.

La funcionalidad de un control en Avalon viene de dos clases:


FrameworkElement y Control. La primera clase es la base para definir una
Control. Por lo general, usa propiedades dependientes

Figura 3: Jerarquía de controles


Referencia: http://www.onglasses.net/wwwroot/upfiles/user/manual_wpf.pdf

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 247

En Windows Presentation Foundation armamos una jerarquía de objetos: por


ejemplo, dentro de la página tenemos un DockPanel; en este panel contiene
tres hijo: un StackPanel, un Label y un ComboBox. En el StackPanel contiene
a su vez dos hijos (Children): un TextBox y un Button.

La jerarquía de clases será útil ya que cada hijo puede heredar las
propiedades y estilos del padre. Por ejemplo los hijos del StackPanel tendrán
un estilo de posición distinto de los hijos que tiene el DockPanel.

Árbol Lógico y Árbol Vista


Los elementos de una interfaz de usuario de WPF se encuentran
relacionados en forma jerárquica. Esta relación se llama la LogicalTree. La
plantilla de un elemento se compone de múltiples elementos visuales. Este
árbol se llama VisualTree. WPF diferencia entre esos dos árboles, ya que
para algunos problemas sólo necesita los elementos lógicos y otros
problemas solo necesita de los elementos.

El árbol lógico describe las relaciones entre los elementos de la interfaz de


usuario. El árbol lógico es responsables de:
 Heredar valores DependencyProperty
 Resolver referencias DynamicResources
 Buscar nombres de elementos para los enlaces
 Enrutar eventos

El árbol visual contiene todos los elementos lógicos, incluyendo los elementos
visuales de la plantilla de cada elemento. El árbol visual es responsable de:
 Representar elementos visuales
 Propagar el elemento opacidad
 Propagar diseño y RenderTransforms
 Propagar la propiedad isEnabled
 No aplica Hit-Testing
 relativeSource, buscar su ancestro

Figura 4: árbol lógico y de vista


Referencia: http://www.wpftutorial.net/LogicalAndVisualTree.html

CIBERTEC CARRERAS PROFESIONALES


248

Un control de Windows Presentation Foundation consta de varios controles,


más primitivos, por ejemplo: Un botón se compone de un borde, un rectángulo
y un presentador de contenido. Estos controles son visuales de los Childen
en el botón.

Cuando Windows Presentation Foundation hace que el botón, el elemento en


sí no tiene apariencia, pero itera a través del árbol visual y hace que los
elementos secundarios sean visuales de la misma. Esta relación jerárquica
también se puede utilizar para hacer la prueba de posicionamiento, diseño,
etc.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 249

LABORATORIO 13.1
Creando una aplicación básica en WPF
Implementa una aplicación WPF donde calcule y visualice el promedio de dos notas
ingresadas en controles TextBox, visualizando una condición: Aprobado si la nota
promedio es mayor o igual a 12.5 o Desaprobado si la nota promedio es menor a 12.5

1. Inicio del Proyecto

 En la Ventana Nuevo Proyecto , seleccione la plantilla Visual Basic


 Luego, seleccione la plantilla Aplicación WPF
 A continuación, asigne un nombre al proyecto y su ubicación
 Presione el botón ACEPTAR

1. Selecciona la plantilla Visual


Basic

2. Selecciona la plantilla Aplicación


WPF

3. Asigna el nombre del proyecto

4. Asigna la ubicación del proyecto

CIBERTEC CARRERAS PROFESIONALES


250

2. Descripción del IDE de Formulario

Main Window

Controles comunes
para la aplicación WPF

Estructura XAML

3. Diseño del Formulario


Agrega controles al formulario y defina sus propiedades

Agrega un control Label al Grid

Etiqueta XAML del control


Label

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 251

Asignar propiedades al control Label a través de las etiquetas XAML, la propiedad


Content representa el titulo de control, asigne las propiedades en la ventana de
propiedades tal como se muestra

Asignar propiedades al
control Label

Agrega el resto de los controles en MainWindows y asigna las propiedades.

Asignar propiedades a los


controles Label

Asignar propiedades a las


controles TextBox

CIBERTEC CARRERAS PROFESIONALES


252

Para finalizar agrega controles Button y defina sus propiedades, tal como se muestra
en la página XAML

Asignar propiedades a los


controles Button

Al finalizar el diseño, deberá quedar de esta forma

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 253

4. Programación
A continuación vamos a programar el evento Click del botón Proceso, para ello
selecciona desde la ventana propiedades el botón Evento (forma de rayo) y se lista los
eventos del control. Hacer doble click al evento Click

Lista los eventos


del control

Selecciona el evento
Click y hacer doble
click a la caja

En la ventana de código, programa el proceso para convertir el número a binario. En


este proceso declaro variables y utilizando una estructura repetitiva convierto el
numero a binario

Mientras el número sea


mayor a 1, ejecutamos
el proceso

CIBERTEC CARRERAS PROFESIONALES


254

5. Ejecutar el Formulario
Presiona la tecla F5, donde se muestra el Formulario en tiempo de ejecución, ingresa
los datos en los controles, al presionar el botón PROCESO, obtenemos el numero en
binario.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 255

LABORATORIO 13.2
Creando una aplicación básica en WPF
Implementa una aplicación WPF donde calcule y visualice la venta de accesorios de
PC; selecciona el tipo de accesorio el cual retorna el precio, ingrese la cantidad, la
venta es el producto del precio por la cantidad.

1. Agregando un ítem Window al proyecto

Selección desde la opción PROYECTO, selecciona la opción AGREGAR VENTANA.

Selecciona la opción
Agregar Ventana

Selecciona el ítem Ventana (WPF) y asigne un nombre winVenta, tal como se muestra

Selecciona el ítem
Ventana (WPF)

Asigne un nombre al
ítem Ventana

CIBERTEC CARRERAS PROFESIONALES


256

2. Diseño de Formulario
Diseña el control ListBox, el cual va a definir por cada ListBoxItem un StackPanel que
almacene una imagen y un control TextBlock

Como se puede apreciar, primero definimos al ListBox y a continuación definimos la


etiqueta <ListBoxItem> el cual agrega un <StackPanel> de orientación Horizontal; en
dicho <StackPanel> agregamos dos controles: Image y TextBlock, tal como se
muestra.

Defina un ListBoxItem, el
cual representa el Item del
ListBox

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 257

Diseña el resto de los controles del desarrollo: defina los controles Label, textBox y el
control Proceso, tal como se muestra.

2. Programación
Programa el método de evento Click del botón Proceso, donde, declaro las variables,
ingresamos la cantidad, evalúo el Indice Seleccionado del control listBox, recuperando
el precio; a continuación calculamos y visualizamos el importe

CIBERTEC CARRERAS PROFESIONALES


258

3. Ejecutar el programa

Desde el App.xaml, cambiar el archivo StartupUri por la ventana que hemos diseñado
y programado

Asigne el nombre de la
ventana de inicio

Presiona la tecla F5, selecciona el producto, ingresa la cantidad; presiona el botón


Proceso donde se muestra el importe.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 259

LABORATORIO 13.3
Creando una aplicación en WPF
Se desea implementar una aplicación WPF que permita registrar los datos de libros,
listando la información de los libros registrados en un control ListView

1. Diseño de Formulario
Primero agrego una ventana (Window) al proyecto, tal como se muestra:

Seleccione el ítem
Ventana (WPF)

Asigne el nombre a
la Ventana

A continuación diseñamos los controles en el Window utilizando XAML, dentro de la


estructura o etiqueta <Grid>, tal como se muestra en la figura.

CIBERTEC CARRERAS PROFESIONALES


260

A continuación diseñamos el control ListView utilizando XAML, dentro de la estructura


<Grid>, defina el ListView y asigna la propiedad x:Name y en propiedad View del
control ListView, defina un Grid, el cual definiremos varias Columnas

Como puedes comprobar en cada columna (GridViewColumn) se asigna propiedades:


 Width: ancho de la columna
 Header: título de la cabecera
 DisplayMemberBinding: enlaza con el dato a mostrarse en esa columna, como
se puede observar a esta propiedad se “enlaza” con {Binding NombreCampo}

Presentación de los controles Label, TextBox, Button y ListView diseñados por las
etiquetas XAML

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 261

2. Programación
Agrega al proyecto la clase clsArticulo, y defina cada uno de los atributos y
propiedades.

Programa el botón Agregar el cual agrega un artículo al control ListView lvLibros, para
ello defina un objeto de la clase Articulo, pasar los datos y agrega el objeto a la
colección del control ListView

CIBERTEC CARRERAS PROFESIONALES


262

Programa el botón Eliminar el cual elimina un artículo al control ListView lvLibros por
su codigo, para ello buscamos el registro porsu código, si existe, quitarlo del control
ListView

3. Ejecutar el programa
Seleccione desde la propiedades del proyecto, la opción URI de inicio y presiona F5.
Ingrese la datos en los controles TextBox, al presionar el botón AGREGAR agregamos
y visualizamos el registro al control ListView

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 263

Resumen
 Windows Presentation Foundation (WPF) es una de las novedosas tecnologías de
Microsoft. Potencia las capacidades de desarrollo de interfaces de interacción
integrando y ampliando las mejores características de las aplicaciones Windows y de
las aplicaciones web.
 Un gran porcentaje de las clases de WPF hereda de 4 clases que son las siguientes:
UIElement, FrameworkElement, ContentElement, FrameworkContentElement.
UIElement y ContentElement heredan de la clase DependencyObjetc, a través de
diferentes caminos. En términos de herencia, UIElement también posee la clase Visual,
que expone el nivel más bajo de gráficos soportado en WPF, definiendo regiones
rectangulares independientes en la plantilla.
 Los objetos del tipo Freezable presentan características especiales que ayudan a
desarrollar una aplicación con mejor funcionamiento. Los objetos del tipo Freezable
incluyen brushes, pen, transformaciones y animaciones.
 XAML siglas de Extensible Application Markup Language. Es un lenguaje declarativo
basado en XML para describir gráficamente interfaces de usuario visuales. Fue
diseñado para soportar las clases y los métodos de la plataforma de desarrollo .NET.
 XAML fue diseñado para soportar las clases y los métodos de la plataforma de
desarrollo .NET que tienen relación con la interacción con el usuario, en especial,
el despliegue en pantalla. XAML significa Extensible Avanlon Markup Language
(Lenguaje de Marcas Extensibles de Avalon), habiendo sido Avalon el nombre
clave original de la base de presentación de Windows, nombre que engloba a este
grupo de clases de .NET.
 Existen dos declaraciones:
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Las propiedades se escriben normalmente inline como se conoce a partir de XML
<Button Content="OK" />; pero lo que si queremos colocar un objeto más
complejo como el contenido de una imagen o tal vez un panel de cuadrícula
entera, para ello podemos utilizar la sintaxis de elementos de propiedad.
 Para la creación de aplicaciones productivas será necesario trabajar con eventos,
donde proporcionamos la lógica de programación o incluir operaciones que no
tengan nada que ver con la interface de usuario.
 Los elementos de una interfaz de usuario de WPF se encuentran relacionados en
forma jerárquica. Esta relación se llama la LogicalTree. La plantilla de un elemento se
compone de múltiples elementos visuales. Este árbol se llama VisualTree.
 Si desea consultar m[as información acerca de WPF:

http://www.wpftutorial.net/
http://www.onglasses.net/wwwroot/upfiles/user/manual_wpf.pdf
http://www.wpftutorial.net/ListBoxItemsArrange.html
http://www.wpf-tutorial.com/panels/grid-units/
http://holowczak.com/winform_wpf_csharp/4/
http://tech.pro/tutorial/742/wpf-tutorial-using-the-listview-part-1

CIBERTEC CARRERAS PROFESIONALES


264

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 265

UNIDAD

8
OPERACIONES CONECTADAS A UN ORIGEN DE
DATOS

LOGRO DE LA UNIDAD DE APRENDIZAJE


Al término de la unidad, el alumno realiza operaciones de consulta y actualización de
datos en el entorno de una aplicación conectado a un origen de datos utilizando la
librería ADO.NET

Temario

8.1. Tema 14: Introducción a ADO.NET


8.1.1. Arquitectura del ADO.NET
8.1.2. Proveedores de datos en ADO.NET
8.1.3. Administrando una cadena de conexión a un origen de datos utilizando
ConfigurationManager o ConnectionStringBuilder.

8.2. Tema 15: Recuperación de datos


8.2.1. Consultando datos sobre un origen de datos
8.2.1.1. Manejo de la clase DataAdapter
8.2.1.2. Realizando una consulta utilizando una sentencia SQL o ejecutando un
procedimiento almacenado
8.2.1.3. Manejo de parámetros en el proceso de la consulta
8.2.1.4. Recuperando datos desde un DataReader.

8.3. Tema 16: Manipulación de datos


8.3.1. Operaciones de modificación de datos sobre un origen de datos
8.3.1.1. Manejo de la clase Command
8.3.1.2. Ejecutando operaciones de actualización de datos utilizando una sentencia
SQL o ejecutando un procedimiento almacenado
8.3.1.3. Manejo de parámetros en el proceso de actualización de datos

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para consultar datos desde un
origen de datos
 Los alumnos desarrollan aplicaciones en Windows para realizar actualizaciones
a un origen de datos.

CIBERTEC CARRERAS PROFESIONALES


266

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 267

8.1 INTRODUCCION ADO.NET 4.5


La mayoría de las aplicaciones desarrollado en Visual Basic y Visual C# giran
en torno a la recuperación y actualización de datos de un origen de datos. Para
que las aplicaciones se encuentren integradas aun determinado origen de
datos, Visual Studio .NET ha desarrollado una nueva generación de tecnología
de acceso a datos: ADO.NET.

ADO.NET es un conjunto de clases que exponen un conjunto de librerías y


servicios de acceso a datos para programadores de .NET Framework.
ADO.NET constituye una parte integral de .NET Framework y proporciona
acceso a datos relacionales, XML y de aplicaciones. ADO.NET satisface
diversas necesidades de desarrollo, como la creación de clientes de base de
datos front-end y objetos empresariales de nivel medio que utilizan
aplicaciones, herramientas, lenguajes o exploradores de Internet.

En la actualidad ADO.NET es parte del .NET Framework, esto quiere decir que
es, de alguna manera, parte del sistema operativo y no más un redistribuible de
4 ó 5 MB que se necesita alojar junto al cliente o junto al instalador de una
aplicación. Esto significa que nosotros, como desarrolladores, estaremos
enfocados más al acceco a datos y a la lógica para manipular estos datos, y no
a crear una librería para acceder a los datos.

Si nuestras aplicaciones van a tener un ciclo de vida largo, entonces debe


considerar la posibilidad de rediseñar la tecnología de acceso a datos de la
aplicación y utilizar ADO.NET en aplicaciones administradas. El uso de las
tecnologías más modernas de acceso a datos reduce el tiempo de desarrollo,
simplifica el código y proporciona un rendimiento excelente.

Independientemente de lo que haga con los datos, hay ciertos conceptos


fundamentales que debe de comprender acerca del enfoque de los datos en
ADO.NET, los cuales los trataremos en este primer capítulo del manual.

8.1.1 ARQUITECTURA DE ADO.NET

Figura 1: Arquitectura de ADO.NET


Referencia: hampprogramandoando.blogspot.com

CIBERTEC CARRERAS PROFESIONALES


268

Componentes de ADO.NET
Los dos componente principales de ADO.NET para el acceso a datos y
su manipulación son los proveedores de datos .NET Framework y
DataSet.

LINQ to SQL
LINQ to SQL admite consultas en un modelo de objetos asignado a las
estructuras de datos de una base de datos relacional sin utilizar un
modelo conceptual intermedio. Cada tabla se representa mediante una
clase distinta, acoplando de manera precisa el modelo de objetos al
esquema de la base de datos relacional. LINQ to SQL traduce
Language-integrated queries del modelo de objetos a Transact-SQL y lo
envía a la base de datos para su ejecución. Cuando la base de datos
devuelve los resultados, LINQ to SQL los vuelve a traducir a objetos.

ADO.NET Entity Framework


ADO.NET Entity Framework está diseñado para permitir que los
desarrolladores creen aplicaciones de acceso a los datos programando
en un modelo de aplicación conceptual en lugar de programar
directamente en un esquema de almacenamiento relacional. El objetivo
es reducir la cantidad de código y mantenimiento que se necesita para
las aplicaciones orientadas a datos

WCF Data Services


Describe cómo se usa Servicios de datos de WCF para implementar
servicios de datos en web o en una intranet. Los datos se estructuran
como entidades y relaciones de acuerdo a las especificaciones de Entity
Data Model. Los datos implementados en este modelo se pueden
direccionar mediante el protocolo HTTP estándar

XML Y ADO.NET
ADO.NET aprovecha la eficacia de XML para proporcionar acceso a
datos sin conexión. ADO.NET fue diseñado teniendo en cuenta las
clases de XML incluidas en .NET Framework; ambos son componentes
de una única arquitectura.

8.1.2 PROVEEDORES DE DATOS ADO.NET


Los proveedores de datos .NET Framework sirven para conectarse a
una base de datos, ejecutar comandos y recuperar resultados. Esos
resultados se procesan directamente, se colocan en un DataSet con el
fin de que el usuario pueda verlos cuando los necesite, se combinan
con datos de varios orígenes o se utilizan de forma remota entre
niveles. Los proveedores de datos .NET Framework son ligeros, de
manera que crean un nivel mínimo entre el origen de datos y el código,
con lo que aumenta el rendimiento sin sacrificar funcionalidad.

En la tabla siguiente se muestran los proveedores de datos .NET que se


incluyen en el Framework .NET

Proveedor de Datos .NET Descripción


.NET Framework Proveedor de Proporciona acceso a datos para
datos para SQL Server Microsoft SQL Server. Utiliza la

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 269

librería System.Data.SqlClient.
Proveedor de datos .NET Para orígenes de datos que se
Framework para OLE DB exponen mediante OLE DB. Utiliza
la librería System.Data.OleDb.
Proveedor de datos .NET Para orígenes de datos que se
Framework para ODBC exponen mediante ODBC. Utiliza la
librería System.Data.Odbc.
Proveedor de datos .NET Para orígenes de datos de Oracle.
Framework para Oracle El proveedor de datos .NET
Framework para Oracle es
compatible con la versión 8.1.7 y
posteriores del software de cliente
de Oracle y utiliza la librería
System.Data.OracleClient.
Proveedor EntityClient Proporciona acceso a datos para las
aplicaciones de Entity Data Model.
Utiliza la librería
System.Data.EntityClient.

Los cuatro objetos centrales que constityen un proveedor de datos de


.NET Framework son:

Objeto Descripción
Connection Establece una conexión a una fuente de datos. La
clase base para todos los objetos Connection es
DbConnection.
Command Ejecuta un comando en una fuente de datos. Expone
Parameters y puede ejecutarse en el ámbito de un
objeto Transaction desde Connection. La clase base
para todos los objetos Command es DbCommand.
DataReader Lee un flujo de datos de solo avance y solo lectura
desde una fuente de datos. La clase base para todos
los objetos DataReader es DbDataReader.
DataAdapter Llena un DataSet y realiza las actualizaciones
necesarias en una fuente de datos. La clase base
para todos los objetos DataAdapter es
DbDataAdapter.

Junto con las clases principales citadas en la tabla anterior, los


proveedores de datos .NET incluyen los siguientes objetos:

Objeto Descripción
Transaction Incluye operaciones de actualización en las
transacciones que se realizan en el origen
de datos. ADO.NET es también compatible
con las transacciones que usan clases en el
espacio de nombres System.Transactions.
CommandBuilder Un objeto auxiliar que genera
automáticamente las propiedades de
comando de un DataAdapter o que obtiene
de un procedimiento almacenado
información acerca de parámetros con la
que puede rellenar la colección Parameters
de un objeto Command.

CIBERTEC CARRERAS PROFESIONALES


270

Parameter Define los parámetros de entrada y salida


para los comandos y procedimientos
almacenados
ConnectionStringBuilder Un objeto auxiliar que proporciona un modo
sencillo de crear y administrar el contenido
de las cadenas de conexión utilizadas por
los objetos Connection.
Exception Se devuelve cuando se detecta un error en
el origen de dato
ClientPermission Se proporciona para los atributos de
seguridad de acceso del código de los
proveedores de datos

DATASET EN ADO.NET
El objeto DataSet es una representación residente en memoria de datos
que proporciona un modelo de programación relacional coherente
independientemente del origen de datos. Se puede utilizar con muchos
y distintos orígenes de datos, con datos XML o para administrar datos
locales de la aplicación.

El DataSet representa un conjunto completo de datos que incluye tablas


relacionadas y restricciones, así como relaciones entre las tablas. En la
siguiente ilustración se muestra el modelo de objetos DataSet.

Figura 2: DataSet
Referencia: edn.embarcadero.com

Figura 3: DataSet y Componenets


Referencia: www.c-sharpcorner.com

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 271

8.1.3 CONECTARSE A UN ORIGEN DE DATOS POR ADO.NET

En ADO.NET se utiliza un objeto Connection para conectar con un


determinado origen de datos mediante una cadena de conexión en la
que se proporciona la información de autenticación necesaria. El objeto
Connection utilizado depende del tipo de origen de datos.

Cada proveedor de datos .NET Framework incluye un objeto


DbConnection:
 Proveedor de datos para OLE DB incluye un objeto
OleDbConnection,
 Proveedor de datos para SQL Server incluye un objeto
SqlConnection,
 Proveedor de datos para ODBC incluye un objeto
OdbcConnection y
 Proveedor de datos para Oracle incluye un objeto
OracleConnection.

Conectar a SQL Server mediante ADO.NET


Para conectarse a Microsoft SQL Server 7.0 o posterior, utilice el objeto
SqlConnection del proveedor de datos .NET Framework para SQL
Server. El proveedor de datos .NET Framework para SQL Server
admite un formato de cadena de conexión que es similar al de OLE DB
(ADO).

En el ejemplo siguiente se muestra la forma de crear un abrir una


conexión a un origen de datos en SQL Server

SqlConnection cn=new SqlConnection(


"Data Source=(local);Initial Catalog=NorthWind;uid=sa; pwd=sql");

cn.Open();

Donde:
Data Source: Origen de datos
Initial Catalog=Nombre de la base de datos
uid = usuario
pwd = clave

Cerrar una Conexión


Debe cerrar siempre el objeto Connection cuando deje de usarlo. Esta
operación se puede realizar mediante los métodos Close o Dispose del
objeto Connection.

Las conexiones no se liberan automáticamente cuando el objeto


Connection queda fuera de ámbito o es reclamado por el
garbageCollector.

Administrando la cadena de conexión


Es común definir una cadena de conexión a un origen de datos, en
forma estática por cuanto consideramos que ésta no cambia durante las
etapas de producción; pero cuando la aplicación se encuentra en la

CIBERTEC CARRERAS PROFESIONALES


272

etapa de implementación seguramente sea necesaria su adaptación al


entorno.

Por lo general, debemos buscar un lugar que impacte lo menos posible


en el desarrollo: algunos desarrolladores tienden a crear una clase
definiendo atributos y propiedades de retorno dentro del propio código;
el problema está es que se requiere recompilar por completo el
desarrollo, además de tener que actualizar cada cliente por un simple
cambio de configuración.

Para el manejo de la conexión, utilizamos la propuesta que hace .net:


publicamos la conexión en el archivos de configuración de la aplicación:
app.config.

Entre las ventajas que este presenta se pueden encontrar:


 una lectura simple, ya que se basa en xml
 fácil acceso y modificación (se puede editar con el notepad), por
lo general este archivo se encuentra junto a la aplicación por lo
que la seguridad debería permitir la escritura en esta carpeta.

Para definir una cadena de conexión, abrir el archivo App.config, defina


la conexión utilizando la etiqueta <connectionStrings> (en plural porque
se pueden definir varias conexiones), tal como se muestra

Para recuperar la cadena de conexión:


 Importamos la librería: System.Configuration;
 Recuperamos la cadena de conexión publicada en el App.config

ConnectionStringSettings cnset =
ConfigurationManager.ConnectionStrings["cadena"];

SqlConnection cn = new SqlConnection(cnset.ConnectionString);

cn.Open();

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 273

LABORATORIO 14.1
Consulta de datos: trabajando con una conexión a un origen de
datos.
Implementa una aplicación donde ejecute una consulta, a una base de datos en SQL
Server, visualizando los registros de la tabla tb_clientes. Defina la conexión en el
mismo formulario de la aplicación.

1. Creando un proyecto Windows Form

Selecciona
aplicación para
Windows Form

Nombre del
proyecto

2. Diseño del Formulario


A continuación diseña el formulario para listar los registros de la tabla tb_clientes.

Control DataGridView:
dgClientes

CIBERTEC CARRERAS PROFESIONALES


274

3. Programación
Importar la librería para trabajar con la base de datos Negocios2015 siendo su motor
SQL Server

Referencia a la librería
SQL Server

Definir la conexión a la base de datos Negocios2015 a nivel Formulario: donde


 Data Source=origen de los datos
 Initial Catalog=Nombre de la base de datos
 uid=usuario
 pwd=clave

Definir la conexión a la base


de datos

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 275

A continuación programa el evento Load del Formulario, para listar los registros de
tb_clientes

Defina un DataAdapter donde


ejecuta la consulta de clientes

Defina un DataTable y poblar


sus datos: metodo Fill

Cargar los datos al control


dgClientes

Presiona la tecla F5 para ejecutar la aplicación, visualizando los registros de la tabla


tb_clientes

CIBERTEC CARRERAS PROFESIONALES


276

LABORATORIO 14.2
Consulta de datos: Ejecutando un procedimiento almacenado.
Implementa una aplicación donde liste los registros de tb_clientes ejecutando un
procedimiento almacenado registrado en la base de datos Negocios2015.

1. Creando el Procedimiento Almacenado en Negocios2015

Activar la base de datos

Crear un procedimiento
almacenado donde liste los
registros de clientes

2. Diseño del Formulario


A continuación diseña el formulario para ejecutar el procedimiento almacenado que
lista los registros de la tabla tb_clientes.

Control DataGridView:
dgClientes

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 277

3. Programación
Importar la librería para trabajar con la base de datos Negocios2015 siendo su motor
SQL Server

Referencia a la librería
SQL Server

Definir la conexión a la base de datos Negocios2015 a nivel Formulario: donde


 Data Source=origen de los datos
 Initial Catalog=Nombre de la base de datos
 uid=usuario
 pwd=clave

Definir la conexión a la base


de datos

CIBERTEC CARRERAS PROFESIONALES


278

A continuación programa el evento Load del Formulario, para ejecutar el procedimiento


almacenado donde lista los registros de tb_clientes

Defina un DataAdapter donde


ejecuta el procedimiento
almacenado

Defina un DataTable y poblar


sus datos: metodo Fill

Cargar los datos al control


dgClientes

Presiona la tecla F5 para ejecutar la aplicación, visualizando los registros de la tabla


tb_clientes

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 279

LABORATORIO 14.3
Consulta de datos: Publicando una cadena de conexión.
Implementa una aplicación donde ejecute liste los registros de tb_productos
ejecutando un procedimiento almacenado registrado en la base de datos
Negocios2015.

1. Creando el Procedimiento Almacenado en Negocios2015

Activar la base de datos

Crear un procedimiento
almacenado donde liste los
registros de productos

2. Diseño del Formulario


A continuación diseña el formulario para ejecutar el procedimiento almacenado que
lista los registros de la tabla tb_productos

DataGridView: dgProductos

CIBERTEC CARRERAS PROFESIONALES


280

3. Publicando la cadena de conexión


Publicar la cadena de conexión: abrir el archivo App.config.

Abrir el archivo App.config

En el App.config, defina la cadena de conexión llamado cnSQL, tal como se muestra

Defina la cadena de conexión


en el App.config

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 281

4. Programación
Definida la cadena de conexión en el App.config, agregar la librería
System.Configuration, en la ventana Administración de referencias, tal como se
muestra

Selecciona la opción
Ensamblados

Selecciona el nameSpace
System.Configuration

En el formulario importar las librerías System.Data.SqlClient y System.Configuration


(para trabajar con la publicación de la cadena de conexión)

Referencia a las
librerías

CIBERTEC CARRERAS PROFESIONALES


282

A nivel formulario defina un ConnectionStringSettings (cadena) la cual recupera la


cadena de conexión declarada en el App.config. A continuación instanciar la clase
SqlConnection, tal como se muestra

Defina una variable para recuperar


la cadena de conexión

Instanciar la clase
SqlConnection

A continuación programa el evento Load del Formulario, para ejecutar el procedimiento


almacenado donde lista los registros de tb_productos

Instanciar la conexión

DataAdapter donde
ejecuta el procedure

Defina un DataTable y poblar


sus datos: metodo Fill

Cargar los datos al control


dgClientes

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 283

Presiona la tecla F5 para ejecutar la aplicación, visualizando los registros de la tabla


tb_productos

CIBERTEC CARRERAS PROFESIONALES


284

Resumen
 Tradicionalmente, el procesamiento de datos ha dependido principalmente de un
modelo de dos niveles basado en una conexión. A medida que aumenta el uso que
hace el procesamiento de datos de arquitecturas de varios niveles, los
programadores están pasando a un enfoque sin conexión con el fin de proporcionar
una mejor escalabilidad a sus aplicaciones.
 Los dos componente principales de ADO.NET para el acceso a datos y su
manipulación son los proveedores de datos .NET Fraework y DataSet.
 Los proveedores de datos .NET Framework sirven para conectarse a una base de
datos, ejecutar comandos y recuperar resultados. Los proveedores de datos .NET
Framework son ligeros, de manera que crean un nivel mínimo entre el origen de
datos y el código, con lo que aumenta el rendimiento sin sacrificar funcionalidad.
 El proveedor de datos .NET Framework para SQL Server utiliza la librería
System.Data.SqlClient
 Los principales componentes de un proveedor de datos .NET Framework son:
o Connection
o Command
o DataReader
o DataAdapter
 El objeto DataSet es esencial para la compatibilidad con escenarios de datos
distribuidos desconectados con ADO.NET. Representa un conjunto completo de
datos que incluye tablas relacionadas y restricciones; así como relaciones entre las
tablas
 En ADO.NET se utiliza un objeto Connection para conectar con un determinado
origen de datos mediante una cadena de conexión en la que se proporciona la
información de autenticación necesaria. El objeto Connection utilizado depende del
tipo de origen de datos.
 Para conectarse a Microsoft SQL Server 7.0 o posterior, utilice el objeto
SqlConnection del proveedor de datos .NET Framework para SQL Server. El
proveedor de datos .NET Framework para SQL Server admite un formato de
cadena de conexión que es similar al de OLE DB (ADO).
 Debe cerrar siempre el objeto Connection cuando deje de usarlo. Esta operación
se puede realizar mediante los métodos Close o Dispose del objeto Connection.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://msdn.microsoft.com/es-es/library/27y4ybxw(v=vs.110).aspx
http://hampprogramandoando.blogspot.com/2013/05/ado-net-45-parte-iv-
consulta-de-datos.html
http://msdn.microsoft.com/es-es/library/ms254494(v=vs.110).aspx
 http://msdn.microsoft.com/es-es/library/27y4ybxw%28v=vs.110%29.aspx

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 285

UNIDAD

8
OPERACIONES CONECTADAS A UN ORIGEN DE
DATOS

LOGRO DE LA UNIDAD DE APRENDIZAJE


Al término de la unidad, el alumno realiza operaciones de consulta y actualización de
datos en el entorno de una aplicación conectado a un origen de datos utilizando la
librería ADO.NET

Temario

8.1. Tema 14: Introducción a ADO.NET


8.1.1. Arquitectura del ADO.NET
8.1.2. Proveedores de datos en ADO.NET
8.1.3. Administrando una cadena de conexión a un origen de datos utilizando
ConfigurationManager o ConnectionStringBuilder.

8.2. Tema 15: Recuperación de datos


8.2.1. Consultando datos sobre un origen de datos
8.2.1.1. Manejo de la clase DataAdapter
8.2.1.2. Realizando una consulta utilizando una sentencia SQL o ejecutando un
procedimiento almacenado
8.2.1.3. Manejo de parámetros en el proceso de la consulta
8.2.1.4. Recuperando datos desde un DataReader.

8.3. Tema 16: Manipulación de datos


8.3.1. Operaciones de modificación de datos sobre un origen de datos
8.3.1.1. Manejo de la clase Command
8.3.1.2. Ejecutando operaciones de actualización de datos utilizando una sentencia
SQL o ejecutando un procedimiento almacenado
8.3.1.3. Manejo de parámetros en el proceso de actualización de datos

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para consultar datos desde un
origen de datos
 Los alumnos desarrollan aplicaciones en Windows para realizar actualizaciones
a un origen de datos.

CIBERTEC CARRERAS PROFESIONALES


286

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 287

8.2 RECUPERACIÓN DE DATOS EN ADO.NET


La función principal de una aplicación que trabaje con un origen de datos es
conectarse a dicha fuente de datos para realizar operaciones de consulta y
actualización de los datos que se almacenan.

Los proveedores de .NET Framework para ADO.NET son utilizados por las
aplicaciones para trabajar con un determinado origen de datos, permitiendo
ejecutar instrucciones SQL para recuperar datos mediante el DataAdapter o el
DataReader.

Figura 1: DataAdapter y DataReader


https://www.progress.com/products/datadirect-connect

Una de las operaciones claves para cualquier aplicación que accede a una
base de datos es la capacidad de actualizar los datos almacenados en la
misma. En ADO.NET, los datos almacenados desde el origen de datos
recuperan y actualizan mediante los objetos DataAdapter, DataSet y Command
y también mediante transacciones.

Figura 2: Data Provider


https://www.go4expert.com/articles/adonet-aspnet-t30175/

CIBERTEC CARRERAS PROFESIONALES


288

8.2.1. CONSULTANDO DATOS SOBRE UN ORIGEN DE DATOS

8.2.1.1 MANEJO DE LA CLASE DATAADAPTER

La clase DataAdapter se encarga de las operaciones entre la capa de


datos y la capa intermedia donde los datos son transferidos. Se puede
decir que sirve como puesnte entre un objeto DataSet y un origen de
datos asociados para recuperar y guardar datos.

Básicamente, permite rellenar (Fill) el objeto DataSet para que sus


datos coincidan con los del origen de datos y permite actualizar
(Update) el origen de datos para que sus datos coincidan con los del
DataSet.

Figura 3: Diagrama del objeto DataAdapter


Referencia: http://www.ehu.es/mrodriguez/archivos/csharppdf/ADONET/ADONET.pdf

Los constructores de la clase son:


 DataAdapter (Command selectCommand). Utiliza un comando de
selección como parámetro.
 DataAdapter (string selectText, string selectConnectionString). Se
utiliza una sentencia SQL de selección y una cadena de conexión
como parámetros
 DataAdapter (string selectText, Connection selectConnection). Se
utiliza los parámetros sentencia SQL de selección y un objeto de
tipo conexión.

En la interface IDataAdapter se declaran los siguientes métodos (toda


clase que implemente esta interface está obligata a implementarlos)
 Fill (DataSet). Rellena un objeto de la clase DataSet
 FillSchema (Dataset, Tipo de schema). Rellena un esquema con un
DataSet indicando el tipo de esquema a rellenar
 Update (DataSet). Actualiza el DataSet correspondiente
 GetFillParameters(). Recoge el conjunto de parámetros cuando se
ejecuta una consulta de selección.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 289

Cada proveedor de datos de .NET FrameWork cuenta con un objeto


DataAdapter:

Proveedor Descripcion
OledbDataAdapter Proveedor de datos para OLEDB
SqlDataAdapter Proveedor de datos para SQL Server
OdbcDataAdapter Proveedor de datos para ODBC
OracleDataAdapter Proveedor de datos para Oracle

8.2.1.2 Realizando una consulta

El uso de DataAdapter permite recuperar la totalidad de los registros de


una tabla.
Para mejorar el rendimiento, puede usar la cláusula WHERE para
reducir en gran medida el número de filas que se devuelven al cliente.
También puede reducir la cantidad de datos que se devuelven al cliente
si enumera de forma explícita las columnas necesarias en la instrucción
SELECT.

El método Fill de DataAdapter se usa para rellenar un objeto DataSet


con los resultados del elemento SelectCommand de DataAdapter. Este
método toma como argumentos un elemento DataSet que se debe
rellenar y un objeto DataTable o el nombre del objeto DataTable que se
debe rellenar con las filas que devuelve SelectCommand.

8.2.1.3 Manejo de parámetros en el proceso de consulta

Las instrucciones de consulta con parámetros definen qué parámetros


de entrada y de salida se deben crear.
Para crear un parámetro, se utiliza el método Parameters.Add o el
constructor Parameter con el fin de especificar el nombre de columna,
tipo de datos y tamaño.En el caso de tipos de datos intrínsecos, como
Integer, no es necesario incluir el tamaño, aunque se puede especificar
el tamaño predeterminado.

8.2.1.4 TRABAJANDO CON DATAREADER

La recuperación de datos mediante DataReader implica crear una


instancia del objeto Command y de un DataReader a continuación, para
lo cual se llama a Command.ExecuteReader a fin de recuperar filas de
un origen de datos.

Figura 4: Diagrama del objeto DataReader


Referencia: http://www.dotnetero.com/2006/08/adonet-para-novatos.html

CIBERTEC CARRERAS PROFESIONALES


290

Puede utilizar el método Read del objeto DataReader para obtener una
fila a partir de los resultados de una consulta.Para tener acceso a cada
columna de la fila devuelta, puede pasar a DataReader el nombre o
referencia numérica de la columna en cuestión.Sin embargo, el mejor
rendimiento se logra con los métodos que ofrece DataReader y que
permiten tener acceso a los valores de las columnas en sus tipos de
datos nativos (GetDateTime, GetDouble, GetGuid, GetInt32, etc.).

Para obtener una lista de métodos de descriptor de acceso con tipo


para DataReaders de proveedores de datos:

Proveedor Descripcion
OledbDataReader Proveedor de datos para OLEDB
SqlDataReader Proveedor de datos para SQL Server
OdbcDataReader Proveedor de datos para ODBC
OracleDataReader Proveedor de datos para Oracle

Cerrar el DataReader
Siempre debe llamar al método Close cuando haya terminado de utilizar
el objeto DataReader.

Si Command contiene parámetros de salida o valores devueltos, éstos


no estarán disponibles hasta que se cierre el DataReader.

Tenga en cuenta que mientras está abierto un DataReader, ese


DataReader utiliza de forma exclusiva el objeto Connection. No se
podrá ejecutar ningún comando para el objeto Connection hasta que se
cierre el DataReader original, incluida la creación de otro DataReader.

Recuperar varios conjuntos de resultados con NextResult


En el caso en que se devuelvan varios resultados, el DataReader
proporciona el método NextResult para recorrer los conjuntos de
resultados en orden.

Obtener información del esquema a partir del DataReader


Mientras hay abierto un DataReader, puede utilizar el método
GetSchemaTable para recuperar información del esquema acerca del
conjunto actual de resultados. GetSchemaTable devuelve un objeto
DataTable rellenado con filas y columnas que contienen la información
del esquema del conjunto actual de resultados.

DataTable contiene una fila por cada una de las columnas del conjunto
de resultados. Cada columna de una fila de la tabla de esquema está
asociada a una propiedad de la columna que se devuelve en el conjunto
de resultados. ColumnName es el nombre de la propiedad y el valor de
la columna es el de la propiedad. En el ejemplo de código siguiente se
muestra la información del esquema de DataReader.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 291

LABORATORIO 15.1
Consulta de datos parametrizada
Implementa una aplicación donde liste los registros de la tabla tb_clientes filtrando los
registros por las iniciales de su campo NombreCia, crear un procedimiento
almacenado para este proceso.

Creando un proyecto Windows Form

Selecciona
aplicación para
Windows Form

Nombre del
proyecto

Publicando la cadena de conexión


Publicar la cadena de conexión: abrir el archivo App.config.

Abrir el archivo App.config

CIBERTEC CARRERAS PROFESIONALES


292

En el App.config, defina la cadena de conexión llamado cnSQL, tal como se muestra

Defina la cadena de conexión


en el App.config

Agregar Referencia
Definida la cadena de conexión en el App.config, agregar la librería
System.Configuration, en la ventana Administración de referencias, tal como se
muestra.

Selecciona la opción
Ensamblados

Selecciona el nameSpace
System.Configuration

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 293

1. Creando el procedimiento almacenado

A continuación creamos el procedimiento almacenado de la consulta: listar los


registros de tb_clientes filtrando por las iniciales de su nombre

Creacion del
procedimiento
almacenado

Definir el
parámetro de la
consulta

2. Diseño del Formulario


A continuación diseña el formulario para ejecutar el procedimiento almacenado que
lista los registros de la tabla tb_clientes

TextBox: txtNombre

DataGridView: dgClientes

CIBERTEC CARRERAS PROFESIONALES


294

En el formulario importar las librerías System.Data.SqlClient y System.Configuration. A


nivel formulario defina un ConnectionStringSettings (cadena) la cual recupera la
cadena de conexión declarada en el App.config. A continuación instanciar la clase
SqlConnection, tal como se muestra

Referencia a las
librerías

Defina una variable para recuperar


la cadena de conexión

Instanciar la clase
SqlConnection

En el constructor del Formulario, instanciar la conexión utilizando la cadena de


conexión

Instanciar cn, utilizando la


cadena de conexión publica

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 295

A continuación programa el evento del boton CONSULTA, donde instancia la clase


SqlDataAdapter con el nombre del procedimiento almacenado, defina el parámetro de
la consulta (Parameters.Add, finalmente defina un DataTable para poblar y visualizar
los resultados.

DataAdapter donde
ejecuta el procedure

Defina su parámetro

Defina el DataTable,
poblar y visualizar los
datos en el dgClientes

Presione la tecla F5, ingrese las iniciales del nombre en el TextBox, al presionar el
boton Consulta visualice los clientes por las iniciales del nombre ingresado

CIBERTEC CARRERAS PROFESIONALES


296

LABORATORIO 15.2
Consulta de datos parametrizada
Implementa una aplicación donde liste los registros de la tabla tb_pedidoscabe entre
un rango de dos fechas de su campo FechaPedido, crear un procedimiento
almacenado para ejecutar la consulta.

1. Creando el procedimiento almacenado


A continuación creamos el procedimiento almacenado de la consulta: listar los
registros de tb_pedidoscabe filtrando entre un rango de dos fechas.

Creacion del
procedimiento
almacenado

Definir el
parámetro de la
consulta

2. Diseño del Formulario


A continuación diseña el formulario

DateTimePicker: dtInicio

DateTimePicker: dtTermino

DataGridView: dgPedidos

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 297

En el formulario importar las librerías System.Data.SqlClient y System.Configuration. A


nivel formulario defina un ConnectionStringSettings (cadena) la cual recupera la
cadena de conexión declarada en el App.config. A continuación instanciar la clase
SqlConnection, tal como se muestra

Referencia a las
librerías

Defina una variable para recuperar


la cadena de conexión

Instanciar la clase
SqlConnection

En el constructor del Formulario, instanciar la conexión utilizando la cadena de


conexión

Instanciar cn, utilizando la


cadena de conexión publica

CIBERTEC CARRERAS PROFESIONALES


298

A continuación programa el evento del boton CONSULTA, donde instancia la clase


SqlDataAdapter con el nombre del procedimiento almacenado, defina el parámetro de
la consulta (Parameters.Add, finalmente defina un DataTable para poblar y visualizar
los resultados.

DataAdapter donde
ejecuta el procedure

Defina sus
parámetros

Defina el DataTable,
poblar y visualizar los
datos en dgPedidos

Presione la tecla F5, selecciona las fechas desde los controles dateTimePicker, al
presionar el boton Consulta visualice los pedidos entre el rango de las fechas

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 299

LABORATORIO 15.3
Consulta de datos parametrizada
Implementa una aplicación donde liste los registros de la tabla tb_pedidoscabe por un
cliente seleccionado, crear un procedimiento almacenado para ejecutar la consulta.

1. Creando el procedimiento almacenado


A continuación creamos los procedimientos almacenados: listado de clientes y listado
de los registros de tb_pedidoscabe filtrando por un cliente específico

2. Diseño del Formulario


A continuación diseña el formulario

ComboBox: cboCliente

DataGridView: dgPedidos

CIBERTEC CARRERAS PROFESIONALES


300

En el formulario importar las librerías System.Data.SqlClient y System.Configuration. A


nivel formulario defina un ConnectionStringSettings (cadena) la cual recupera la
cadena de conexión declarada en el App.config. A continuación instanciar la clase
SqlConnection, tal como se muestra

Referencia a las
librerías

Defina una variable para recuperar


la cadena de conexión

Instanciar la clase
SqlConnection

En el constructor del Formulario, instanciar la conexión utilizando la cadena de


conexión

Instanciar cn, utilizando la


cadena de conexión publica

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 301

Programa el evento Load del formulario, donde ejecuta el procedimiento almacenado


de clientes, visualizando los registros en el control comboBox

DataAdapter donde
ejecuta el procedure

Defina el DataTable,
poblar y visualizar los
datos en cboCliente

A continuación programa el evento del boton CONSULTA, instancia SqlDataAdapter


con el nombre del procedimiento almacenado, defina el parámetro de la consulta,
finalmente defina un DataTable para poblar y visualizar los resultados.

DataAdapter donde
ejecuta el procedure

Defina sus
parámetros

Defina el DataTable,
poblar y visualizar los
datos en dgPedidos

CIBERTEC CARRERAS PROFESIONALES


302

Presione la tecla F5, selecciona un cliente, al presionar el boton Consulta, listamos los
pedidos del cliente seleccionado

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 303

LABORATORIO 15.4 PROPUESTO


Consulta de datos parametrizada
Implementa una aplicación donde liste los registros de la tabla tb_pedidoscabe por un
año ingresado desde un control TextBox

Control Button:
btnConsulta

Control TextBox:
txtaño

LABORATORIO 15.5 PROPUESTO


Consulta de datos parametrizada
Implementa una aplicación donde liste los registros de la tabla tb_pedidoscabe por un
Mes y Año seleccionado desde controles comboBox

Control Button:
btnConsulta

Control ComboBox:
cboMes

Control ComboBox:
cboAño

CIBERTEC CARRERAS PROFESIONALES


304

Resumen
 La función principal de cualquier aplicación que trabaje con una fuente de datos es
conectarse a dicha fuente de datos y recuperar los datos que se almacenan.
 La clase DataAdapter se encarga de las operaciones entre la capa de datos y la
capa intermedia donde los datos son transferidos. Se puede decir que sirve como
puesnte entre un objeto DataSet y un origen de datos asociados para recuperar y
guardar datos.
 Básicamente, permite rellenar (Fill) el objeto DataSet para que sus datos coincidan
con los del origen de datos y permite actualizar (Update) el origen de datos para
que sus datos coincidan con los del DataSet.
 La recuperación de datos mediante DataReader implica crear una instancia del
objeto Command y de un DataReader a continuación, para lo cual se llama a
Command.ExecuteReader a fin de recuperar filas de un origen de datos.
 Puede utilizar el método Read del objeto DataReader para obtener una fila a partir
de los resultados de una consulta.Para tener acceso a cada columna de la fila
devuelta, puede pasar a DataReader el nombre o referencia numérica de la
columna en cuestión.Sin embargo, el mejor rendimiento se logra con los métodos
que ofrece DataReader y que permiten tener acceso a los valores de las columnas
en sus tipos de datos nativos (GetDateTime, GetDouble, GetGuid, GetInt32, etc.).
 Siempre debe llamar al método Close cuando haya terminado de utilizar el objeto
DataReader. Si Command contiene parámetros de salida o valores devueltos,
éstos no estarán disponibles hasta que se cierre el DataReader.
 En el caso en que se devuelvan varios resultados, el DataReader proporciona el
método NextResult para recorrer los conjuntos de resultados en orden

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://msdn.microsoft.com/es-es/library/bh8kx08z(v=vs.110).aspx
 http://msdn.microsoft.com/es-es/library/ms254931(v=vs.110).aspx
 http://msdn.microsoft.com/es-es/library/bbw6zyha(v=vs.110).aspx
 http://msdn.microsoft.com/es-es/library/ex6y04yf(v=vs.110).aspx

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 305

UNIDAD

8
OPERACIONES CONECTADAS A UN ORIGEN DE
DATOS

LOGRO DE LA UNIDAD DE APRENDIZAJE


Al término de la unidad, el alumno realiza operaciones de consulta y actualización de
datos en el entorno de una aplicación conectado a un origen de datos utilizando la
librería ADO.NET

Temario

8.1. Tema 14: Introducción a ADO.NET


8.1.1. Arquitectura del ADO.NET
8.1.2. Proveedores de datos en ADO.NET
8.1.3. Administrando una cadena de conexión a un origen de datos utilizando
ConfigurationManager o ConnectionStringBuilder.

8.2. Tema 15: Recuperación de datos


8.2.1. Consultando datos sobre un origen de datos
8.2.1.1. Manejo de la clase DataAdapter
8.2.1.2. Realizando una consulta utilizando una sentencia SQL o ejecutando un
procedimiento almacenado
8.2.1.3. Manejo de parámetros en el proceso de la consulta
8.2.1.4. Recuperando datos desde un DataReader.

8.3. Tema 16: Manipulación de datos


8.3.1. Operaciones de modificación de datos sobre un origen de datos
8.3.1.1. Manejo de la clase Command
8.3.1.2. Ejecutando operaciones de actualización de datos utilizando una
sentencia SQL o ejecutando un procedimiento almacenado
8.3.1.3. Manejo de parámetros en el proceso de actualización de datos

ACTIVIDADES PROPUESTAS
 Los alumnos desarrollan aplicaciones en Windows para consultar datos desde un
origen de datos
 Los alumnos desarrollan aplicaciones en Windows para realizar actualizaciones
a un origen de datos.

CIBERTEC CARRERAS PROFESIONALES


306

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 307

8.3 MANIPULACION DE DATOS: EL OBJETO COMMAND


8.3.1 OPERACIONES DE MODIFICACION SOBRE UN ORIGEN DE
DATOS
Las instrucciones que permite modificar o actualizar datos en un origen de
datos son: INSERT, UPDATE o DELETE. Estas instrucciones al ejecutarse
no devuelven ninguna fila.

De la misma forma, muchos procedimientos almacenados realizan alguna


acción de actualización no devuelven filas. Para ejecutar comandos que no
devuelvan filas, cree un objeto Command con el comando SQL adecuado y
una Connection, incluidos los Parameters necesarios. El comando se debe
ejecutar con el método ExecuteNonQuery del objeto Command.

El método ExecuteNonQuery devuelve un entero que representa el


número de filas que se ven afectadas por la instrucción o por el
procedimiento almacenado que se haya ejecutado. Si se ejecutan varias
instrucciones, el valor devuelto es la suma de los registros afectados por
todas las instrucciones ejecutadas.

8.3.1.1 MANEJO DEL OBJETO COMMAND

Una vez establecida una conexión a un origen de datos, puede ejecutar


comandos y devolver resultados desde el mismo mediante un objeto
DbCommand.

Figura 1: Diagrama del objeto Command


Referencia: http://www.dotnetero.com/2006/08/adonet-para-novatos.html

Para crear un comando, puede utilizar uno de los constructores de


comando del proveedor de datos .NET Framework con el que esté
trabajando. Los constructores pueden aceptar argumentos opcionales,
como una instrucción SQL para ejecutar en el origen de datos, un objeto
DbConnection o un objeto DbTransaction. También puede configurar
dichos objetos como propiedades del comando. También puede crear un
comando para una determinada conexión mediante el método
CreateCommand de un objeto DbConnection. La instrucción SQL que
ejecuta el comando se puede configurar mediante la propiedad
CommandText.

CIBERTEC CARRERAS PROFESIONALES


308

Cada proveedor de datos de .NET FrameWork cuenta con un objeto


Command:

Proveedor Descripcion
OledbCommand Proveedor de datos para OLEDB
SqlCommand Proveedor de datos para SQL Server
OdbcCommand Proveedor de datos para ODBC
OracleCommand Proveedor de datos para Oracle

8.3.1.2 EJECUTANDO OPERACIONES DE ACTUALIZACION

Cada proveedor de datos .NET Framework incluido en .NET Framework


dispone de su propio objeto command que hereda de DbCommand.

El proveedor de datos .NET Framework para OLE DB incluye un objeto


OleDbCommand, el proveedor de datos .NET Framework para SQL Server
incluye un objeto SqlCommand, el proveedor de datos .NET Framework
para ODBC incluye un objeto OdbcCommand y el proveedor de datos
.NET Framework para Oracle incluye un objeto OracleCommand.

Cada uno de estos objetos expone métodos para ejecutar comandos que
se basan en el tipo de comando y el valor devuelto deseado, tal como se
describe en la tabla siguiente:

Commando Valor de retorno


ExecuteReader Devuelve un objeto DataReader.
ExecuteScalar Devuelve un solo valor escalar.
ExecuteNonQuery Ejecuta un comando que no devuelve ninguna fila.
ExecuteXMLReader Devuelve un valor XmlReader. Solo está
disponible para un objeto SqlCommand.

Cada objeto command fuertemente tipado admite también una


enumeración CommandType que especifica cómo se interpreta una
cadena de comando, tal como se describe en la tabla siguiente

Commando Valor de retorno


Text Comando de SQL que define las instrucciones que
se van a ejecutar en el origen de dato
StoredProcedure Nombre del procedimiento almacenado. Puede usar
la propiedad Parameters de un comando para
tener acceso a los parámetros de entrada y de
salida y a los valores devueltos,
independientemente del método Execute al que se
llame. Al usar ExecuteReader, no es posible el
acceso a los valores devueltos y los parámetros de
salida hasta que se cierra DataReader
TableDirect Nombre de una tabla.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 309

EJECUCIÓN DE UNA CONSULTA QUE RETORNE UN CONJUNTO DE


RESULTADOS

El objeto Command de ADO.NET tiene un método ExecuteReader que


permite ejecutar una consulta que retorna uno o más conjunto de
resultados.

Al ejecutar el método ExecuteReader, podemos pasar un parámetro al


método el cual representa la enumeración CommandBehavior, que
permite controlar al Command como se ejecutado. A continuación
mostramos la descripción de los enumerables del CommandBehavior:

Valor Descripción
CommandBehavior.CloseConnection Se utiliza para cerrar la conexión
en forma automática, tan pronto
como el dataReader es cerrado.
CommandBehavior.SingleResult Retorna un único conjunto de
resultados
CommandBehavior.SingleRow Retorna una fila

EJECUCION DE PROCEDIMIENTO ALMACENADO

Los procedimientos almacenados ofrecen numerosas ventajas en el caso


de aplicaciones que procesan datos. Mediante el uso de procedimientos
almacenados, las operaciones de bases de datos se pueden encapsular en
un solo comando, optimizar para lograr el mejor rendimiento, y mejorar con
seguridad adicional.

Aunque es cierto que para llamar a un procedimiento almacenado basta


con pasar en forma de instrucción SQL su nombre seguido de los
argumentos de parámetros, el uso de la colección Parameters del objeto
DbCommand de ADO.NET permite definir más explícitamente los
parámetros del procedimiento almacenado, y tener acceso a los parámetros
de salida y a los valores devueltos.

Figura 2: Diagrama del objeto SqlCommand


Referencia: http://yinyangit.wordpress.com/2011/08/05/ado-net-tutorial-lesson-06-
adding-parameters-to-sqlcommands/

CIBERTEC CARRERAS PROFESIONALES


310

8.3.1.3 MANEJO DE PARAMETROS EN ACTUALIZACION DE


DATOS

Cuando se usan parámetros con SqlCommand para ejecutar un


procedimiento almacenado de SQL Server, los nombres de los parámetros
agregados a la colección Parameters deben coincidir con los nombres de
los marcadores de parámetro del procedimiento almacenado.

El proveedor de datos de .NET Framework para SQL Server no admite el


uso del marcador de posición de signo de interrogación de cierre (?) para
pasar parámetros a una instrucción SQL o a un procedimiento almacenado.
Este proveedor trata los parámetros del procedimiento almacenado como
parámetros con nombre y busca marcadores de parámetros coincidentes.

Para crear un objeto DbParameter, se puede usar su constructor o bien se


puede agregar a DbParameterCollection mediante una llamada al método
Add de la colección DbParameterCollection.

El método Add acepta como entrada argumentos del constructor o cualquier


objeto de parámetro ya existente, en función del proveedor de datos.

En el caso de los parámetros que no sean de entrada (INPUT), debe de


asignarse la propiedad ParameterDirection y especifique cual es el tipo de
dirección del parámetro: InputOutput, Output o ReturnValue

El tipo de datos de un parámetro es específico del proveedor de datos de


.NET Framework. Al especificar el tipo, el valor de Parameter se convierte
en el tipo del proveedor de datos de .NET Framework antes de pasar el
valor al origen de datos. Si lo desea, puede especificar el tipo de un objeto
Parameter de forma genérica estableciendo la propiedad DbType del objeto
Parameter en un DbType determinado.

Las instrucciones SQL que modifican datos (por ejemplo INSERT, UPDATE
o DELETE) no devuelven ninguna fila. De la misma forma, muchos
procedimientos almacenados realizan alguna acción pero no devuelven
filas. Para ejecutar comandos que no devuelvan filas, cree un objeto
Command con el comando SQL adecuado y una Connection, incluidos los
Parameters necesarios. El comando se debe ejecutar con el método
ExecuteNonQuery del objeto Command.

El método ExecuteNonQuery devuelve un entero que representa el


número de filas que se ven afectadas por la instrucción o por el
procedimiento almacenado que se haya ejecutado. Si se ejecutan varias
instrucciones, el valor devuelto es la suma de los registros afectados por
todas las instrucciones ejecutadas.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 311

LABORATORIO 16.1
Actualizacion de datos
Implementa una aplicación donde permita insertar y actualizar registros a la tabla
tb_paises, crear procedimientos almacenados para este proceso.

Creando un proyecto Windows Form

Selecciona
aplicación para
Windows Form

Nombre del
proyecto

Publicando la cadena de conexión


Publicar la cadena de conexión: abrir el archivo App.config.

Abrir el archivo App.config

CIBERTEC CARRERAS PROFESIONALES


312

En el App.config, defina la cadena de conexión llamado cnSQL, tal como se muestra

Defina la cadena de conexión


en el App.config

Agregar Referencia
Definida la cadena de conexión en el App.config, agregar la librería
System.Configuration, en la ventana Administración de referencias, tal como se
muestra.

Selecciona la opción
Ensamblados

Selecciona el nameSpace
System.Configuration

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 313

1. Creando el procedimiento almacenado

Procedimiento almacenado
donde liste los paises

Procedimiento almacenado
donde agregue un registro a la
tabla tb_paises

Procedimiento almacenado
donde actualice el registro de
un país por su código

2. Diseño del Formulario


A continuación diseña el formulario, tal como se muestra

TextBox: txtIdpais

TextBox: txtNombre

DataGridView: dgPaises

CIBERTEC CARRERAS PROFESIONALES


314

3. Programación
A continuación importamos las librerías del proceso

Importar las librerías


del proceso

A nivel formulario defina un ConnectionStringSettings (cadena) la cual recupera la


cadena de conexión declarada en el App.config. A continuación instanciar la clase
SqlConnection. En el constructor del Formulario, instanciar la conexión utilizando la
cadena de conexión

Defina una variable para recuperar


la cadena de conexión

Instanciar SqlConnection

Instanciar cn, utilizando la


cadena de conexión publica

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 315

Defina un metodo llamado Listado(), el cual retorna los registros de tb_paises

Metodo Listado() retorna los


registros de tb_paises

Programa el evento Load del formulario, donde cargar los datos al control
DataGridView, tal como se muestra.

Al cargar el Formulario (Load)


cargamos los registros al control
DataGrdView

CIBERTEC CARRERAS PROFESIONALES


316

Programe el evento Click del boton Agregar, donde ejecuta el procedimiento


almacenado usp_paises_agregar en el objeto SqlCommand cmd. Agregas sus
parámetros y ejecutas el comando

Instanciar el SqlCommand con


el nombre del procedure

Defina sus
parámetros

Antes de ejecutar,
abrir conexión

Ejecutar con
ExecuteNonQuery

En caso de error visualizar


el mensaje de error

Al finalizar, cerrar la
conexión y listar

Presiona la tecla F5 para ejecutar el Formulario, ingrese los datos en los controles, al
presionar el boton Agregar, ejecuta el proceso donde inserta el registro, visualizando el
resultado en una caja de mensaje, tal como se muestra

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 317

Programe el evento Click del boton Actualizar, donde ejecuta el procedimiento


almacenado usp_paises_actualizar en el objeto SqlCommand cmd. Agregas sus
parámetros y ejecutas el comando

Instanciar el SqlCommand con


el nombre del procedure

Defina sus
parámetros

Antes de ejecutar,
abrir conexión

Ejecutar con
ExecuteNonQuery

En caso de error visualizar


el mensaje de error

Al finalizar, cerrar la
conexión y listar

Presiona la tecla F5 para ejecutar el Formulario, ingrese los datos en los controles, al
presionar el boton Actualizar, ejecuta el proceso donde actualiza el registro por su
idpais, visualizando el resultado en una caja de mensaje, tal como se muestra

CIBERTEC CARRERAS PROFESIONALES


318

LABORATORIO 16.2
Actualizacion de datos - Propuesto
Se desea implementar un Formulario donde realice el mantenimiento a la tabla
tb_clientes: agregar, actualizar y eliminar registros. Utilice procedimientos
almacenados para ejecutar estos procesos

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 319

Resumen
 Para crear un comando, puede utilizar uno de los constructores de comando del
proveedor de datos .NET Framework con el que esté trabajando. Los constructores
pueden aceptar argumentos opcionales, como una instrucción SQL para ejecutar
en el origen de datos, un objeto DbConnection o un objeto DbTransaction.
 El proveedor de datos .NET Framework para OLE DB incluye un objeto
OleDbCommand, el proveedor de datos .NET Framework para SQL Server incluye un
objeto SqlCommand, el proveedor de datos .NET Framework para ODBC incluye un
objeto OdbcCommand y el proveedor de datos .NET Framework para Oracle incluye
un objeto OracleCommand.
 El objeto Command de ADO.NET tiene un método ExecuteReader que permite
ejecutar una consulta que retorna uno o más conjunto de resultados. Al ejecutar el
método ExecuteReader, podemos pasar un parámetro al método el cual representa la
enumeración CommandBehavior, que permite controlar al Command como se
ejecutado.
 Los procedimientos almacenados ofrecen numerosas ventajas en el caso de
aplicaciones que procesan datos. Mediante el uso de procedimientos almacenados, las
operaciones de bases de datos se pueden encapsular en un solo comando, optimizar
para lograr el mejor rendimiento, y mejorar con seguridad adicional.
 El proveedor de datos de .NET Framework para SQL Server no admite el uso del
marcador de posición de signo de interrogación de cierre (?) para pasar parámetros a
una instrucción SQL o a un procedimiento almacenado. Este proveedor trata los
parámetros del procedimiento almacenado como parámetros con nombre y busca
marcadores de parámetros coincidentes.
 Para crear un objeto DbParameter, se puede usar su constructor o bien se puede
agregar a DbParameterCollection mediante una llamada al método Add de la
colección DbParameterCollection.
 Las instrucciones SQL que modifican datos (por ejemplo INSERT, UPDATE o
DELETE) no devuelven ninguna fila. De la misma forma, muchos procedimientos
almacenados realizan alguna acción pero no devuelven filas. Para ejecutar comandos
que no devuelvan filas, cree un objeto Command con el comando SQL adecuado y una
Connection, incluidos los Parameters necesarios. El comando se debe ejecutar con el
método ExecuteNonQuery del objeto Command.

 Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.

 http://msdn.microsoft.com/es-es/library/ms254953(v=vs.110).aspx
 http://msdn.microsoft.com/es-es/library/yy6y35y8(v=vs.110).aspx
 http://www.ehu.es/mrodriguez/archivos/csharppdf/ADONET/ADONET.pdf
http://msdn.microsoft.com/es-es/library/3btz0xwf(v=vs.110).aspx

http://msdn.microsoft.com/es-es/library/ms254953(v=vs.110).aspx

http://msdn.microsoft.com/es-es/library/0fx37fx7(v=vs.110).aspx

CIBERTEC CARRERAS PROFESIONALES


320

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 321

APENDICE
CONTROLES ESTANDAR
Control Descripción
Representa un control de botón de Windows

Propiedades
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
TextAlign: obtiene o establece la alineación del texto en el
control del botón.
Visible: obtiene o establece un valor que indica si se muestra el
control.

Eventos
Click: Se produce cuando se hace clic en el control.

Representa Windows CheckBox

Propiedades:
AutoCheck: obtiene o establece un valor que indica si los
valores Checked o de CheckState se modifican en forma
automática cuando se hace click en el control
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Checked: obtiene o establece un valor que indica si el control
está en estado activada.
CheckState: obtiene o establece el estado del CheckBox
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
TabIndex: obtiene o establece el orden de tabulación del

CIBERTEC CARRERAS PROFESIONALES


322

control en su contenedor.
Text: obtiene o establece el texto asociado al control.
TextAlign: obtiene o establece la alineación del texto en el
control.
ThreeState: obtiene o establece un valor que indica si
CheckBox permitirá a tres estados comprobados en lugar de
dos.
Visible: obtiene o establece un valor que indica si se muestra el
control

Eventos
CheckedChanged: se produce cuando el valor de la a
propiedad de Checked.
Click: Se produce cuando se hace clic en el control.

Muestra Listbox en las que una casilla se muestran a la


izquierda de cada elemento

Propiedades:
AllowSelection: obtiene un valor que indica si ListBox habilita
actualmente la selección de elementos de lista.
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
CheckedIndices: colección de índices protegidos en este
CheckedListBox.
CheckedItems: colección de elementos activados en este
CheckedListBox.
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Items: obtiene la colección de elementos de este control.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
SelectedIndex: obtiene o establece el índice de base cero del
elemento actualmente seleccionado en el control ListBox
SelectedIndices: obtiene una colección que contiene los
índices de base cero de todos los elementos actualmente
seleccionados en el control ListBox.
SelectedItem: obtiene o establece el elemento actualmente
seleccionado en el control ListBox
SelectedIndices: obtiene una colección que contiene los
elementos actualmente seleccionados en el control ListBox.
SelectedValue: obtiene o establece el valor de la propiedad
miembro especificada por la propiedad ValueMember.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
ValueMember: obtiene o establece una cadena que especifica
la propiedad de origen de datos del que dibujar el valor.
Visible: obtiene o establece un valor que indica si se muestra el
control

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 323

Eventos
Click: Se produce cuando se hace clic en el control.
ItemCheck: Se produce cuando el estado activada de los
cambios de un elemento.
SelectedIndexChanged: Se produce cuando se hace
modificado la propiedad SelectedIndex o la colección
SelectedIndices.
SelectedValueChanged: Se produce cuando cambia la
propiedad SelectedValue.

Representa un control de cuadro combinado de Windows.

Propiedades:
AllowSelection: obtiene un valor que indica si ListBox habilita
actualmente la selección de elementos de lista.
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
DropDownStyle: obtiene o establece un valor que especifica el
estilo del cuadro combinado.
DropDownWidth: obtiene o establece el ancho de la parte
desplegable de un cuadro combinado.
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
FlatStyle: obtiene o establece la apariencia del ComboBox.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Items: obtiene la colección de elementos de este control.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
SelectedIndex: obtiene o establece el índice de base cero del
elemento actualmente seleccionado en el control ListBox
SelectedItem: obtiene o establece el elemento actualmente
seleccionado en el control ListBox
SelectedText: obtiene o establece el texto que se selecciona en
la parte de un ComboBox que se puede editar.
SelectedValue: obtiene o establece el valor de la propiedad
miembro especificada por la propiedad ValueMember.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
ValueMember: obtiene o establece una cadena que especifica
la propiedad de origen de datos del que dibujar el valor.
Visible: obtiene o establece un valor que indica si se muestra el
control

Eventos
Click: Se produce cuando se hace clic en el control.
SelectedIndexChanged: Se produce cuando se hace
modificado la propiedad SelectedIndex o la colección
SelectedIndices.
SelectedValueChanged: Se produce cuando cambia la

CIBERTEC CARRERAS PROFESIONALES


324

propiedad SelectedValue.

Representa un control de Windows que permite al usuario


seleccionar una fecha y una hora y muestra la fecha y hora con
un formato especificado.

Propiedades
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control.
CalendarFont: obtiene o establece el estilo de fuente aplicado
al control.
CalendarForeColor: obtiene o establece el color de primer
plano del calendario.
CalendarMonthBackGround: obtiene o establece el color de
fondo del mes del calendario.
CalendarTitleBackColor: obtiene o establece el color de fondo
del título del calendario.
Checked: obtiene o establece un valor que indica si la
propiedad de Value se ha establecido con un valor de fecha u
hora válidas y el valor mostrado se puede actualizar.
CustomFormat: obtiene o establece la cadena personalizada
de fecha y de formato de hora.
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Format: obtiene o establece el formato de fecha y hora
mostrada en el control.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
MaxDate: obtiene o establece la fecha y hora máxima que
puede ser seleccionado en el control.
MaximumDateTime: obtiene el valor de fecha máximo
permitido para el control.
MinDate: obtiene o establece la fecha y hora mínima que puede
seleccionar el control.
MinimumDateTime: obtiene el valor de fecha mínimo permitido
para el control.
Name: obtiene o establece el nombre del control.
ShowCheckBox: obtiene o establece un valor que indica si una
casilla se muestra a la izquierda de la fecha seleccionada.
ShowUpDown: obtiene o establece un valor que indica si un
control de botón de número se utiliza para ajustar la fecha del
valor de hora.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
Value: obtiene o establece la fecha y el valor de hora asignados
al control.
Visible: obtiene o establece un valor que indica si se muestra el

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 325

control.

Eventos
Click: Se produce cuando se hace clic en el control.
CloseUp: Se produce cuando se descarta el calendario
desplegable y desaparece.

Representa una etiqueta estándar de Windows

Propiedades
Autosize: obtiene o establece un valor que indica si el control
cambia automáticamente de tamañp para mostrar todo su
contenido
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
FlatStyle: obtiene o establece la apariencia de estilo plano del
control.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
TextAlign: obtiene o establece la alineación del texto en el
control del botón.
Visible: obtiene o establece un valor que indica si se muestra el
control.

Representa un control de Windows para mostrar una lista de


elementos.

Propiedades:
AllowSelection: obtiene un valor que indica si ListBox habilita
actualmente la selección de elementos de lista.
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
FlatStyle: obtiene o establece la apariencia del ComboBox.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Items: obtiene la colección de elementos de este control.
Margin: obtiene o establece el espacio entre controles.
MultiColumn: obtiene o establece un valor que indica si el

CIBERTEC CARRERAS PROFESIONALES


326

control ListBox admite varias columnas.


Name: obtiene o establece el nombre del control.
ScrollAlwaysVisible: obtiene o establece un valor que indica si
la barra de desplazamiento vertical se muestra siempre.
SelectedIndex: obtiene o establece el índice de base cero del
elemento actualmente seleccionado en el control ListBox
SelectedItem: obtiene o establece el elemento actualmente
seleccionado en el control ListBox
SelectedText: obtiene o establece el texto que se selecciona en
la parte de un ComboBox que se puede editar.
SelectedValue: obtiene o establece el valor de la propiedad
miembro especificada por la propiedad ValueMember.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
ValueMember: obtiene o establece una cadena que especifica
la propiedad de origen de datos del que dibujar el valor.
Visible: obtiene o establece un valor que indica si se muestra el
control

Eventos
Click: Se produce cuando se hace clic en el control.
SelectedIndexChanged: Se produce cuando se hace
modificado la propiedad SelectedIndex o la colección
SelectedIndices.
SelectedValueChanged: Se produce cuando cambia la
propiedad SelectedValue.
Representa un control de vista Windows el cual muestra una
colección de elementos que se pueden ver mediante una de las
cutro vistas distintas.

Propiedades:
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control.
BorderStyle: obtiene o establece el estilo de borde del control.
CheckedBoxes: obtiene o establece un valor que indica si se
va a mostrar una casilla junto al elemento del control.
CheckedIndices: obtiene los índices de los elementos
actualmente activados en el control.
CheckedItems: obtiene los elementos actualmente activados
en el control.
Columns: obtiene la colección de todos los encabezados de
columna que aparece en el control.
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
FullRowSelect: obtiene o establece un valor que indica si al
hacer click en un elemento se seleccionan todos sus
subelementos.
GridLines: obtiene o establece un valor que indica si aparecen
líneas de cuadricula entre las filas
Items: obtiene la colección de elementos de este control.
Margin: obtiene o establece el espacio entre controles.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 327

MultiSelect: obtiene o establece un valor que indica si se puede


seleccionar varios elementos.
Name: obtiene o establece el nombre del control.
SelectedIndices: obtiene los índices de los elementos
seleccionados en el control.
SelectedItems: obtiene los elementos seleccionados en el
control.
SmallImageList: obtiene o establece el ImageList que se utiliza
para mostrar elementos como iconos pequeños en el control
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
View: obtiene o establece como se muestrar los elementos en
el control.
VirtualMode: obtiene o establece un valor que indica si ha
proporcionado sus propias operaciones de administración de
datos para el control.
Visible: obtiene o establece un valor que indica si se muestra el
control

Eventos
Click: Se produce cuando se hace clic en el control.
SelectedIndexChanged: Se produce cuando se hace
modificado la colección.
Utiliza una máscara para distinguir entre los datos
proporcionados por el usuario correcto e incorrecto.

Propiedades
AsciiOnly: obtiene o establece un valor que indica si el control
acepta caracteres fuera del juego de caracteres ASCII
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
BeepOnError: obtiene o establece un valor que indica si el
control de cuadro de texto enmascarado provoca el sonido del
sistema para cada trao de la clave de usuario que rechace.
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
Mask: obtiene o establece la máscara de entrada para utilizar
en tiempo de ejecución.
MaxLength: obtiene o establece el número máximo de
caracteres que el usuario puede escribir o pegar en el control de
cuadro de texto.
Multiline: obtiene o establece un valor que indica si se trata de
un control de texto de varia líneas.
Name: obtiene o establece el nombre del control.
PasswordChar: obtiene o establece el carácter que se va a
mostrar en el sustituto de los datos proporcionados por el

CIBERTEC CARRERAS PROFESIONALES


328

usuario.
ReadOnly: obtiene o establece un valor que indica si el texto
del cuadro de texto es de solo lectura.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
TextAlign: obtiene o establece la alineación del texto en el
control del botón.
TextLength: obtiene la longitud del texto mostrado.
Visible: obtiene o establece un valor que indica si se muestra el
control.

Eventos
Click: Se produce cuando se hace clic en el control.
MaskChanged: se produce después de cambiar a la mascara
de entrada.
TextChanged: se produce cuando cambia en valor de la
propiedad Text

Representa un cuadro de numero de Windows

Propiedades
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Maximum: obtiene o establece el valor máximo para el cuadro
de número.
Minimum: obtiene o establece el valor mínimo para el cuadro
de número.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
TextAlign: obtiene o establece la alineación del texto en el
control del botón.
Value: obtiene o establece el valor asignado al cuadro de
número.
VerticalScroll: obteiene las características asociado a la barra
de desplazamiento vertical.
Visible: obtiene o establece un valor que indica si se muestra el
control.
VScroll: obtiene o establece un valor que indica si la barra de
desplazamiento vertical está visible.

Eventos
Click: Se produce cuando se hace clic en el control.
ValueChanged: se produce cuando el valor de la propiedad se
ha modificado.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 329

TextChanged: se produce cuando el valor de la propiedad Text


se ha modificado.

Representa un control de cuadro de imágenes de Windows para


mostrar una imagen.

Propiedades
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
SizeMode: indica como se muestra la imagen.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
Visible: obtiene o establece un valor que indica si se muestra el
control.

Eventos
Click: Se produce cuando se hace clic en el control.

Representa un control de barra de progreso de Windows.

Propiedades
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
Maximum: obtiene o establece el valor máximo para el cuadro
de número.
Minimum: obtiene o establece el valor mínimo para el cuadro
de número.
Name: obtiene o establece el nombre del control.
SizeMode: indica como se muestra la imagen.
Step: obtiene o establece la cantidad por el que una llamada al
metodo PerformStep incrementa la posición actual de la barra
de progreso
TabIndex: obtiene o establece el orden de tabulación del

CIBERTEC CARRERAS PROFESIONALES


330

control en su contenedor.
Text: obtiene o establece el texto asociado al control.
Value: obtiene o establece la posición actial de la barra de
progreso.
Visible: obtiene o establece un valor que indica si se muestra el
control.

Permite al usuario seleccinar una única opción de un grupo de


opciones cundo está emparejado con otros controles de
RadioButton.

Propiedades:
AutoCheck: obtiene o establece un valor que indica si los
valores Checked o de CheckState se modifican en forma
automática cuando se hace click en el control
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Checked: obtiene o establece un valor que indica si el control
está en estado activada.
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.
Image: obtiene o establece la imagen que se muestra en un
control de botón.
Margin: obtiene o establece el espacio entre controles.
Name: obtiene o establece el nombre del control.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
TextAlign: obtiene o establece la alineación del texto en el
control.
Visible: obtiene o establece un valor que indica si se muestra el
control

Eventos
CheckedChanged: se produce cuando el valor de la a
propiedad de Checked.
Click: Se produce cuando se hace clic en el control.

Representa un control de cuadro de texto de Windows

Propiedades
BackColor: obtiene o establece el color de fondo del control.
BackGroundImage: obtiene o establece la imagen de fondo
que se muestra en el control
Enabled: obtiene o establece un valor que indica si el control
puede responder a la interacción del usuario.
Font: obtiene o establece la fuente del texto que muestra el
control.
ForeColor: obtiene o establece el color de primer plano del
control.

CARRERAS PROFESIONALES CIBERTEC


PROGRAMACIÓN ORIENTADA A OBJETOS I 331

Margin: obtiene o establece el espacio entre controles.


MaxLength: obtiene o establece el número máximo de
caracteres que el usuario puede escribir o pegar en el control de
cuadro de texto.
Multiline: obtiene o establece un valor que indica si se trata de
un control de texto de varia líneas.
Name: obtiene o establece el nombre del control.
PasswordChar: obtiene o establece el carácter que se va a
mostrar en el sustituto de los datos proporcionados por el
usuario.
ReadOnly: obtiene o establece un valor que indica si el texto
del cuadro de texto es de solo lectura.
TabIndex: obtiene o establece el orden de tabulación del
control en su contenedor.
Text: obtiene o establece el texto asociado al control.
TextAlign: obtiene o establece la alineación del texto en el
control del botón.
TextLength: obtiene la longitud del texto mostrado.
Visible: obtiene o establece un valor que indica si se muestra el
control.

Eventos
Click: Se produce cuando se hace clic en el control.
KeyPress: se produce cuando se presiona una tecla mientras el
control tiene el foco.
TextChanged: se produce cuando cambia en valor de la
propiedad Text

Referencia: http://msdn.microsoft.com/es-es/library/System.Windows.Forms.aspx

CIBERTEC CARRERAS PROFESIONALES

Vous aimerez peut-être aussi