Está en la página 1de 32

Taller de Desarrollo de Aplicacion Windows y Web con C#

Taller de Desarrollo de Aplicacion Windows y Web con C# Prof. Jorge Luis Hernández Cervantes Victoria,

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

1

Microsoft Visual Studio es un entorno de desarrollo integrado (IDE, por sus siglas en inglés)

Microsoft Visual Studio es un entorno de desarrollo integrado (IDE, por sus siglas en inglés) para sistemas operativos Windows. Soporta varios lenguajes de programación tales como Visual C++, Visual C#, Visual J#, y Visual Basic .NET, al igual que entornos de desarrollo web como ASP.NET. Aunque actualmente se han desarrollado las extensiones necesarias para muchos otros.

Visual Studio permite a los desarrolladores crear aplicaciones, sitios y aplicaciones web, así como servicios web en cualquier entorno que soporte la plataforma .NET (a partir de la versión .NET 2002). Así se pueden crear aplicaciones que se intercomuniquen entre estaciones de trabajo, páginas web y dispositivos móviles.

Visual Studio 2008

Visual Studio 2008 fue publicado (RTM) el 17 de noviembre de 2007 en inglés,

mientras que la versión en castellano no fue publicada hasta el 2 de febrero de

2008.3

El nuevo framework (.NET 3.5) está diseñado para aprovechar las ventajas que

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

2

ofrece el nuevo sistema operativo Windows Vista a través de sus subsistemas Windows Communication Foundation (WCF) y Windows Presentation Foundation (WPF). El primero tiene como objetivo la construcción de aplicaciones orientadas a servicios, mientras que el último apunta a la creación de interfaces (qué son las interfaces) de usuario más dinámicas que las conocidas hasta el momento.4

A las mejoras de desempeño, escalabilidad (qué es) y seguridad con respecto a la versión anterior, se agregan, entre otras, las siguientes novedades:

La mejora en las capacidades de pruebas unitarias permiten ejecutarlas más rápido independientemente de si lo hacen en el entorno IDE o desde la línea de comandos. Se incluye además un nuevo soporte para diagnosticar y optimizar el sistema a través de las herramientas de pruebas de Visual Studio. Con ellas se podrán ejecutar perfiles durante las pruebas para que ejecuten cargas, prueben procedimientos contra un sistema y registren su comportamiento, y utilizar herramientas integradas para depurar y optimizar.

Visual Studio 2008 permite incorporar características del nuevo Windows Presentation Foundation sin dificultad tanto en los formularios de Windows existentes como en los nuevos. Ahora es posible actualizar el estilo visual de las aplicaciones al de Windows Vista debido a las mejoras en Microsoft Foundation Class Library (MFC) y Visual C++. Visual Studio 2008 permite mejorar la interoperabilidad entre código nativo y código manejado por .NET. Esta integración más profunda simplificará el trabajo de diseño y codificación.

LINQ (Language Integrated Query) es un nuevo conjunto de herramientas diseñado para reducir la complejidad del acceso a bases de datos a través de extensiones para C++ y Visual Basic, así como para Microsoft .NET Framework. Permite filtrar, enumerar, y crear proyecciones de muchos tipos y colecciones de datos utilizando todas las mismas sintaxis, prescindiendo del uso de lenguajes especializados.

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

3

Visual Studio 2008 ahora permite la creación de soluciones multiplataforma adaptadas para funcionar con las diferentes versiones de .NET Framework: 2.0 (incluido con Visual Studio 2005), 3.0 (incluido en Windows Vista) y 3.5 (incluido con Visual Studio 2008). .NET Framework 3.5 incluye la biblioteca ASP.NET AJAX para desarrollar aplicaciones web más eficientes, interactivas y altamente personalizadas que funcionen para todos los navegadores más populares y utilicen las últimas tecnologías y herramientas Web, incluyendo Silverlight y Popfly.

C#

C# (pronunciado si sharp en inglés) es un lenguaje de programación orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET, que después fue aprobado como un estándar por la ECMA (ECMA-334) e ISO (ISO/IEC 23270). C# es uno de los lenguajes de programación diseñados para la infraestructura de lenguaje común.

Su sintaxis básica deriva de C/C++ y utiliza el modelo de objetos de la plataforma .NET, similar al de Java, aunque incluye mejoras derivadas de otros lenguajes.

