Académique Documents
Professionnel Documents
Culture Documents
aplicaciones con
Windows Forms
Empezando con .NET
En este documento comparto informacin que ayude a los
estudiantes que empiezan a trabajar con Windows Forms en
.NET partiendo desde el diseo de formularios hasta la
manipulacin de una base de datos utilizando ADO. Net Entity
Framework a travs de consultas LINQ y generar reportes,
adems de agregar seguridad a las aplicaciones desarrolladas
con Windows Forms.
Alfonso Felipe Lima Corts
13/06/2012
www.afelipelc.mx
Pgina 1 de 77
www.afelipelc.mx
Pgina 2 de 77
Controles
La interfaz de usuario de una aplicacin visual est diseada a partir de controles, siendo estos la
base de desarrollo rpido 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.
En el cuadro de herramientas se encuentran todos
los controles disponibles para el tipo de proyecto, en
el cual se encuentran agrupados por funcionalidad.
La lista completa de controles que pueden utilizarse
en aplicaciones de Windows Forms se encuentra en
la documentacin oficial del entorno de desarrollo
http://msdn.microsoft.com/eses/library/xfak08ea.aspx la documentacin tcnica
para cada control tambin se encuentra disponible
haciendo clic sobre el nombre del control.
www.afelipelc.mx
Pgina 3 de 77
www.afelipelc.mx
Pgina 4 de 77
Ejercicio
Cree un proyecto de Windows Forms y en el diseador de formularios, arrastre los controles
correspondientes de forma que obtenga un resultado similar.
El formulario incluye los controles Label,
TextBox, y Button.
Asigne nombres a los controles y
especifique el texto a mostrar en la etiqueta.
Especifique el orden (TabIndex) de los
controles.
Img. 3.- Vista previa del ejemplo a disear.
Cuadros de dilogo
Recuperar datos de los controles y mostrarlos en mensajes:
Nota: Es muy importante inducir e introducir al alumno a familiarizarse con el cdigo escrito en C#:
palabras clave, tipos de datos, sentencias de control, sintaxis, interfaces, clases, propiedades,
mtodos, etc. y trabajar con ejemplos de cdigo.
Genere el cdigo para el botn que contiene la leyenda Aceptar presionando doble clic sobre el
botn en el formulario (para ver el cdigo fuente del formulario, presione la tecla F7 o utilizando el
men contextual sobre el formulario o desde el explorador de soluciones).
www.afelipelc.mx
Pgina 5 de 77
Mens
Usar una barra de mens en una aplicacin permite agrupar y ordenar los comandos de la
aplicacin facilita la accesibilidad por parte del usuario a estos.
En una aplicacin de Windows Forms para
crear una barra de mens, utilizamos el
control
MenuStrip
(http://msdn.microsoft.com/eses/library/ms171649%28v=VS.100%29.asp
x ).
www.afelipelc.mx
Pgina 6 de 77
Ejemplo2.- Cdigo del evento clic del elemento Ver / Primer Ejemplo.
En el cdigo 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 mtodo Main, cambie el
formulario de inicio.
www.afelipelc.mx
Pgina 7 de 77
Para
agregar
nuevas
ventanas
(formularios) al proyecto, en el explorador de
soluciones presione clic derecho sobre el
nombre del proyecto / Agregar / Nuevo elemento
(o directamente Windows Forms).
Manejo de excepciones
El cdigo de una aplicacin escrito por el desarrollador aun bien diseado puede afrontarse a
situaciones inesperadas durante la ejecucin de la aplicacin, dado que si el desarrollador no
considera las posibilidades de que ocurra un suceso que pueda afectar al correcto funcionamiento
de la aplicacin, esta podra terminar de funcionar provocando un mal proceso de la informacin y
afectando la usabilidad por parte del usuario.
A este tipo de sucesos que ocurren en tiempo de ejecucin se les llama excepciones.
www.afelipelc.mx
Pgina 8 de 77
Los programadores utilizan bloques try para aislar el cdigo que puede ser afectado por una
excepcin, y bloques catch para aislar el cdigo que debe ejecutarse cuando resulte una
excepcin, al bloque catch se le denomina bloque para controlar excepciones.
Los bloques catch pueden especificar el tipo de excepcin que debe controlarse, o controlar
excepciones de forma general.
www.afelipelc.mx
Pgina 9 de 77
Pero si se produjera otra excepcin, esta nueva no sera controlada, ya que no se controlan
excepciones de forma general.
Para controlar otros tipos de excepcin, agregue ms bloques catch que controlen el tipo que
pudiera producirse en su cdigo.
Para ver ms detalles sobre excepciones y control de excepciones, visite la documentacin oficial
http://msdn.microsoft.com/es-es/library/ms173160%28v=VS.100%29.aspx
www.afelipelc.mx
Pgina 10 de 77
Clases
Una clase es una plantilla que define una estructura, agrupa comportamientos (mtodos) 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 tambin admiten
herencia como ya lo sabemos en la poo.
Las clases se definen con la palabra reservada class
La sintaxis para definir una clase es:
<modificador de acceso> class <nombre de la clase>
{
<miembros de la clase como campos, propiedades, mtodos y eventos>
}
<modificador de acceso>: determina el nivel de acceso a la clase o miembro de clase como:
private, public, protected.
Ejemplo:
public class Persona
{
}
Herencia de clase
La herencia se realiza a travs de la derivacin, 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:
public class Empleado : Persona
{
}
www.afelipelc.mx
Pgina 11 de 77
Crear objetos
Un objeto es una entidad basada en una clase tambin denominada instancia de clase.
La sintaxis para crear un objeto es:
<nombre de la clase> <nombre del objeto> = new <nombre de la clase>();
Ejemplo:
Persona nuevapersona = new Persona();
Para
ms
informacin
y
ejemplos,
consulte
la
http://msdn.microsoft.com/es-es/library/x9afc042(v=VS.100).aspx
documentacin
oficial
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 numrico integrado o una instancia de otra clase.
o Constantes: Las constantes son campos o propiedades cuyo valor se establece en tiempo
de compilacin y no se puede cambiar.
o Propiedades: Las propiedades son mtodos de una clase a los que se obtiene acceso
como si fueran campos de esa clase. Una propiedad puede proporcionar proteccin a un
campo de clase con el fin de evitar que se cambie sin el conocimiento del objeto.
o Mtodos: Los mtodos definen las acciones que una clase puede realizar. Los mtodos
pueden aceptar parmetros que proporcionan datos de entrada y devolver datos de salida
a travs de parmetros. Los mtodos tambin pueden devolver un valor directamente, sin
utilizar ningn parmetro.
o Constructores: Los constructores son mtodos 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:
public class Persona
{
www.afelipelc.mx
Pgina 12 de 77
Propiedades
Una propiedad es un miembro que proporciona un mecanismo flexible a la lectura, escritura o
clculo el valor de un campo privado. Las propiedades pueden utilizarse como si fuesen miembros
de datos pblicos, aunque en realidad son mtodos 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 mtodos.
La sintaxis para definir una propiedad es:
<modificador de acceso> <tipo de dato> <nombre de la propiedad>
{
get { return <valor o campo a devolver>;}
set { <campo donde se almacenara el valor> = value;}
}
Dnde:
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:
public string Nombre
{
get { return nombre; }
set { this.nombre = value; }
}
public int Edad
{
get { return edad; }
set { this.edad = value; }
}
www.afelipelc.mx
Pgina 13 de 77
La imagen anterior muestra que al tratar un objeto puede accederse a todos sus miembros
pblicos, las propiedades se presentan con un icono que muestra una tarjeta sostenida por una
mano, los mtodos son representados por un rombo color rosa y cualquier otro objeto miembro de
la clase es representado con un rombo azul.
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.
Si al crear una nueva clase en c# no se define un constructor, c# crear uno de forma
predeterminada que permitir crear objetos de esta clase.
Sintaxis:
public <nombre de la clase>(parametro1 ,parametro2, , parmetron)
{
<operaciones con los parmetros>
}
Ejemplo:
public Persona()
{
}
public Persona(string Nombre, string Apellidos)
{
this.nombre = Nombre;
this.apellidos = Apellidos;
}
www.afelipelc.mx
Pgina 14 de 77
public Persona() {}
Al invocar a un constructor que toma argumentos, deben especificarse los valores al momento de
inicializar el objeto, visual studio nos muestra automticamente la sugerencia de los elementos de
la clase que pueden estar tratndose de invocar, donde nos muestra la estructura de los
elementos.
www.afelipelc.mx
Pgina 15 de 77
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, adems, pueden utilizarse como fuente de
datos para mostrarlos al usuario en forma de tabla o imprimirlos en un reporte.
En general, es recomendable utilizar colecciones genricas porque se obtiene la ventaja inmediata
de la seguridad de tipos sin necesidad de derivar de un tipo de coleccin base e implementar
www.afelipelc.mx
Pgina 16 de 77
En este ejemplo se crea un nuevo objeto de la clase persona, al cual se le asignan valores
a sus propiedades.
La instruccin listadepersonas.Add(nuevapersona); agrega el nuevo objeto creado a la
coleccin de objetos de la clase Persona.
2.- Agregar un nuevo objeto directamente a la coleccin.
listadepersonas.Add(
new Persona {
Nombre = "Juan",
Apellidos = "Prez Torres",
FechaNacimiento = DateTime.Parse("01/01/1990"),
Sexo = "Hombre",
Edad = 21,
EstadoCivil = "Soltero",
Calle = "Independencia",
www.afelipelc.mx
Pgina 17 de 77
En este ejemplo no se crea el objeto por separado, sino que se crea directamente dentro del
mtodo Add(), consulte la documentacin de la clase List<> donde encontrar como manipular
colecciones.
Crear un ejemplo donde se cargue una coleccin 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.
www.afelipelc.mx
Pgina 18 de 77
Genere el evento Click() del botn Nuevo que abrir la ventana donde el usuario deber
ingresar los datos de la nueva persona, el cdigo quedar as:
Genere el evento clic para el botn 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 vern 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
//despus pasarlo a la ventana para mostrar sus datos
www.afelipelc.mx
Pgina 19 de 77
Generar el evento Click() del botn Eliminar que al ser presionado, deber
eliminar de la lista el objeto seleccionado en el datagridview.
Implementar un mtodo privado que llene el objeto persona con los datos
ingresados por el usuario (ser invocado cuando el usuario haga clic en Aceptar ).
private void LlenarDatos()
{
//inicializar el objeto de la clase Persona
//si no se est editando.
if(persona==null)
persona = new Persona();
//asignar los valores de los controles a las
//propiedades del objeto
persona.Nombre = this.NombreTxt.Text;
persona.Apellidos = this.ApellidosTxt.Text;
persona.FechaNacimiento = this.FechaNacimientoDtp.Value;
persona.Calle = this.CalleTxt.Text;
persona.Estado = this.EstadoCmb.Text;
persona.Municipio = this.MunicipioCmb.Text;
if (this.SexoHombreRbtn.Checked)
persona.Sexo = "H";
if (this.SexoMujerRbtn.Checked)
persona.Sexo = "M";
}
Implementar el mtodo 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;
www.afelipelc.mx
Pgina 20 de 77
Crear un mtodo pblico que devuelva un valor que indique si el usuario presion el
botn Aceptar (true) o el botn Cancelar (false).
//campo que almacene el valor que indique si el usuario ingreso datos
private bool ingresodatos;
//Mtodo que devuelva el valor del campo ingresodatos
public bool IngresoDatos()
{
return ingresodatos;
}
Finalmente en esta misma ventana, genere el evento clic para el botn Aceptar
donde debe invocarse el mtodo que llena el objeto y cierre la ventana.
private void AceptarBtn_Click(object sender, EventArgs e)
{
LlenarDatos(); //invocar al metodo que llena el objeto
this.ingresodatos = true;
this.Close();
}
o
Ejecutamos nuestro ejemplo:
o Hacemos
clic
en
Nuevo,
ingresamos los datos de la nueva
persona, hacemos clic en aceptar y
vemos que nuestro registro ya se
encuentra en la lista, volvemos a
agregar nuevos registros.
o Seleccionamos un elemento de la
lista, hacemos clic en Editar y
vemos la ventana de datos donde
se muestran los datos a editar,
realizamos
y
aceptamos
los
cambios.
o Seleccionamos un elemento de la
lista y hacemos clic en Eliminar, el
objeto seleccionado se eliminar
automticamente sin poder volverse a
recuperar.
www.afelipelc.mx
Pgina 21 de 77
Realizar consultas sobre la coleccin 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");
2. Filtrar todos los clientes que sean activos:
LINQ: var ClientesActivos = from c in Clientes where c.Activo == "Si" select c;
Lambda: var ClientesActivos = Clientes.Where(c => c.Activo == "Si");
3. Todos los clientes del grupo B y que sean activos:
www.afelipelc.mx
Pgina 22 de 77
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 lnea
http://afelipelc.wordpress.com/2011/06/21/filtrar-elementos-de-una-coleccion-list-por-un-campoespecificado/
Qu debe documentarse?
Clases
De qu se encarga la clase?
Mtodos Propiedades
Qu hace un mtodo?, Cul es el uso esperado del mtodo?
Para qu se usa una variable o campo?
Qu podra mejorarse?
www.afelipelc.mx
Pgina 23 de 77
Ejemplo:
/// <summary>
/// Representa los datos generales de una persona.
/// </summary>
/// <remarks>
/// La clase Persona implementa las propiedades ms generales de una persona
/// como: nombre, apellidos, fecha de nacimiento, edad, estado civil, sexo,
/// domicilio, nmero, 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()
{
www.afelipelc.mx
Pgina 24 de 77
/// <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; }
www.afelipelc.mx
Pgina 25 de 77
www.afelipelc.mx
Pgina 26 de 77
Observamos que el control de usuario agregado al formulario es tratado como cualquier otro
control, pero conserva el diseo y tamao como fue creado.
Establecer el nuevo formulario como formulario de inicio, ejecutar el programa y probar la
funcionalidad.
www.afelipelc.mx
Pgina 27 de 77
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.
private void AceptarBtn_Click(object sender, EventArgs e)
{
MessageBox.Show("Hola " + NombreTxt.Text);
}
www.afelipelc.mx
Pgina 28 de 77
Al generar la solucin, 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.
Agregue otro proyecto de Windows Forms en la misma solucin.
Automticamente encontrar el control en el cuadro de herramientas, utilice el control en el
proyecto de prueba.
www.afelipelc.mx
Pgina 29 de 77
Se mostrar la lista de controles que contiene, seleccione los elementos a agregar y seleccione
Aceptar.
www.afelipelc.mx
Pgina 30 de 77
www.afelipelc.mx
Pgina 31 de 77
www.afelipelc.mx
Pgina 32 de 77
Configurar actualizaciones.
Finalizar el asistente.
www.afelipelc.mx
Pgina 33 de 77
www.afelipelc.mx
Pgina 34 de 77
De igual forma, cree la estructura para el men inicio (programas) del usuario.
www.afelipelc.mx
Pgina 35 de 77
www.afelipelc.mx
Pgina 36 de 77
www.afelipelc.mx
Pgina 37 de 77
Un sistema de software que fomente la solucin a las necesidades de una organizacin, esta
principalmente enfocada a la manipulacin y administracin de los datos.
www.afelipelc.mx
Pgina 38 de 77
Cree un proyecto de Windows Forms (C#) llamado EjemploDEM cuyo diseo sea similar al
formulario de la siguiente imagen, establezca el nombre del formulario a ListaAutosFrm.
El formulario incluye:
1 DataGridView llamado ListaDtg: Mostrar la lista de autos cargada desde la BD.
1 Etiqueta - Label (con el texto Mostrar por marca).
1 ComboBox llamado PorMarcaCmb: Permitir al usuario mostrar solo los autos de la
marca seleccionada, la lista de marcas se cargar de forma predeterminada desde la BD.
1 Button llamado NuevoBtn con el texto Nuevo: Mostrar la ventana para dar de alta un
nuevo auto.
1 Button llamado EliminarBtn con el texto Elimina: Eliminara el auto seleccionado.
1 Button llamado CerrarBtn con el texto Cerrar: terminar la aplicacin.
Agregue otro nuevo formulario llamado DatosAutoFrm cuyo diseo ser similar a:
www.afelipelc.mx
Pgina 39 de 77
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 Nmero de serie, Marca,
Modelo y Color.
o 1 TextBox llamado NumeroSerieTxt donde se ingresar el nmero 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 cargarn los datos del
propietario si este ya est registrado en la BD.
o 1 TextBox llamado ApellidosTxt donde se ingresarn 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 tamao actual del formulario establzcalo como tamao mnimo (MinimunSize) y tamao
mximo (MaximunSize), establezca el botn predeterminado para aceptar el botn AceptarBtn
(AcceptButton) y el botn predeterminado para cancelar el botn CancelarBtn (CancelButton).
www.afelipelc.mx
Pgina 40 de 77
www.afelipelc.mx
Pgina 41 de 77
Establezca la clave primaria para cada tabla, si se necesita crear un campo de tipo entero como
auto incremento, seleccione el campo, en la ventana Propiedades de columna expanda el nodo
Especificacin de identidad y cambie a S en Identidad, se autodefinir el auto incremento en 1.
www.afelipelc.mx
Pgina 42 de 77
www.afelipelc.mx
Pgina 43 de 77
Cree tambin la relacin hacia la tabla Propietario y guarde todos los cambios realizados.
www.afelipelc.mx
Pgina 44 de 77
www.afelipelc.mx
Pgina 45 de 77
Haga clic en siguiente y seleccione los elementos de la base de datos que desea incluir en el
modelo (pueden incluirse tablas, vistas y procedimientos almacenados).
www.afelipelc.mx
Pgina 46 de 77
Como ver, el modelo contiene los elementos de la base de datos seleccionados en el asistente,
las relaciones son reflejadas tal y como se definieron en el modelo relacional.
Al crearse el modelo, automticamente agrega elementos como Propiedades de navegacin que
representan a los objetos a los cuales se tiene relacin.
Ejemplo:
La entidad Auto tiene las propiedades de navegacin 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
travs de la propiedad de navegacin Marca.
Supongamos que, se tiene el objeto llamado unauto y quiere saberse cul es el nombre de su
marca, para ello se invoca:
unauto.Marca.Nombre;
De igual forma si se quiere saber cul 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
estn relacionados.
De esta forma se estn utilizando las propiedades de navegacin; para relacionar dos objetos a
travs de una propiedad de navegacin.
Supongamos que tenemos el objeto unauto y unamarca y queremos relacionarlos, la relacin se
realizara de esta forma:
unauto.Marca = unamarca;
O almacenando el valor de la clave primaria en el campo correspondiente:
unauto.IdMarca = unamarca.IdMarca;
www.afelipelc.mx
Pgina 47 de 77
www.afelipelc.mx
Pgina 48 de 77
Creamos un mtodo llamado CargarLista() cuya funcin sea cargar la lista de autos a nuestro
datagridview cada vez que sea invocado.
private void CargarLista()
{
//sincronizar nuestro modelo de datos cargado en memoria
//con la base de datos volviendo a inicializar el objeto
BD = new BaseDatosEntities();
//limpiar la fuente de datos del datagridview
this.ListaDtg.DataSource = null;
//cargar todos los registros de la tabla Auto a nuestro datagridview
//utilizando nuestro objeto conexin
this.ListaDtg.DataSource = BD.Auto;
}
www.afelipelc.mx
Pgina 49 de 77
Como resultado observamos que nos carga todas las propiedades de la entidad Auto incluyendo
las propiedades de navegacin que muestran el nombre del objeto relacionado.
Para cargar solo los datos: Nmero de serie, Nombre de la Marca, Modelo, Color, Nombre del
propietario necesitamos trabajar con tipos annimos vistos en LINQ. Modificaremos nuestro
mtodo CargarLista() que quedar as:
private void CargarLista()
{
//sincronizar nuestro modelo de datos cargado en memoria
//con la base de datos volviendo a inicializar el objeto
BD = new BaseDatosEntities();
//limpiar la fuente de datos del datagridview
this.ListaDtg.DataSource = null;
//cargar todos los registros de la tabla Auto a nuestro datagrid
//utilizando nuestro objeto conexin
this.ListaDtg.DataSource = BD.Auto.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()
});
}
www.afelipelc.mx
Pgina 50 de 77
Ahora procedemos a programar el botn Nuevo para que el usuario pueda crear un nuevo
registro.
Para ello generamos el evento Clic que quedara as:
private void NuevoBtn_Click(object sender, EventArgs e)
{
//crear instancia de la ventana de datos a mostrar
DatosAutoFrm ventanadatos = new DatosAutoFrm();
ventanadatos.ShowDialog();
//volver a cargar la lista en el data grid
CargarLista();
}
www.afelipelc.mx
Pgina 51 de 77
Implementar el mtodo que cargue los datos del objeto en los controles del formulario.
//mtodo que cargue los datos del objeto a los controles
private void CargarDatos()
{
//recuperar el objeto desde la base de datos
//cuyo nmero de serie sea el que el usuario selecciono.
auto = BD.Auto.Where(a => a.NoSerie == idauto).FirstOrDefault();
//comprobar que el objeto devuelto no sea nulo
if(auto != null)
{
//cargar los datos del objeto a los controles
this.NumeroSerieTxt.Text = auto.NoSerie;
this.MarcaCmb.Text = auto.Marca.Nombre;
this.ColorTxt.Text = auto.Color;
this.ModeloTxt.Text = auto.Modelo.ToString();
this.NombreCmb.Text = auto.Propietario.Nombre;
this.ApellidosTxt.Text = auto.Propietario.Apellidos;
this.EdadTxt.Text = auto.Propietario.Edad.ToString();
}
}
Implementar un mtodo que cargue los datos de los controles al objeto y guarde o actualice el
registro en la base de datos.
private void LlenarObjeto()
{
//si el objeto auto es nulo, es porque se est creando un nuevo registro
if (auto == null)
www.afelipelc.mx
Pgina 52 de 77
www.afelipelc.mx
Pgina 53 de 77
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
www.afelipelc.mx
Pgina 54 de 77
www.afelipelc.mx
Pgina 55 de 77
www.afelipelc.mx
Pgina 56 de 77
www.afelipelc.mx
Pgina 57 de 77
www.afelipelc.mx
Pgina 58 de 77
Durante la interaccin con la aplicacin, el usuario elige guardar la informacin para continuar con
su labor.
www.afelipelc.mx
Pgina 59 de 77
Sin importar como el sistema almacena, organiza y procesa la informacin para generar el
resultado final, lo que quiere el usuario es visualizar la informacin lista para ser impresa o
guardada como documento.
www.afelipelc.mx
Pgina 60 de 77
www.afelipelc.mx
Pgina 61 de 77
www.afelipelc.mx
Pgina 62 de 77
www.afelipelc.mx
Pgina 63 de 77
www.afelipelc.mx
Pgina 64 de 77
Ya con la vista y el procedimiento almacenado en nuestro modelo, guarde los cambios y cierre el
modelo, ahora procedemos a disear nuestros informes.
Crear formulario donde se mostrar el informe.
Agregue un nuevo formulario llamado InformeFrm al cual debe agregar el control ReportViewer.
www.afelipelc.mx
Pgina 65 de 77
www.afelipelc.mx
Pgina 66 de 77
www.afelipelc.mx
Pgina 67 de 77
Agregue una nueva tabla al diseo del informe, arrastre los campos de Datos informe a las
columnas de la tabla.
Puede agregar encabezado y pi de pgina para el informe, agregar ttulo, y campos especiales
en el informe.
Guarde los cambios en el diseo y cierre el diseo del informe.
Vuelva al formulario que contiene el ReportViewer y asigne el informe creado.
www.afelipelc.mx
Pgina 68 de 77
En nuestra clase ListaAutosFrm, debemos crear un campo que almacene un objeto de la clase
InformeFrm (Formulario que mostrar el informe)
public partial class ListaAutosFrm : Form
{
BaseDatosEntities BD = new BaseDatosEntities();
private InformeFrm informe = new InformeFrm();
Modificar nuestro mtodo llamado CargarLista() para que deje de utilizar tipos annimos y ahora
utilice nuestra vista vAuto y la misma vista llene el informe.
www.afelipelc.mx
Pgina 69 de 77
Modificar tambin el cdigo de nuestro combobox, pero este debe cargar la lista de autos
correspondientes a la marca seleccionada con los resultados del procedimiento almacenado.
private void PorMarcaCmb_SelectedValueChanged(object sender, EventArgs e)
{
if (datoscargados)
{
if(this.PorMarcaCmb.Text.Trim() == "Todas")
{
CargarLista();
}
else
{
this.ListaDtg.DataSource = null;
//cargar la lista de los autos de la marca seleccionada
//invocando al procedimiento almacenado
this.ListaDtg.DataSource = BD.SPAutos(this.PorMarcaCmb.Text.Trim());
//limpiar los datos del informe
this.informe.vAutoBindingSource.DataSource = null;
//cargar tambien la lista al informe
this.informe.vAutoBindingSource.DataSource =
BD.SPAutos(this.PorMarcaCmb.Text.Trim()).ToList();
}
}
}
Los resultados del SP son pasados tambin al informe ya que los campos devueltos por la vista y
el sp son los mismos, de lo contrario se tendra un error.
Ahora solo nos falta programar el botn ImprimirBtn para que muestre el reporte.
private void ImprimirBtn_Click(object sender, EventArgs e)
{
informe.ShowDialog();
}
www.afelipelc.mx
Pgina 70 de 77
Roles y usuarios
Roles
Los roles estn diseados 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 relacin 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.
Por ejemplo; Roles llamados:
Administrador: Tiene acceso a todas las operaciones del sistema.
Consultas: Solo tiene permiso para consultar informacin y generar reportes.
Captura: Solo tiene permisos para registrar Altas y Editar.
A continuacin se presenta una tabla de ejemplo donde se especifican con ms detalles los
permisos de cada rol.
www.afelipelc.mx
Consultas
Pgina 71 de 77
X
X
X
X
X
Usuarios
Los usuarios se identifican con un nombre y una contrasea para tener acceso a una aplicacin.
A los usuarios se les asignan roles dentro del sistema.
A continuacin se presenta una tabla de ejemplo donde se especifican con ms detalles los roles
de cada usuario.
Roles / Usuarios
Pepe
Pedro
Captura
Consultas
Administrador
Pablito
Petra
X
X
www.afelipelc.mx
Pgina 72 de 77
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.
www.afelipelc.mx
Pgina 73 de 77
Genere el evento clic para el botn Aceptar donde se comprobaran los datos ingresados por el
usuario con los almacenados en la base de datos, si son vlidos, se crear la sesin y se asociara
el usuario con el proceso (aplicacin).
private void AceptarBtn_Click(object sender, EventArgs e)
{
//recuperar el objeto desde la bd que contenga los datos
//proporcionados por el usuario
var datosusuario = BD.Usuario.Where(u =>
u.NombreUsuario.Trim() == this.NombreUsuarioTxt.Text &&
u.Password.Trim() == this.PasswordTxt.Text).FirstOrDefault();
//comprobar si el objeto recuperado es diferente de nulo
if (datosusuario != null)
{
//Si se agregara un campo Activo en la tabla Usuario
//aqui podria validarse para dar o no acceso al usuario
www.afelipelc.mx
Pgina 74 de 77
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:
private void ListaAutosFrm_Load(object sender, EventArgs e)
{
//Comprobar si el Rol del usuario NO es Administrador
//no permitir el acceso y cerrar la aplicacion.
if (!Thread.CurrentPrincipal.IsInRole("Administrador"))
{
www.afelipelc.mx
Pgina 75 de 77
Establezca el formulario LoginFrm como formulario de inicio del proyecto, para eso, en el
explorador de soluciones abra el archivo Program.cs y cambie la clase de inicio en el mtodo
Main().
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LoginFrm());
}
Ejecute la aplicacin e intente acceder con ambos usuarios creados, uno con Rol de
Administrador y otro con Rol de Invitado.
www.afelipelc.mx
Pgina 76 de 77
Conclusin
Este documento que he elaborado ha sido la base para que los estudiantes a quienes he
impartido estos temas vayan adentrndose al a veces complejo mundo de la programacin,
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 ms que agregar, considero que este documento ayude a ms estudiantes en su aprendizaje.
Alfonso Felipe Lima Corts
www.afelipelc.mx
@afelipelc
www.afelipelc.mx
Pgina 77 de 77