Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrollo de Aplicaciones Windows Forms en PDF
Desarrollo de Aplicaciones Windows Forms en PDF
aplicaciones con
Windows Forms
Empezando con .NET
Contenido
Diseño y desarrollo de aplicaciones ................................................................................................................... 3
Introducción ....................................................................................................................................................... 3
Controles ............................................................................................................................................................ 3
Uso de controles ............................................................................................................................................ 4
Algunas propiedades generales de los controles............................................................................... 4
Asignar nombres a los controles ........................................................................................................... 4
Ejercicio ..................................................................................................................................................... 5
Cuadros de diálogo............................................................................................................................................. 5
Menús................................................................................................................................................................. 6
Proyecto con múltiples formularios ................................................................................................................... 8
Manejo de excepciones...................................................................................................................................... 8
Programación Orientada a Objetos en C#........................................................................................................ 11
Clases............................................................................................................................................................ 11
Crear objetos ................................................................................................................................................ 12
Miembros de clase ....................................................................................................................................... 12
Ejemplo: crear una clase más completa ................................................................................................... 15
Colecciones de objetos................................................................................................................................. 16
LINQ .................................................................................................................................................................. 22
Documentar código fuente .............................................................................................................................. 23
¿Qué debe documentarse? ...................................................................................................................... 23
¿Qué utilizamos en la documentación? ................................................................................................... 24
Ejemplo: ................................................................................................................................................... 24
Controles creados por el usuario (Controles de usuario) ................................................................................ 26
Controles de usuario como biblioteca de controles .................................................................................... 28
Creación de distribuciones (Instaladores) ........................................................................................................ 31
Publicar el proyecto: ................................................................................................................................ 32
Crear un proyecto de instalación. ............................................................................................................ 34
Manipular una base de datos local .................................................................................................................. 38
Modos de conexión a Base de Datos ........................................................................................................... 38
Ejemplo de creación de BD, conexión y manipulación de datos ............................................................. 39
Crear la base de datos .................................................................................................................................. 40
Introducción
Los formularios son la unidad básica de una aplicación, es importante realizar algunas
consideraciones sobre su función y su diseño. Un formulario es una hoja en blanco que el
desarrollador rellena con controles, para crear una interfaz de usuario, y con código, para procesar
los datos. Para ese fin, Visual Studio proporciona un entorno de desarrollo integrado que ayuda a
escribir el código. La funcionalidad de estos controles se complementa con el código escrito por el
desarrollador, lo que permite desarrollar fácil y rápidamente las soluciones deseadas.
Controles
La interfaz de usuario de una aplicación visual está diseñada a partir de controles, siendo estos la
base de desarrollo rápido de aplicaciones.
El entorno de desarrollo elegido para trabajar en esta asignatura (Microsoft Visual Studio 2010)
presenta muchos controles integrados listos para ser utilizado en nuestros proyectos.
Uso de controles
Para utilizar cualquier control del cuadro de herramientas en
el diseño de formularios, debe seleccionarse y colocarse en
el diseñador de formularios.
Cada control en un formulario debe tener un nombre independiente que hace referencia al dato
que se obtendrá o mostrara a través de este, al asignar el nombre a un control debemos agregar
un sufijo o prefijo, donde el prefijo o sufijo es la abreviatura del tipo de control (clase);
Ejemplos:
NombreTxt o TxtNombre; el sufijo y prefijo Txt hace referencia al tipo de control TextBox.
AceptarBtn, CancelarBtn; donde Btn hace referencia a Button, esto indica que el control es un
botón.
LocalidadCmb, EstadoCmb; donde Cmb hace referencia a ComboBox, esto indica que el control
es una lista desplegable.
Ejercicio
Cree un proyecto de Windows Forms y en el diseñador de formularios, arrastre los controles
correspondientes de forma que obtenga un resultado similar.
Cuadros de diálogo
Nota: Es muy importante inducir e introducir al alumno a familiarizarse con el código escrito en C#:
palabras clave, tipos de datos, sentencias de control, sintaxis, interfaces, clases, propiedades,
métodos, etc. y trabajar con ejemplos de código.
Genere el código para el botón que contiene la leyenda “Aceptar” presionando doble clic sobre el
botón en el formulario (para ver el código fuente del formulario, presione la tecla F7 o utilizando el
menú contextual sobre el formulario o desde el explorador de soluciones).
Para más información y detalles sobre la clase MessageBox, consulte la documentación oficial de
la clase http://msdn.microsoft.com/es-es/library/system.windows.forms.messagebox.aspx
El alumno debe practicar con más ejercicios que le permitan manipular los controles del
formulario.
Menús
Usar una barra de menús en una aplicación permite agrupar y ordenar los comandos de la
aplicación facilita la accesibilidad por parte del usuario a estos.
Realice un ejercicio, para ello agregue un nuevo formulario al proyecto y agregue el control
MenuStrip y genere la estructura que se muestra en la imagen anterior.
El control MenuStrip agregado y todos sus elementos se les debe asignar un nombre.
El formulario tiene una propiedad llamada MainMenuStrip (Especifica el MenuStrip principal para
el formulario.).
El formulario que contiene el MenuStrip puede ser utilizado como contenedor MDI para mostrar
dentro de él las ventanas y acciones que resultan por cada uno de los comandos.
Para establecer el formulario como contenedor Mdi, debe habilitarse la propiedad IsMDIContainer
y el resultado es el mostrado en la imagen anterior.
Para más información acerca de los formularios MDI http://msdn.microsoft.com/es-
es/library/7aw8zc76%28v=VS.100%29.aspx
Genere el código para el primer elemento (Primer ejemplo) del menú Ver.
//mostrar la ventana
principal.Show();
}
Ejemplo2.- Código del evento clic del elemento Ver / Primer Ejemplo.
En el código del elemento, agregamos las instrucciones necesarias que permitan cargar la
ventana correspondiente dentro del contenedor.
Debe cambiarse el formulario principal del proyecto (primer formulario que debe mostrarse al
ejecutar el ejemplo.)
En el explorador de soluciones, abra el archivo Program.cs, en el método Main, cambie el
formulario de inicio.
Una aplicación de visual puede estar compuesta por una o más ventanas, emitir mensajes
visuales para el usuario y permitir la interacción con la interfaz gráfica navegando entre las
distintas ventanas.
Manejo de excepciones
El código de una aplicación escrito por el desarrollador aun bien diseñado puede afrontarse a
situaciones inesperadas durante la ejecución de la aplicación, dado que si el desarrollador no
considera las posibilidades de que ocurra un suceso que pueda afectar al correcto funcionamiento
de la aplicación, esta podría terminar de funcionar provocando un mal proceso de la información y
afectando la usabilidad por parte del usuario.
A este tipo de sucesos que ocurren en tiempo de ejecución se les llama excepciones.
Los programadores utilizan bloques try para aislar el código que puede ser afectado por una
excepción, y bloques catch para aislar el código que debe ejecutarse cuando resulte una
excepción, al bloque catch se le denomina “bloque para controlar excepciones”.
Los bloques catch pueden especificar el tipo de excepción que debe controlarse, o controlar
excepciones de forma general.
Para controlar otros tipos de excepción, agregue más bloques catch que controlen el tipo que
pudiera producirse en su código.
Para ver más detalles sobre excepciones y control de excepciones, visite la documentación oficial
http://msdn.microsoft.com/es-es/library/ms173160%28v=VS.100%29.aspx
Clases
Una clase es una plantilla que define una estructura, agrupa comportamientos (métodos) y
estados (atributos) de los futuros objetos que deriven de esta.
Los objetos que derivan de una clase se les llaman instancia de clase, las clases también admiten
herencia como ya lo sabemos en la poo.
Ejemplo:
Herencia de clase
La herencia se realiza a través de la derivación, lo que significa que una clase se declara
utilizando una clase base de la cual hereda los datos y el comportamiento.
En c# la herencia se especifica con : “dos puntos” seguidos del nombre de la clase base (clase
heredada).
Ejemplo:
Crear objetos
Un objeto es una entidad basada en una clase también denominada instancia de clase.
Ejemplo:
Miembros de clase
Las clases tienen miembros que representan sus datos y comportamiento, los tipos de miembros
son:
o Campos: Los campos son variables declaradas en el ámbito de clase. Un campo puede
ser un tipo numérico integrado o una instancia de otra clase.
o Constantes: Las constantes son campos o propiedades cuyo valor se establece en tiempo
de compilación y no se puede cambiar.
o Propiedades: Las propiedades son métodos de una clase a los que se obtiene acceso
como si fueran campos de esa clase. Una propiedad puede proporcionar protección a un
campo de clase con el fin de evitar que se cambie sin el conocimiento del objeto.
o Métodos: Los métodos definen las acciones que una clase puede realizar. Los métodos
pueden aceptar parámetros que proporcionan datos de entrada y devolver datos de salida
a través de parámetros. Los métodos también pueden devolver un valor directamente, sin
utilizar ningún parámetro.
o Constructores: Los constructores son métodos a los que se llama cuando el objeto se
crea por primera vez. Se utilizan a menudo para inicializar los datos de un objeto.
Para ver la lista completa de los miembros de clase y estructuras, consulte el sitio
http://msdn.microsoft.com/es-es/library/ms173113.aspx
Campos
Un campo es una variable de cualquier tipo que se declara directamente en una clase.
Ejemplo:
Propiedades
Una propiedad es un miembro que proporciona un mecanismo flexible a la lectura, escritura o
cálculo el valor de un campo privado. Las propiedades pueden utilizarse como si fuesen miembros
de datos públicos, aunque en realidad son métodos especiales denominados descriptores de
acceso. De este modo, se puede obtener acceso a los datos con facilidad, a la vez que se
promueve la seguridad y flexibilidad de los métodos.
Dónde:
get: se utiliza para devolver el valor de la propiedad que puede ser un campo.
set: se utiliza para asignar un nuevo valor a la propiedad, este nuevo valor es almacenado en un
campo.
return: palabra clave que representa el retorno.
value: palabra clave que se utiliza para representar el valor asignado al descriptor de acceso set.
Ejemplo:
Cuando se está trabajando con objetos, se invocan a sus propiedades para leer su valor o asignar
un nuevo valor o a cualquier otro de sus miembros, solo miembros públicos.
Constructores
Cada vez que se crea una nueva instancia de una clase se invoca a un constructor, una clase
puede tener uno o varios constructores que tomen argumentos diferentes.
Sintaxis:
Ejemplo:
public Persona()
{
}
Al invocar a un constructor que toma argumentos, deben especificarse los valores al momento de
inicializar el objeto, visual studio nos muestra automáticamente la sugerencia de los elementos de
la clase que pueden estar tratándose de invocar, donde nos muestra la estructura de los
elementos.
//constructores
public Persona()
{
}
//propiedades
public string Nombre
{
get { return nombre; }
set { this.nombre = value; }
}
Colecciones de objetos
Trabajar con colecciones es trabajar con listas o arreglos de objetos, similar a los registros
almacenados en una tabla de una base de datos, además, pueden utilizarse como fuente de
datos para mostrarlos al usuario en forma de tabla o imprimirlos en un reporte.
miembros específicos de los tipos. Además, por lo general los tipos de colección genéricos tienen
un mejor rendimiento que los tipos de colección no genéricos correspondientes (y mejor que el de
los tipos derivados de tipos de colección base no genéricos) cuando los elementos de la colección
son tipos de valor, porque con los genéricos no hay necesidad de realizar conversiones boxing de
los elementos.
En este caso, utilizaremos la clase List<>: Representa una lista fuertemente tipada de objetos a
los que se puede obtener acceso por el índice. Proporciona métodos para buscar, ordenar y
manipular listas. http://msdn.microsoft.com/es-es/library/6sh2ey19.aspx
Ejemplo:
Crear una lista de objetos de la clase Persona, podría decirse que representa una “lista de
personas”.
listadepersonas.Add(nuevapersona);
En este ejemplo se crea un nuevo objeto de la clase persona, al cual se le asignan valores
a sus propiedades.
La instrucción listadepersonas.Add(nuevapersona); agrega el nuevo objeto creado a la
colección de objetos de la clase Persona.
listadepersonas.Add(
new Persona {
Nombre = "Juan",
Apellidos = "Pérez Torres",
FechaNacimiento = DateTime.Parse("01/01/1990"),
Sexo = "Hombre",
Edad = 21,
EstadoCivil = "Soltero",
Calle = "Independencia",
Numero = "350",
Municipio = "Izúcar de Matamoros",
Estado = "Puebla"
}
);
En este ejemplo no se crea el objeto por separado, sino que se crea directamente dentro del
método Add(), consulte la documentación de la clase List<> donde encontrará como manipular
colecciones.
Crear un ejemplo donde se cargue una colección de objetos en una ventana y se agreguen
y editen elementos.
• Para empezar con el ejemplo, puede crear un nuevo proyecto de Windows forms o utilice
uno existente, en el cual, implemente la clase Persona tratada anteriormente.
o Genere el evento Click() del botón “Nuevo” que abrirá la ventana donde el usuario deberá
ingresar los datos de la nueva persona, el código quedará así:
private void NuevoBtn_Click(object sender, EventArgs e)
{
//crear instancia de la clase (formulario) PersonaFrm
PersonaFrm ventanadatospersonales = new PersonaFrm();
ventanadatospersonales.ShowDialog();
o Genere el evento clic para el botón “Editar” el cual al ser presionado, deberá cargar
los datos del elemento seleccionado en la lista a la ventana de datos donde el
usuario podrá modificar y aceptar nos nuevos cambios que se verán reflejados en
la lista.
private void EditarBtn_Click(object sender, EventArgs e)
{ //crear la instancia de la ventana a mostrar
PersonaFrm ventanadatospersonales = new PersonaFrm();
//antes de mandar a mostrarla, debemos recuperar el objeto
//seleccionado en el datagridview
//después pasarlo a la ventana para mostrar sus datos
ListaDtg.Refresh();
}
o Generar el evento Click() del botón “Eliminar” que al ser presionado, deberá
eliminar de la lista el objeto seleccionado en el datagridview.
private void EliminarBtn_Click(object sender, EventArgs e)
{
listadepersonas.Remove((Persona)this.ListaDtg.SelectedRows[0].DataBoundItem);
this.ListaDtg.DataSource = null;
this.ListaDtg.DataSource = listadepersonas;
}
if (this.SexoHombreRbtn.Checked)
persona.Sexo = "H";
if (this.SexoMujerRbtn.Checked)
persona.Sexo = "M";
}
o Implementar el método privado que cargue llene los controles con los datos del
objeto (será invocado cuando el usuario edite un objeto).
private void CargarDatos()
{
this.NombreTxt.Text = this.persona.Nombre; //cargar el nombre
this.ApellidosTxt.Text = this.persona.Apellidos;
this.FechaNacimientoDtp.Value = this.persona.FechaNacimiento;
this.CalleTxt.Text = this.persona.Calle;
this.NumeroTxt.Text = this.persona.Numero;
this.EstadoCmb.Text = this.persona.Estado;
this.MunicipioCmb.Text = this.persona.Municipio;
if (this.persona.Sexo == "H")
this.SexoHombreRbtn.Checked = true;
if (this.persona.Sexo == "M")
this.SexoMujerRbtn.Checked = true;
}
o Crear un método público que devuelva un valor que indique si el usuario presionó el
botón Aceptar (true) o el botón Cancelar (false).
//campo que almacene el valor que indique si el usuario ingreso datos
private bool ingresodatos;
LINQ
Para ver algunos ejemplos acerca de cómo escribir consultas LINQ para colecciones, visite la url
http://msdn.microsoft.com/en-us/vcsharp/aa336746 donde se muestran ejemplos para la mayoría
de los operadores de consulta en los cuales también se incluyen expresiones lambda
http://msdn.microsoft.com/es-es/library/bb397687.aspx
Realizar consultas sobre la colección Clientes utilizando consultas LINQ y expresiones Lambda.
1. Filtrar todos los clientes del Grupo “A”:
SQL: Select * from Clientes Where Grupo = ‘A’;
LINQ: var ClientesGrupoA = from c in Clientes where c.Grupo == "A" select c;
Lambda: var ClientesGrupoA = Clientes.Where(c => c.Grupo == "A");
LINQ: var ClientesActivosB = from c in Clientes where c.Grupo == "A" && c.Activo ==
"Si" select c;
Lambda: var ClientesActivosB = Clientes.Where(c => c.Grupo == "A" && c.Activo ==
"Si");
6. Devolver todos los clientes tipo VIP (Utilizar colecciones combinadas – [tablas
relacionadas]);
Lambda: var clientesVIP = Clientes.Where(c => c.Tipo == TiposCliente.Where(t =>
t.Nombre == "VIP");
Para ver un ejemplo funcional donde se aplican estos conceptos, visite el tutorial en línea
http://afelipelc.wordpress.com/2011/06/21/filtrar-elementos-de-una-coleccion-list-por-un-campo-
especificado/
Documentar el código fuente escrito por el programador no significa que tenga que agregar
comentarios abundantes en el código.
Documentar el código fuente de un programa escrito es añadir suficiente información que explique
de forma clara lo que este hace cada una de sus funcionalidades, de esta manera, no solamente
el procesador sabrá lo que el programa hace, sino que también el usuario pueda saberlo y por qué
lo hace.
Documentar un programa significa que el programador terminará una obra bien hecha, siendo
también esta una necesidad que se aprecia cuando en el futuro se encuentren errores que
corregir (mantenimiento) o tengan que ampliarse algunas funcionalidades.
Un programa documentado debe permitir la lectura y compresión al ser revisado y modificado por
el programador original u otro programador.
Para documentar un miembro de una clase, interfaz, etc. en C#, se ubica el cursor antes de la
declaración del método a documentar, se presiona /// (tres veces diagonal), automáticamente se
agregará la etiqueta <sumary> </sumary> donde escribiremos la descripción corta acerca del
miembro.
Al documentar un constructor o método, automáticamente agregara las partes para especificar
cada uno de los parámetros.
Ejemplo:
/// <summary>
/// Representa los datos generales de una persona.
/// </summary>
/// <remarks>
/// La clase Persona implementa las propiedades más generales de una persona
/// como: nombre, apellidos, fecha de nacimiento, edad, estado civil, sexo,
/// domicilio, número, estado y municipio.
/// </remarks>
public class Persona
{
//campos que almacenan los datos de la persona
private string nombre;
private string apellidos;
private DateTime fechanacimiento;
private int edad;
private string edo_civil;
private string sexo;
private string calle;
private string numero;
private string estado;
private string municipio;
public Persona()
{
/// <summary>
/// Constructor que inicializa un objeto de la clase Persona con
/// solo 2 parámetros
/// </summary>
/// <param name="Nombre">Nombre de la persona.</param>
/// <param name="Apellidos">Apellidos de la persona.</param>
public Persona(string Nombre, string Apellidos)
{
this.nombre = Nombre;
this.apellidos = Apellidos;
}
/// <summary>
/// Nombre de la persona.
/// </summary>
public string Nombre
{
get { return nombre; }
set { this.nombre = value; }
}
/// <summary>
/// Apellidos de la persona.
/// </summary>
public string Apellidos
{
get { return this.apellidos; }
set { this.apellidos = value; }
}
/// <summary>
/// Edad de la persona.
/// </summary>
public int Edad
{
get { return edad; }
set { this.edad = value; }
}
/// <summary>
/// Estado civil de la persona.
/// </summary>
public string EstadoCivil
{
get { return edo_civil; }
set { this.edo_civil = value; }
}
/// <summary>
/// Sexo de la persona.
/// </summary>
public string Sexo
{
get { return sexo; }
set { this.sexo = value; }
/// <summary>
/// Domicilio donde vive la persona.
/// </summary>
public string Calle
{
get { return this.calle; }
set { this.calle = value; }
}
/// <summary>
/// Fecha de nacimiento de la persona.
/// </summary>
public DateTime FechaNacimiento
{
get { return this.fechanacimiento; }
set { this.fechanacimiento = value; }
}
/// <summary>
/// Estado de la república donde vive la persona.
/// </summary>
public string Estado
{
get { return this.estado; }
set { this.estado = value; }
}
/// <summary>
/// Municipio donde vive la persona.
/// </summary>
public string Municipio
{
get { return this.municipio; }
set { this.municipio = value; }
}
Los controles de usuario proporcionan un medio para crear y reutilizar interfaces gráficas de
usuario. Un control de usuario es esencialmente un componente con una representación visual.
Como tal, puede constar de uno o más controles de formularios Windows Forms, componentes o
bloques de código, que pueden extender su funcionalidad. Los controles de usuario pueden
incluirse en formularios Windows Forms de la misma manera que los demás controles.
Para crear un control de usuario en el proyecto actual, agregue un control de usuario como nuevo
elemento del proyecto (clic derecho sobre el nombre del proyecto / Agregar / Control de usuario).
Agregue los controles que se ven en la siguiente imagen: Label, TextBox (NombreTxt), Button
(AceptarBtn).
Crear una biblioteca de controles es crear un proyecto por separado donde se incluyan distintos
controles de usuario, pueden incluirse controles personalizados que amplíen la funcionalidad de
controles existentes en el entorno de desarrollo.
Al crear el proyecto, por default crea un control de usuario, cambien el nombre a primercontrol y
agregue los elementos que se muestran en la siguiente imagen.
Agregue funcionalidades al control de usuario como el control creado anteriormente, solo para
utilizarlo como prueba.
Al generar la solución, el ensamblado generado es un archivo .dll el cual podrá utilizar para
agregar como referencia en otros proyectos y utilizar los controles incluidos en la biblioteca.
Y http://afelipelc.wordpress.com/2011/05/29/crear-controles-personalizados-windows-forms-2/
Después de haber implementado la aplicación de Windows y lista para su entrega final, debe
empaquetarse, durante el proceso de empaquetado se obtiene un instalador, el cual contiene
todos los archivos y bibliotecas necesarios para que la aplicación funcione correctamente, a esto
también se le conoce como crear una distribución.
Publicar el proyecto:
• El primer paso es Generar el proyecto o solución (Menú Generar / Generar Solución “F6” o
Generar / Generar [Nombre del proyecto] “Shift + F6”), si durante este proceso no se
encontró ningún error, pasamos al siguiente paso, caso contrario debemos solucionar los
errores de codificación.
• Ir a Generar / Publicar [Nombre del proyecto], se abrirá el asistente de publicación donde:
o Seleccione la ruta donde se publicará el proyecto que puede ser una carpeta local,
IIS local, Sitio FTP o sitio web remoto.
o Configurar actualizaciones.
o Finalizar el asistente.
Para crear accesos directos al escritorio, sitúese en escritorio del usuario, en el área de
contenido, haga clic derecho y seleccione crear nuevo acceso directo.
Un sistema de software que fomente la solución a las necesidades de una organización, esta
principalmente enfocada a la manipulación y administración de los datos.
La plataforma .NET incluye un conjunto de clases a través del ADO.NET que ofrecen servicios de
acceso a diferentes fuentes de datos, servicios que cuyas características y funcionalidades
pueden variar con respecto al tratamiento de los datos. http://msdn.microsoft.com/es-
es/library/e80y5yhx(v=VS.100).aspx
ADO.NET Entity Framework permite a los desarrolladores crear aplicaciones de acceso a datos
programando con un modelo de aplicaciones conceptuales en lugar de programar directamente
con un esquema de almacenamiento relacional. El objetivo es reducir la cantidad de código y el
mantenimiento necesarios para las aplicaciones orientadas a datos. Las aplicaciones de Entity
Framework ofrecen las siguientes ventajas:
El alumno debe consultar la información proporcionada por Microsoft para familiarizarse con el
tema consultando:
• Introducción: http://msdn.microsoft.com/es-es/library/bb386876.aspx
• Tutorial rápido: http://msdn.microsoft.com/es-es/library/bb399182.aspx
Para empezar a trabajar con Entity Framework, nos basaremos en un ejemplo partiendo desde
cero.
Cree un proyecto de Windows Forms (C#) llamado EjemploDEM cuyo diseño sea similar al
formulario de la siguiente imagen, establezca el nombre del formulario a ListaAutosFrm.
Agregue otro nuevo formulario llamado DatosAutoFrm cuyo diseño será similar a:
El formulario incluye:
• 2 GroupBox: con los textos “Datos del auto” y “Datos del propietario” que contiene cada
uno los controles correspondientes.
• “Datos del auto” incluye:
o 4 etiquetas – Label con los textos correspondientes “Número de serie”, “Marca”,
“Modelo” y “Color.”
o 1 TextBox llamado NumeroSerieTxt donde se ingresará el número de serie del
auto.
o 1 ComboBox llamado MarcaCmb donde se cargará la lista de marcas desde la BD
y el usuario seleccionará una.
o 1 TextBox llamado ModeloTxt donde se ingresará el modelo del auto.
• “Datos del propietario” incluye:
o 1 ComboBox llamado NombreCmb que se utilizará para mostrar la lista de nombres
que coincidan con el nombre que este escribiendo el usuario y seleccionará el
nombre correspondiente (autocomplementar) y se cargarán los datos del
propietario si este ya está registrado en la BD.
o 1 TextBox llamado ApellidosTxt donde se ingresarán los apellidos del propietario.
o 1 TextBox llamado EdadTxt donde se ingresará la edad del propietario.
• 1 Button llamado AceptarBtn que al ser presionado cargará los datos ingresados en un
objeto.
• 1 Button llamado CancelarBtn que cerrará la ventana.
El tamaño actual del formulario establézcalo como tamaño mínimo (MinimunSize) y tamaño
máximo (MaximunSize), establezca el botón predeterminado para aceptar el botón AceptarBtn
(AcceptButton) y el botón predeterminado para cancelar el botón CancelarBtn (CancelButton).
En el explorador de soluciones, presione doble clic sobre la base de datos BaseDatos.mdf, abrirá
el explorador de servidores donde trabajaremos en la base de datos, verá que es muy similar al
administrador de base de datos SQL Management Studio, de hecho, puede crear la base de datos
en el administrador SQL Management Studio y al finalizar, extraer el archivo .mdf de la carpeta
DATA que se encuentra en la carpeta de instalación del SQL Server.
Se abrirá la ventana “Relaciones de clave externa” sin ninguna relación, haga clic sobre el botón
“Agregar”, creará una nueva relación, en la parte lateral derecha seleccione especificación de
consultas y haga clic sobre el botón “…” señalado con el puntero del ratón en la siguiente imagen.
Utilizaremos la herramienta ORM (Object Relational Mapping) ADO.NET Entity Data Model
proporcionada por el ADO.NET Entity Framework mencionado al principio de este tema.
Ejemplo:
La entidad Auto tiene las propiedades de navegación Marca y Propietario, para lo cual, un objeto
de la clase Auto está relacionado a un objeto de la clase Marca, objeto al que puede accederse a
través de la propiedad de navegación Marca.
Supongamos que, se tiene el objeto llamado “unauto” y quiere saberse cuál es el nombre de su
marca, para ello se invoca:
unauto.Marca.Nombre;
De igual forma si se quiere saber cuál es el nombre de su propietario:
unauto.Propietario.Nombre;
Los campos IdPropietario e IdMarca solo almacenan los valores de las claves primarias a las que
están relacionados.
De esta forma se están utilizando las propiedades de navegación; para relacionar dos objetos a
través de una propiedad de navegación.
Supongamos que tenemos el objeto unauto y unamarca y queremos relacionarlos, la relación se
realizaría de esta forma:
unauto.Marca = unamarca;
O almacenando el valor de la clave primaria en el campo correspondiente:
unauto.IdMarca = unamarca.IdMarca;
Manejo de datos.
Antes de empezar a trabajar con el modelo, necesitamos agregar algunas marcas a nuestra tabla
correspondiente:
Nos situamos en el código de nuestro formulario y crearemos una instancia de nuestra clase
conexión (BaseDatosEntities).
Creamos un método llamado CargarLista() cuya función sea cargar la lista de autos a nuestro
datagridview cada vez que sea invocado.
Como resultado observamos que nos carga todas las propiedades de la entidad Auto incluyendo
las propiedades de navegación que muestran el nombre del objeto relacionado.
Para cargar solo los datos: Número de serie, Nombre de la Marca, Modelo, Color, Nombre del
propietario necesitamos trabajar con tipos anónimos vistos en LINQ. Modificaremos nuestro
método CargarLista() que quedará así:
Crear las variables y campos necesarios para almacenar el objeto a editar o crear, la conexión a la
bd y propiedad que permita establecer la clave del objeto a editar.
Implementar el método que cargue los datos del objeto en los controles del formulario.
//método que cargue los datos del objeto a los controles
private void CargarDatos()
{
//recuperar el objeto desde la base de datos
//cuyo número de serie sea el que el usuario selecciono.
auto = BD.Auto.Where(a => a.NoSerie == idauto).FirstOrDefault();
this.NombreCmb.Text = auto.Propietario.Nombre;
this.ApellidosTxt.Text = auto.Propietario.Apellidos;
this.EdadTxt.Text = auto.Propietario.Edad.ToString();
}
}
Implementar un método que cargue los datos de los controles al objeto y guarde o actualice el
registro en la base de datos.
Si desea que al hacer clic en alguna celda de la tabla se seleccione la fila completa, modifique las
propiedades del control, establezca:
SelectionMode a FullRowSelect
MultiSelect = False
Codificaremos el DataGridView para que al presionar doble clic sobre un elemento de la lista se
muestre la ventana para editar sus datos.
ventanadatos.ShowDialog();
Puede verificar que al mostrar la ventana de datos, pueden modificarse los datos y al hacer clic en
Aceptar los cambios son guardados en la BD.
Eliminar Registros
Cuando el usuario presione el botón Eliminar, el registro seleccionado debe eliminase, para ello,
genere el evento Clic del botón:
CargarLista();
}
}
Cuando se asigna un datasource a un combobox sufre cambios durante los cuales se produce el
evento SelectedIndexChanged y SelectedValueChanged y el código que se encuentra dentro de
los métodos asociados a estos eventos. Lo mismo sucede cuando se especifica la propiedad de la
clase que debe mostrarse como opción (texto en el combobox).
Por lo cual, debemos crear una variable que indique que la lista de elementos se ha cargado en el
combo.
Entonces declaramos una variable de tipo bool la cual debemos cambiar su valor a true en el
evento Load del formulario después de asignar los valores de las propiedades del combo.
datoscargados = true;
else
{
//cargar los registros de la tabla Auto que están relacionados
//con la marca seleccionada.
this.ListaDtg.DataSource = BD.Auto.
Where(a => a.Marca.Nombre.Trim() == this.PorMarcaCmb.Text.Trim()).
Select(a =>
new
{
NoSerie = a.NoSerie,
Marca = a.Marca.Nombre,
Modelo = a.Modelo,
Color = a.Color,
Propietario = a.Propietario.Nombre.Trim() + " " +
a.Propietario.Apellidos.Trim()
});
}
}
}
Creación de reportes
Cuando una organización desarrolladora de software implementa una solución a una necesidad
especifica de un cliente. Entrega un producto final como resultado del proyecto que cumple los
requerimientos del cliente.
Uno de los requerimientos del cliente es que el sistema software tenga la capacidad de arrojar
información relevante y relativamente útil proveniente de una fuente de datos y tenerla disponible
en el momento requerido.
La función del usuario final es realizar su labor cotidiana apoyándose en la nueva herramienta que
se le ha proporcionado.
Durante la interacción con la aplicación, el usuario elige guardar la información para continuar con
su labor.
Sin importar como el sistema almacena, organiza y procesa la información para generar el
resultado final, lo que quiere el usuario es visualizar la información lista para ser impresa o
guardada como documento.
Microsoft Visual Studio 2010 incluye la funcionalidad de diseño de informes y los controles
ReportViewer, que le permiten agregar informes con todas las características a las aplicaciones
personalizadas. Los informes pueden contener datos tabulares, agregados y multidimensionales.
Los controles ReportViewer le permitirán procesar y mostrar el informe en la aplicación. Hay dos
versiones del control.
Para utilizar un control ReportViewer en la aplicación, debe saber cómo agregar el control al
formulario del proyecto, configurar el control para utilizar una definición de informe local o informe
de servidor, actualizar las referencias de orígenes de datos y comprobar e implementar los
informes y el control en la aplicación. Para obtener toda la información referente a la creación y
visualización de informes, consulte http://msdn.microsoft.com/es-
es/library/ms251671%28v=VS.100%29.aspx
Pero para nuestra suerte, los reportes no aceptan tipos anónimos y mucho menos las propiedades
de navegación que tenemos en el modelo, eso impedirá que nuestro informe muestre los datos
que deseamos.
La vista podemos utilizarla también para cargar los datos en el datagridview y llenar el informe al
mismo tiempo, y el procedimiento almacenado para recuperar datos específicos y utilizarlo para
llenar el informe.
Otra solución para llenar el informe sería crear nuestras propias clases con las propiedades
necesarias y crear colecciones de objetos de estas clases y pasarlas al datasource del informe.
La vista debe devolver Número de Serie del auto, nombre de la Marca, Modelo, Color y nombre
del Propietario.
El código sql para campos a devolver por el procedimiento almacenado serán los mismos que los
de la vista.
Actualizar el modelo.
Los nuevos elementos deben ser agregados a nuestro modelo, para ello, en el explorador de
soluciones abra el archivo Modelo.edmx, visualizara el diseño del modelo.
Haga clic derecho sobre cualquier área del modelo y seleccione Actualizar modelo desde base
de datos.
Aparecerá el asistente, seleccione los nuevos elementos a agregar (en la pestaña Agregar, utilice
Actualizar o Eliminar para realizar las acciones correspondientes) y seleccione Finalizar.
En el modelo observamos que la vista es agregada como una nueva entidad (nueva clase), pero
el procedimiento almacenado no aparece; los procedimientos almacenados no crean nuevas
entidades, los procedimientos almacenados deben importarse como funciones en el modelo.
Para ver los campos que devuelve el procedimiento almacenado, haga clic en Obtener
información de función de columna.
Puede crear una nueva clase con las propiedades especificadas como campos del SP, para ello
haga clic en Crear nuevo tipo complejo, el nombre especificado en Complejo será el nombre de
la nueva clase.
Agregue un nuevo formulario llamado InformeFrm al cual debe agregar el control ReportViewer.
Agregue una nueva tabla al diseño del informe, arrastre los campos de Datos informe a las
columnas de la tabla.
En nuestra clase ListaAutosFrm, debemos crear un campo que almacene un objeto de la clase
InformeFrm (Formulario que mostrará el informe)
Modificar nuestro método llamado CargarLista() para que deje de utilizar tipos anónimos y ahora
utilice nuestra vista vAuto y la misma vista llene el informe.
Modificar también el código de nuestro combobox, pero este debe cargar la lista de autos
correspondientes a la marca seleccionada con los resultados del procedimiento almacenado.
Los resultados del SP son pasados también al informe ya que los campos devueltos por la vista y
el sp son los mismos, de lo contrario se tendría un error.
Ahora solo nos falta programar el botón ImprimirBtn para que muestre el reporte.
Comprobando la funcionalidad.
Agregue nuevos registros, y pruebe con Imprimir seleccionando alguna marca o todas las marcas.
Roles y usuarios
Roles
Los roles están diseñados para permitir que el administrador del sistema controle lo que los
usuarios pueden hacer o no en el sistema.
El administrador gestiona los permisos de los usuarios en relación con las operaciones como:
Altas, Bajas, Editar, etc.
Cada ROL o perfil se identifica con un nombre y se define por los permisos para ejecutar un
conjunto de tareas dentro del sistema.
A continuación se presenta una tabla de ejemplo donde se especifican con más detalles los
permisos de cada rol.
Eliminar Registros X
Realizar Consultas X X
Generar Reportes X X
Usuarios
Los usuarios se identifican con un nombre y una contraseña para tener acceso a una aplicación.
A continuación se presenta una tabla de ejemplo donde se especifican con más detalles los roles
de cada usuario.
Roles / Usuarios Pablito Pepe Pedro Petra
Administrador X
Captura X X
Consultas X X
Autentificación.
La autentificación es uno de los conceptos clave que deben implementarse en aplicaciones
seguras.
La autentificación es un proceso para verificar y asegurar que el usuario es quien dice ser.
Para implementar la seguridad en una aplicación de Windows debe realizarse utilizando clases
que interactúan con el sistema operativo (API).
Con la API pueden utilizarse las credenciales de usuario del sistema operativo Windows.
Por ejemplo, si se quiere saber el nombre del usuario actual de windows, invocamos:
WindowsIdentity.GetCurrent().Name;
Implementar roles y usuarios en nuestro ejemplo de Autos proyecto llamado EjemploEDM que
manipula una base de datos.
Antes de empezar, trabajaremos con usuarios que solo tienen un rol, para ello, cree una nueva
tabla en la base de datos llamada Usuario, que contenga los campos NombreUsuario, Password
y Rol donde NombreUsuario sea la clave primaria.
namespace EjemploEDM
{
public partial class LoginFrm : Form
{
//conexión a la BD
BaseDatosEntities BD = new BaseDatosEntities();
//Crear el Principal
GenericPrincipal usuario;
Genere el evento clic para el botón Aceptar donde se comprobaran los datos ingresados por el
usuario con los almacenados en la base de datos, si son válidos, se creará la sesión y se asociara
el usuario con el proceso (aplicación).
//if(datosusuario.Activo == true)
//{
//inicializar el Principal
usuario = new GenericPrincipal(Identidad, Roles.ToArray());
ventanaprincipal.ShowDialog();
}else
{
//si el objeto es nulo, notificar al usuario y que intente nuevamente
MessageBox.Show("Datos de acceso incorrectos.", "Aplicación de ejemplo",
MessageBoxButtons.OK, MessageBoxIcon.Error);
En cada ventana que se cargue y se quiera comprobar el rol del usuario, debe realizarse en el
evento Load, por ejemplo:
Se quiere validar que el usuario tenga el Rol de Administrador al cargarse el formulario llamado
ListaAutosFrm, el evento load de ListaAutosFrm quedara así:
//finalizar aplicacion
Application.Exit();
}
Ejecute la aplicación e intente acceder con ambos usuarios creados, uno con Rol de
Administrador y otro con Rol de Invitado.
Conclusión
Este documento que he elaborado ha sido la base para que los estudiantes a quienes he
impartido estos temas vayan adentrándose al a veces complejo mundo de la programación,
aunque siendo realista, no todos adquieren las competencias buscadas durante el curso, pero
siempre hay un porcentaje considerado que en un poco tiempo podrá dominar estos terrenos.
Sin más que agregar, considero que este documento ayude a más estudiantes en su aprendizaje.