El nombre C Sharp fue inspirado por la notación musical, donde '#' (sostenido, en inglés sharp) indica que la nota (C es la nota do en inglés) es un semitono más alta, sugiriendo que C# es superior a C/C++. Además, el signo '#' se compone de cuatro signos '+' pegados.1

Aunque C# forma parte de la plataforma .NET, ésta es una API, mientras que C# es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un compilador implementado que provee el marco Mono - DotGNU, el cual genera programas para distintas plataformas como Windows, Unix, Android, iOS, Windows Phone, Mac OS y GNU/Linux.

4

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

Entorno de Visual Studio 2008 (IDE)

Entorno de Visual Studio 2008 (IDE) Una vez abierto el visual studio se crea un nuevo

Una vez abierto el visual studio se crea un nuevo proyecto en Archivo -> Nuevo Proyecto y aparecerá la siguiente ventana:

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

5

En ella se elige del lado izquierdo un proyecto de tipo Visual C#, mientras que

En ella se elige del lado izquierdo un proyecto de tipo Visual C#, mientras que de lado derecho se considera una aplicación de Windows Forms, en la parte inferior se pondrá el nombre de la aplicación y posteriormente dar clic en aceptar. De manera general la siguiente imagen muestra algunas de las partes de visual studio

imagen muestra algunas de las partes de visual studio Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato,

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

6

Visual studio puede ser instalado en los siguientes sistemas operativos que cuenten con las características mínimas:

- Windows XP Service Pack 2 o posterior

- Windows Server 2003 Service Pack 1 o posterior

- Windows Server 2003 R2 o posterior

- Windows Vista

- Windows Server 2008

Requerimientos de hardware:

- Mínimo: 1.6 GHz CPU, 384 MB RAM, resolución de 1024x768, disco duro a 5400 RPM - Recomendado: 2.2 GHz o superior, 1024 MB o más de RAM, resolución de 1280x1024, disco duro de 7200 RPM o más.

- En Windows Vista: 2.4 GHz CPU, 768 MB RAM.

Primer programa

Se propone el diseño de una nueva solución en el visual estudio, se inicia con la selección del tipo de proyecto, en este caso; seleccionar de tipo Visual C#, y del lado derecho del tipo Aplicación de Windows Forms, agregar un nombre para la solución electa y dar clic en aceptar.

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

7

Una vez que visual estudio, ha creado la solución, en la nueva forma que lo

Una vez que visual estudio, ha creado la solución, en la nueva forma que lo ha hecho, agregar dos cajas de texto, a las cuales se les denominará usr, en la cual el usuario ingresará su nombre, cambiar a la segunda caja de texto por el de pwd, en esta caja de texto es donde el usuario ingresará su password. También agregar dos labelsa los cuales, se les cambia el texto que muestran, a una le poner el texto usuarioy a la segunda el texto password, una vez hecho esto agregar dos botones, al primer botón cambiar el texto por aceptar”. Al segundo botón también modificar el nombre y el texto y estos serán cancelaren ambos casos, de tal suerte que el formsea como el que a continuación se muestra:

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

8

Antes de comenzar, con la programación de los botones, se necesitará cambiar algunas propiedades de

Antes de comenzar, con la programación de los botones, se necesitará cambiar algunas propiedades de la forma, primero dar clic en “la forma” e ir a sus propiedades y hacer los siguientes cambios en sus propiedades:

ControlBox: False, apagando esta control quitará de la ventana de minimizar, maximizar y cerrar ShowIcon: False, apagando este control eliminará el ícono de la parte superior izquierda de la ventana StartPosition: CenterScreen, inicializará la ventana centrada en la pantalla Text: Control de Acceso, pondrá este texto como título de la ventana. Dar clic en la caja de texto correspondiente al password e ir a sus propiedades buscando la opción passwordchard y poner el carácter que se desee desplegar cuando se introduzca el password. Después dar doble clic sobre la forma para que se cree el evento load de la forma y aquí pegar el siguiente código:

this.AcceptButton = Aceptar; //hace que el botón Aceptar el botón default para que se ejecute en cuanto se presione enter.

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

9

this.CancelButton = Cancelar; //ejecutará el código del botón aceptar en caso de que presionar el botón de escape this.Aceptar.Enabled = false; //Deshabilita el botón de guardar, hasta que el usuario ingrese datos necesarios

usr.Focus();//envía al foco hacia la caja de usr

Una vez hecho esto, moverse hacia la parte superior del código hasta en donde se

declaran las librerías y agregar la siguiente línea:

Using System.Data.OleDb;

El código deberá verse como en la siguiente imagen:

El código deberá verse como en la siguiente imagen: Esta librería permitirá el acceso hacia la

Esta librería permitirá el acceso hacia la base de datos.

Regresar a la vista diseño y dar doble clic sobre el botón de cancelar para que se

traslade hacia el evento clic del botón en donde Application.Exit();

El cual permitirá que al momento de presionar se cerrará por completo la aplicación.

Regresar a la vista diseño de la forma en donde se debe presionar con doble clic

sobre el la caja de texto pwd, esto; permite llegar al evento TextChanged en donde

se pegará el siguiente código Aceptar.Enabled = true;

Este código habilitaría el botón de aceptar

Adjuntar también a dicha solución el archivo funciones. cs que también se incluyen

en este manual.

Para adjuntar el archivo a la solución, copiar el archivo a la carpeta raíz de la

solución, como en la siguiente imagen:

se pegará el siguiente código:

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

10

Después en visual estudio en el explorador de soluciones presionar el icono de "mostrar todos

Después en visual estudio en el explorador de soluciones presionar el icono de "mostrar todos los archivos" esto mostrará todos los archivos contenidos en esta carpeta, situarse sobre el icono de funciones .cs y presionar clic derecho y Luego dar clic en la opción "incluir en el proyecto", como se muestra en la siguiente imagen

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

11

De este punto en adelante utilizar la base de datos Curso la cual se adjunta con este

manual, la que se tendrá que adjuntar al sqlserver.

Una vez adjuntada la base de datos volver a la vista de diseñador en el visual

estudio y dar doble clic en el botón guardar y pegar el siguiente código:

OleDbDataReader DR; //crea un data Reader llamada DR String query; //se declara una variable de nombre query en donde se almacena temporalmente las consultas a la base

en donde se almacena temporalmente las consultas a la base Prof. Jorge Luis Hernández Cervantes Victoria,

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

12

de datos, antes de ejecutarlos query="";

esté vacía

fn.Cn = new OleDbConnection("Provider=SQLOLEDB;User id=sa;Password=hola;Initial Catalog=Curso;Data Source=DESKTOP\\SQLEXPRESS;"); //Esta es la cadena de conexión hacia el SQLServer, en el cual se declara el tipo de proveedor, nombre de usuario, password, nombre de la base de datos, y el nombre del servidor fn.Cn.Open();//abrimos la conexión query="Select NomUsuario From usuario where UsuarioPK='" + usr.Text + "' and Password='" + pwd.Text +"'";// Se carga el query con los nombres de usuario y password para verificar que existan OleDbCommand comando = new OleDbCommand(query, fn.Cn);//ejecutamos el query DR = comando.ExecuteReader();//vacir el contenido de la ejecución del query en el datareader if(DR.Read()){//condicionar, si el datareader tiene datos entonces el usuario existe de lo contrario ejecutará el código del else

/ Asegurarse que la variable

label3.Text="";

label3.Text="Bienvenido :" +

DR["NomUsuario"];

fn.Conectado = true;//cierra la conexión hacia la base de datos this.Close();//esta línea de código cerrará la aplicación. Pues el usuario especificado ha sido encontrado y deberá mostrar la ventana principal de la aplicación. }else{//este fragmento de código se ejecutará,

13

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

si, no se encuentra el usuario especificado en la base de datos label3.Text="Usuario o Contraseña"; pwd.Text=""; pwd.Focus(); fn.Cn.Close();//cierra la conexión hacia la

base de datos

}//fin de botón guardar

De tal manera que al terminar la pantalla deberá de verse como en la siguiente presentación:

deberá de verse como en la siguiente presentación: Una vez terminado el botón guardar, agregar 4

Una vez terminado el botón guardar, agregar 4 ventanas más, a las cuales se les

denominará:

1.- Menú

2.- Niveles

3.- Eventos

4.- Eventos2 Antes de continuar con este ejemplo, se necesitará abrir el archivo program.cs y

agregar el siguiente código:

if (fn.Conectado == true)

14

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

Application.Run(new Menu());

Dentro de la siguiente función

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1());

}

De manera que el código quede de como el que a continuación se muestra

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); if (fn.Conectado == true)//En este if evalúa si la conexión hacia la base de datos está activa y si lo está lanzará la ventana menu

Application.Run(new Menú());

}

Una vez realizado esto la primera forma que se ha agregado (menú), se convierte

en una ventana del tipo MDI (Multiple Document Interface, o interface de múltiples

documentos), para hacer esto posible cambiar la propiedad isMdiContainer a true,

como se muestra en las siguientes imágenes.

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

15

Después de cambiar la propiedad de la forma, esperar los cambios, el más notable es

Después de cambiar la propiedad de la forma, esperar los cambios, el más notable es el cambio de color del fondo.

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

16

Es necesario resaltar que en cada proyecto solo se podrá disponer de una sola ventana

Es necesario resaltar que en cada proyecto solo se podrá disponer de una sola ventana del tipo MDI, en esta forma agregar un menú utilizando la herramienta menuStrip, presionando doble clic sobre la herramienta, se arrastra hacia la forma y agregar las siguientes opciones, como en la imagen que se muestra a continuación:

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

17

Lo primero que se prog rama es la última opción “salir” pres ionando doble clic

Lo primero que se programa es la última opción “salir” presionando doble clic

encima de la palabra lo cual llevará al evento y agregar el siguiente código:

fn.Cn.Close();//cierra la conexión con la base de

datos

this.Close();//cierra la aplicación

Ahora al programar la opción Eventos 2, hacer doble clic en la palabra así como en

la opción anterior:

vEventos2 frmEventos = new vEventos2(); frmEventos.MdiParent = this; frmEventos.Show();

Con el código de la primera línea, se crea una variable llamada frmEventos del tipo

vEventos2 que es la forma eventos 2 que se agregó anteriormente, la segunda línea

configura a la variable frmEventos como una ventana hija de Menú, esta propiedad

permite que cuando esta ventana sea lanzada, se pueda interactuar con las otras

ventanas de la solución las cuales estarán disponibles, la última línea lanza la

ventana Eventos 2.

Para la opción de eventos, volver a la vista diseño y dar doble clic sobre la opción

Eventos y pegar el siguiente código:

//ventana MDI child vEventos fdmeventos = new vEventos(); fdmeventos.MdiParent = this;

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

18

fdmeventos.Show();

Para la opción niveles, volver a la vista diseño y sobre la opción del menú niveles pegar el siguiente código:

//ventana SDI-> este tipo de ventana no permite interactuar con otras ventanas abiertas vNiveles frmNiveles = new vNiveles(); frmNiveles.ShowDialog();

Se procede a la programación de la venta de Niveles la cual contendrá los niveles de la aplicación, esta ventana tiene la particularidad de ser de tipo SDI, lo cual quiere decir que no se podrá interactuar con otras ventanas de la aplicación, mientras esta ventana se encuentre abierta, este tipo de ventanas se podrán localizar cuando se está en una pantalla de impresión o en una de preferencias entre otras. Abrir la forma de niveles, a la cual se agrega un DataGridView, y un botón de tal suerte que la forma quede como la que se muestra a continuación:

que la forma quede como la que se muestra a continuación: Lo primero que se hará

Lo primero que se hará es:

Agregar la librería de acceso a base de datos.

using System.Data.OleDb;

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

19

Un poco más abajo en la sección public partial class vNiveles : Form

declarar la siguientes variables

//declarar una variable adaptador OleDbDataAdapter adaptador; //agregar instancia al dataset DataSet Ds = new DataSet();

Después en la vista diseño dar doble clic en la forma para llamar el evento load de la misma y agregamos el siguiente código:

String query; //Deshabilitar el botón guardar Guardar.Enabled = false; //mandar dos parámetros al adaptador query y la conexión a la base

de datos

 

query = ""; query = "Select idNivel, DescNivel as 'Nombre del Nivel' from

Nivel";

 

adaptador = new OleDbDataAdapter(query, fn.Cn); //El query se ejecutará al momento de llenar el DataSet //al adaptador se le envían dos parámetros, el DataSet y un nombre

logico

 

adaptador.Fill(Ds, "xNiveles"); //vaciamos el contenido del dataset en el dataGridView dataGridView1.DataSource = Ds.Tables["xNiveles"]; //Ocultar la primera columna, que es en donde se muestra el ID dataGridView1.Columns[0].Visible = false; //Redimensionar la segunda columna para una mejor visualización

de los datos

dataGridView1.Columns[1].Width = 250;

Lo siguiente es programar un botón de guardar, regresar a la vista diseño de la forma y dar doble clic en el botón de guardar y pegar el siguiente código:

//crear un oledbcomanbuilder OleDbCommandBuilder cb = new OleDbCommandBuilder(adaptador); //el OleDbComandBuilder, creará automáticamente todos query

necesarios

//si hay una modificación crea el update, si hay una alta crea el insert y así sucesivamente //con este comando manda ejecutar todos los comandos SQL generados por el dataGridView adaptador.Update(Ds,"xNiveles"); //Cambia el status a los registros del dataset para que sean tomados como que los datos han sido tomados y deshabilita el botón de guardar Ds.Tables["xNiveles"].AcceptChanges(); Guardar.Enabled = false;

Ahora habilitar el botón de guardar pero únicamente si hay cambios que guardar, para saber si hay cambios, se necesita el evento KeyUp, de la forma principal, entonces; volver a la vista diseño y dar clic sobre ella, después ir a la caja de

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

20

propiedades y buscar KeyPreview, ponerlo en true, después en la parte superior se encuentra el ícono de un rayo el cual se presiona para que despliegue los eventos de dicho objeto, buscar el evento KeyUp, y dar doble una vez hecho esto, pegar el siguiente código:

//para que este evento funciones hay que poner el evento keypreview en true en las propiedades de la ventana if (Ds.HasChanges())//si el data set tiene cambios habilitará el botón de guarda y de no ser así lo deshabilitará Guardar.Enabled = true;

else

Guardar.Enabled = false;

Una vez hecho realizado, la ventana deberá de verse así:

; Una vez hecho realizado, la ventana deberá de verse así: En esta ventana no se

En esta ventana no se podrá dar clic en otra parte de la aplicación para hacer otras modificaciones.

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

21

Ahora, programar la opción Eventos, para ello, dar doble clic sobre la palabra

eventos del menú, en el evento que se crea, pegar el siguiente código:

vEventos fdmeventos = new vEventos(); fdmeventos.MdiParent = this; fdmeventos.Show();

Este código es igual que el del evento anterior, pero la diferencia entre esta y la

ventana anterior se hace a continuación. Abrir la forma eventos y agregar un

dataGridView, y un botón la ventana, será como la siguiente:

y un botón la ventana, será como la siguiente: Al botón que se agregó, cambiar el

Al botón que se agregó, cambiar el nombre por el de guardar, así como el texto.

Cambiar al código de la ventana y agregar la siguiente línea de código que es la

librería de acceso a datos, tal y como se hizo al inicio del proyecto:

using System.Data.OleDb;

Un poco más abajo en el código buscar el evento:

public partial class vEventos : Form

Y agregar el siguiente código:

OleDbDataAdapter adapNiv; OleDbDataAdapter adapEven; DataSet DS = new DataSet();

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

22

En donde se declaran dos OleDbDataAdaptar y un data set que se utilizarán a

continuación. Una vez hecho esto, volver a la vista diseño y presionar dando doble

click sobre la forma para llamar al evento load de esta forma, y pegar el siguiente

código:

string query;//declarar una variable query para almacenar las consultas a la base de datos temporalmente query = "Select idNivel, DescNivel From Nivel Order by DescNivel";//llamar el id y el nombre de los niveles de la tabla nivel

adapNiv = new OleDbDataAdapter(query, fn.Cn);//ejecutar el query y se guardan en un adaptador query = "Select idEvento, DescEvento as 'Nombre del Evento', Precio , Duracion, idNivel from Evento";//Pedir a sql, el id del evento, descripción enmascarándolo como Nombre del evento, precio, duración y el id nivel de la tabla evento adapEven = new OleDbDataAdapter(query, fn.Cn);//ejecutar el query y lo guardar en un adaptador adapEven.Fill(DS, "xEventos");//pasamos el contenido de adapEven(info. de los eventos) al data set y llamarlo xEventos

adapNiv.Fill(DS, "xNiveles");//pasar el contenido de adapNiv(info de los niveles) al data set y nombrarlo xNiveles DS.Relations.Add("xRel", DS.Tables["xNiveles"].Columns["idNivel"],DS.Tables["xEventos" ].Columns["idNivel"]);//esta línea es la más compleja ya que xRel (relacionamos) dos columnas de nuestra consultas, si notamos ambos Eventos y Niveles, comparten el campo idNiveles, y aquí se relacionan en el data set DataGridViewComboBoxColumn idNivel = new DataGridViewComboBoxColumn();//declarar una variable del tipo ComboBox, este ComboBox, es parte de nuestro datagrid idNivel.DisplayMember = "DescNivel";//esto es el texto que mostrará el combobox idNivel.ValueMember = "idNivel";//este es el id que no mostrará el combo box idNivel.DataPropertyName = "IdNivel";//el nombre

del ComboBox

idNivel.DataSource = DS.Tables["xNiveles"];//de donde vienen los datos para nuestro combobox dataGridView1.DataSource = DS.Tables["xEventos"];//llenar el datagridview con los datos de xEventos

dataGridView1.Columns.Add(idNivel);//agregar una columna al datagridview, esta columna nueva estará el combobox

23

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

dataGridView1.Columns[0].Visible = false;//ocultar la primera columna ya que aquí está el id, y esta info, el usuario no tiene razón de verla dataGridView1.Columns[4].Visible = false;//ocultar la columna ya que aquí está el id, y esta info, el usuario no tiene razón de verla dataGridView1.Columns[1].Width = 300; //ensanchar esta columna para una mejor visualización de la información Guardar.Enabled = false;//desactivar el botón guardar ya que al momento de hacer la primera no hay cambios que guardar

Una vez terminado el código de esta ventana ejecutar el proyecto y la ventana

aparecerá de la siguiente manera:

el proyecto y la ventana aparecerá de la siguiente manera: En donde se podrá apreciar la

En donde se podrá apreciar la forma en que el datagridview, enlazó los datos con

el catálogo de niveles, ahora se debe validar que cuando el usuario introduzca un

valor en la columna de precio, éste sea realmente un número y no un carácter

distinto, para hacer esto, ir a la vista diseño y dar clic sobre el datagridview, después

dirigirse hacia la caja de propiedades, y en la parte superior ubicar el ícono de un

pequeño rayo, dar clic para que se despliegue los eventos disponibles de este

objeto, buscar el evento CellValidating, y dar doble clic, ello conducirá al código de

este evento, es en esta parte donde se pega el siguiente código:

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

24

dataGridView1.Rows[e.RowIndex].ErrorText = "";//limpia todos

los mensajes de error del datagridview float nuevoPrecio; //declara una variable de tipo float para hacer la validación más adelante if (dataGridView1.Rows[e.RowIndex].IsNewRow)//revisa si es un renglón nuevo, y si lo es no valida nada return;//sale de la validación if (e.ColumnIndex == 2)//si se modifica la columna del valor

{

if (!float.TryParse(e.FormattedValue.ToString(), out nuevoPrecio))//revisa si es numérico en caso de no serlo mostrará el //mensaje de error

{

e.Cancel = true;//impide que se cambie a otra celda dataGridView1.Rows[e.RowIndex].ErrorText="Error el precio deve de ser numero y positivo";

}

}

Aún cuando se h agregado el código anterior, la validación no está completa, para que lo esté, se necesita regresar a la vista diseño del proyecto y dar clic en la forma y nuevamente buscar el ícono del rayo, en la caja de propiedades, y dar doble clic en el evento KeyUp, y pegar el siguiente código:

if (DS.HasChanges())//Evalúa si el DataSet tiene algún cambio de ser así habilitará el botón de guardar, de lo contrario lo deshabilitará Guardar.Enabled = true;

else

Guardar.Enabled = false;

Con esto, se está cerca de terminar, solo falta programar el botón de guardar, para ello regresar a la vista diseño y dar clic en el botón de guardar y pegar el siguiente código:

OleDbCommandBuilder CB = new OleDbCommandBuilder(adapEven); adapEven.Update(DS, "xEventos"); DS.Tables["xEventos"].AcceptChanges(); Guardar.Enabled = false;

En este código, crear una variable de tipo OleDbComandBuilde, enlazada al datagridview, una vez realizado, indicarle que acepte los cambios hechos y deshabilitar nuevamente el botón de guardar, efectuado; se obtendrá la nueva forma. Debido a la manera en que son llamadas y a las propiedades de las mismas tenemos diferentes tipos de ventanas; la primera venta de acceso en donde no se tendrán botones de control (minimizar, maximizar y cerrar), una ventana MDI en la cual se pueda encapsular y ordenar las ventanas de la aplicación, MDIClid la cual

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

25

solo puede maximizarse dentro de la ventana MDI y permite interactuar con otras

ventas y por último la venta SDI, que se abre de manera exclusiva en la

y permite interactuar con otras ventanas dentro de la aplicación, también se obtiene

la forma de accesar a bases de datos mediante controles ofrecidos por el lenguaje,

y gracias a los cuales nos

que se

se evitan muchos problemas ya que ya no es necesario

aplicación

generen las consultas para actualizar, agregar o borrar un registro de la

base de datos.

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

26

C# para web

Para crear un nuevo proyecto de C# para web, en visual studio crear un nuevo sitio web, como se aprecia en la imagen:

crear un nuevo sitio web, como se aprecia en la imagen: Una vez creado el nuevo

Una vez creado el nuevo sitio web agregar una tabla, con tres cajas de texto, seis label, utilizar la herramienta FileUpload, DropDownList, y dos botones, de tal manera que se aprecie de la siguiente manera:

de tal manera que se aprecie de la siguiente manera: En C# para web se tienen

En C# para web se tienen dos tipos de archivos para la aplicación, el primero tiene la extensión aspx y el segundo aspx.cs la diferencia entre el primero y el segundo es

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

27

que el primero contiene el código html requerido para la ejecución de la aplicación y el archivo cs contiene el código cd C#. Antes de comenzar, se requiere agregar la librería de acceso a base de datos, esto en al archivo aspx.cs:

using System.Data.OleDb;

Después un poco más abajo en la siguiente sección

public partial class Default2 : System.Web.UI.Page

Agregar el siguiente código que es la cadena de conexión a bases de datos

OleDbConnection Cn = new OleDbConnection("Provider=SQLOLEDB;User id =sa;Password = hola;Initial Catalog=Curso;Data Source=DESKTOP\\SQLEXPRESS;");

Después regresar a la vista diseño del proyecto y dar doble clic en el lienzo para

llamar el evento load de la nueva

página y pegar el siguiente código:

Llena_DDLTS();

El cual invoca a una funcion a cual tambien se adjunta

protected void Llena_DDLTS()

{

OleDbDataReader dr;//crear un datareader string query; //crear un query para obtener los tipos d seguridad asi como su descripción y ordenarlos por la descripción query="Select TipoSeguridadPk, DescTipoSeguridad from TipoSeguridad order by DescTipoSeguridad"; OleDbCommand comando = new OleDbCommand(query, Cn);//manada el query al datareader comando.Connection.Open();//abrir la conexin con la base de datos dr = comando.ExecuteReader();//ejecutamos el query Ts.DataSource=dr;//vaciar el contenido del data reader en el DropDownList Ts.DataTextField = "DescTipoSeguridad";//indica a el DropDown que muestre la descripción de la seguridad Ts.DataValueField = "TipoSeguridadPk";//indica a el DropDown que oculte el id del tipo de seguridad Ts.DataBind();//refresca el contenido del combo

if(Ts.Items.Count>0)

idTS=Convert.ToInt32(Ts.SelectedValue);

comando.Connection.Close();//cierra la conexión con la base de datos

}

Volver a la vista diseño del sitio y dar clic en el botón de Abrir documento y pegar el siguiente código:

28

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

Response.Redirect("Default2.aspx?usr=" + TUsr.Text);

El cual al presionar el botón, conduce a la hoja Default2.aspx pasando el valor de lo que se tenga en caja de texto del nombre del usuario.

Lo siguiente es el botón de guardar, regresar a la vista diseño de la página y dar doble clic en el botón y pegar el siguiente código:

FileStream archivo; //Parámetros para procedimiento almacenado int tam; string nom, ruta; if (FileUpload1.HasFile)

{

try//cachador de errorres

{

//Obtener parámetros a utilizar nom = FileUpload1.FileName; tam = FileUpload1.FileBytes.Length; //NOTA: EL ARCHIVO PDF PRIMERO LO GUARDO EN UNA CARPETA

EN EL

//SERVIDOR Y LUEGO LO LEO LOCALMENTE PARA GUARDARLO EN

LA BD

ruta = "~/archivos/" + nom; //Guardar Archivo en Carpeta Servidor

FileUpload1.SaveAs(MapPath(ruta));

//leer archivo //nom = FileUpload1.FileName; //tam = FileUpload1.FileBytes.Length; archivo = new FileStream(MapPath(ruta), FileMode.Open,

FileAccess.Read);

byte[] imagen = new byte[tam]; archivo.Read(imagen, 0, tam); archivo.Close(); OleDbCommand cm = new OleDbCommand("spInsArch", Cn); cm.CommandType = CommandType.StoredProcedure; OleDbParameter usrPk = new OleDbParameter("@usr",

OleDbType.VarChar);

OleDbParameter nomusr = new OleDbParameter("@nomusr",

OleDbType.VarChar);

OleDbParameter pwdusr = new OleDbParameter("@pwdusr",

OleDbType.VarChar);

OleDbParameter TipoSPk = new OleDbParameter("@tipo",

OleDbType.Integer);

OleDbParameter Foto = new OleDbParameter("@arch_docto", OleDbType.VarBinary); //Establecer valores y dirección de los parámetros usrPk.Value = TUsr.Text; usrPk.Direction = ParameterDirection.Input; nomusr.Value = TNomUsr.Text; nomusr.Direction = ParameterDirection.Input; pwdusr.Value = TPass.Text; pwdusr.Direction = ParameterDirection.Input;

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

29

TipoSPk.Value = idTS; Foto.Value = imagen; Foto.Size = imagen.Length; Foto.Direction = ParameterDirection.Input; //agregar parámetros al procedimiento cm.Parameters.Add(usrPk); cm.Parameters.Add(nomusr); cm.Parameters.Add(pwdusr); cm.Parameters.Add(TipoSPk); cm.Parameters.Add(Foto); cm.Connection.Open(); cm.ExecuteNonQuery(); cm.Connection.Close(); Label1.Text = "Registro Guardado Satisfactoriamente";

}

catch (Exception ex)

{

Label1.Text = "Problemas al Guardar el registro: " +

ex.Message;

}

}

En el código anterior se sube el archivo al servidor y lo guarda en el directorio “archivos” del servidor, sin antes revisar el tamaño del archivo para revisar que no sea mayor a 5 mb, luego declara la siguiente variable:

OleDbCommand cm = new OleDbCommand("spInsArch", Cn);

La cual es de tipo procedimiento almacenado, al cual se le envían variables propias para su correcta inserción en la base de datos y al finalizar se despliega el mensaje de “Registro Guardado Satisfactoriamente”, el sitio debería de verse como en la siguiente imagen:

el sitio debería de verse como en la siguiente imagen: Prof. Jorge Luis Hernández Cervantes Victoria,

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

30

Y si todo el código está funcionando debidamente mostrara el mensaje de la siguiente manera:

debidamente mostrara el mensaje de la siguiente manera: Una vez que esto funciona adecuadamente se genera

Una vez que esto funciona adecuadamente se genera una nueva página la cual será llamada default2.aspx Una vez creada, ir al código de la pagina y pegar el siguiente código:

using System.Data.OleDb;

que es la librería de acceso a base de datos, despues un poco mas abajo pegamos

el siguiente fragmento debajo de

public partial class Default2 : System.Web.UI.Page

{

El código es el siguiente:

OleDbConnection Cn = new OleDbConnection("Provider=SQLOLEDB;User id

=sa;Password = hola;Initial Catalog=Curso;Data

Source=DESKTOP\\SQLEXPRESS;");

Después regresar a la vista diseño de el sitio y dar doble clic en el lienzo para que conduzca al evento load y pegar el siguiente código:

OleDbDataReader DR;//crear un datareader string usr = Request.QueryString["usr"];//extraer el valor de la variable usr de la url OleDbCommand comando = new OleDbCommand("select FotoUsuario from Usuario where UsuariopK='" + usr + "'", Cn);//crear un query en donde si existe

31

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

un usuario con el nombre especificado regresar a la imagen almacenada en la base de datos comando.Connection.Open();//abrir la conexión DR = comando.ExecuteReader();//ejecutar la consulta if (DR.Read())//es verdadero si encontró al usuario

{

Response.Buffer = true;//carga en el bufer del navegador la

imagen

Response.ContentType = "image/JPG";//manda la banderas necesarias para que el navegador sepa que tipo de archivo le llegará //"application/pdf" o "image/jpeg" o "application/vnd.xls" o "application/msword" "video/x-flv"

Response.BinaryWrite((byte[])DR["FotoUsuario"]);//comienza el streaming de el archivo binario hacia el navegador

}

comando.Connection.Close();//cerrar la conexión hacia la base de

datos

La ejecución de la página deberá apreciarse así:

datos La ejecución de la página deberá apreciarse así: Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato,

Prof. Jorge Luis Hernández Cervantes Victoria, Guanajuato, 16 de Octubre de 2012 @jl_cervantes cervantes.jl@gmail.com

32