Sunteți pe pagina 1din 58

Exportar a PDF, Excel y Otros formatos en C# (DataGridView & Windows Forms).

Hola, en esta ocasin les traigo un ejemplo de como exportar los datos de un dataGridView (en WinForms) a diversos formatos sin la necesidad de interactuar con componentes ActiveX y tampoco de utilizar la interoperabilidad de Office. En el caso de utilizar PDF si utilice una librera llamada iTextSharp y para los dems es solo programacin, pero eso lo veremos un poco mas adelante. Este ejemplo muestro un programa que tiene un dataGridView en el que se muestran los datos que se llenan desde una base de datos y esa informacin es la que se exporta a diferentes formatos. En esta entrada no explico como se llena el dataGridView porque hay muchas formas de hacerlo y me imagino que eso no les interesa. Habiendo quedando claro eso comencemos con el ejemplo. Exportando a PDF Para la exportacin de los datos del dataGridView a PDF estoy utilizando una librera muy interesante llamada iTextSharp que es un "Port" de otra librera llamada iText para Java solo que esta es para C#. Al estar utilizando esta librera me sorprendi de una forma muy grata ya que no la conoca. esta puede ser una opcin a crystal reports al momento de hacer reportes principalmente si es que no deseas que tu aplicacin eleve considerablemente su tamao y su rendimiento, eso si es mucho mas trabajo porque todo es por cdigo y no puedes disear tus reportes de una forma visual aunque con un poco de dedicacin puedes sacar PDFs muy completos en cuanto a diseo ya que esta librera te provee de muchas clases para disear el PDF conforme a tus necesidades (Para mas informacin sobre iTextSharp visiten este pagina http://itextsharp.sourceforge.net/ ), pero bueno no me quiero meter tanto en esto y continuemos con el ejemplo. Primero que nada creamos un Nuevo proyecto del Tipo WidowsApplication en Visual Studio y agregamos una referencia a la DLL de iTextSharp (descargar DLL iTextSharp) en nuestro proyecto.

Agregamos la dll de iTextSharp nuestro proyecto.

Una vez teniendo agregada la DLL diseamos un WindowsForm como en la siguiente imagen agregamos un botn al que le pondremos Exportar y accedemos a su evento Onclick.

En este ejemplo tendremos estos datos y los exportaremos a PDF usando ItextSharp.

Antes de poner el cdigo es necesario agregar los siguientes espacios de nombres entre otros:
usingiTextSharp.text; using iTextSharp.text.pdf; //Cdigo para exportar DataGridView a PDF usando iTextSharp //Evento clic del Botn Exportar privatevoid Exportar_pdf(object sender, EventArgs e) { try { Document doc = newDocument(PageSize.A4.Rotate(), 10, 10 ,10, 10); string filename = "DataGridViewTest.pdf";

FileStream file = newFileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); PdfWriter.GetInstance(doc, file); doc.Open(); GenerarDocumento(doc); doc.Close(); Process.Start(filename); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //Funcin que genera el documento Pdf publicvoid GenerarDocumento(Document document) { //se crea un objeto PdfTable con el numero de columnas del //dataGridView PdfPTabledatatable = newPdfPTable(dataGridView1.ColumnCount); //asignamos algunas propiedades para el diseo del pdf datatable.DefaultCell.Padding = 3; float[] headerwidths = GetTamaoColumnas(dataGridView1); datatable.SetWidths(headerwidths); datatable.WidthPercentage = 100;

datatable.DefaultCell.BorderWidth = 2; datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;

//SE GENERA EL ENCABEZADO DE LA TABLA EN EL PDF for (int i = 0; i < dataGridView1.ColumnCount; i++) { datatable.AddCell(dataGridView1.Columns[i].HeaderText); }

datatable.HeaderRows = 1; datatable.DefaultCell.BorderWidth = 1;

//SE GENERA EL CUERPO DEL PDF for (int i = 0; i < dataGridView1.RowCount; i++) { for (int j = 0; j < dataGridView1.ColumnCount; j++) { datatable.AddCell(dataGridView1[j, i].Value.ToString()); } datatable.CompleteRow(); }

//SE AGREGAR LA PDFPTABLE AL DOCUMENTO document.Add(datatable); }

//Funcin que obtiene los tamaos de las columnas del grid publicfloat[] GetTamaoColumnas(DataGridView dg) { float[] values = newfloat[dg.ColumnCount]; for (int i = 0; i <dg.ColumnCount; i++) { values[i] = (float)dg.Columns[i].Width; } return values; }

Imagen del Pdf generado en este ejemplo.

Nota: Este ejemplo esta hecho para Windows Forms para el componente DataGridView pero para ASP.net seria muy similar para el componente DataGrid solo que manejando con mucho cuidado los paths. Exportandoaotrosformatos

diseo de la forma para exportar a otros formatos en este ejemplo

Exportando A Excel Para la exportacin a este formato es una pequea trampita si es que se puede llamar as porque lo que se esta haciendo es generar un documento con cdigo HTML pero guardarlo con extensin XLS!!!, en donde simplemente los datos que tenemos en el Grid lo pasamos a una tabla HTML y ya con eso tendremos nuestros datos exportados a Excel . El siguiente cdigo es una clase llamada OtrosFormatos la cual tiene 2 mtodos los cuales son Export y ExportCSV este ultimo para exportar al formato CSV adems de contar con 2 atributos los cuales son el StreamWriter (clase del NameSpace System.IO) y la ruta en donde queremos guardar el archivo. clase OtrosFormatos
publicclassOtrosFormatos { StreamWriter w; stringruta; publicstringxpath { get { returnruta; } set { value = ruta; }}

///<summary> /// Constructor que establece el path del archivo

///</summary> ///<param name="path"></param> publicOtrosFormatos(string path) { ruta = @path; }

///<summary> /// Exporta datos a un archivo ///</summary> ///<param name="titulos"></param> ///<param name="datos"></param> publicvoid Export(ArrayListtitulos, DataTabledatos) { try { FileStreamfs = newFileStream(ruta, FileMode.Create, FileAccess.ReadWrite); w = newStreamWriter(fs); stringcomillas = char.ConvertFromUtf32(34); StringBuilder html = newStringBuilder(); html.Append(@"<!DOCTYPE html PUBLIC" + comillas + "-//W3C//DTD XHTML 1.0 Transitional//EN" + comillas + " " + comillas + http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd + comillas + ">");

html.Append(@"<html xmlns=" + comillas + http://www.w3.org/1999/xhtml + comillas + ">"); html.Append(@"<head>"); html.Append(@"<meta http-equiv=" + comillas +"Content-Type" + comillas + "content=" + comillas + "text/html; charset=utf-8" + comillas+"/>"); html.Append(@"<title>Untitled Document</title>"); html.Append(@"</head>"); html.Append(@"<body>");

//Generando encabezados del archivo //(aqu podemos dar el formato como a una tabla de HTML) html.Append(@"<table WIDTH=730 CELLSPACING=0 CELLPADDING=10 border=8 BORDERCOLOR=" + comillas + "#333366" + comillas + " bgcolor=" + comillas + "#FFFFFF" + comillas + ">"); html.Append(@"<tr><b>");

foreach (object item intitulos) { html.Append(@"<th>" + item.ToString() + "</th>"); } html.Append(@"</b></tr>");

//Generando datos del archivo

for (int i = 0; i <datos.Rows.Count; i++) { html.Append(@"<tr>"); for (int j = 0; j <datos.Columns.Count; j++) { html.Append(@"<td>" + datos.Rows[i][j].ToString() + "</td>"); } html.Append(@"</tr>"); } html.Append(@"</body>"); html.Append(@"</html>"); w.Write(html.ToString()); w.Close(); } catch (Exception ex) { throw ex; } } //Fin de la Funcin Export

///<summary> /// Genera un archivo CSV ///</summary> ///<param name="titulos"></param>

///<param name="datos"></param> publicvoid ExportCSV(ArrayList titulos, DataTable datos) { try { FileStreamfs = newFileStream(ruta, FileMode.Create, FileAccess.ReadWrite); w = newStreamWriter(fs); stringcomillas = char.ConvertFromUtf32(34); StringBuilder CSV = newStringBuilder();

//Encabezados for (int i = 0; i <titulos.Count; i++) { if (i != (titulos.Count - 1)) CSV.Append(comillas + titulos[i].ToString() + comillas + ","); else CSV.Append(comillas + titulos[i].ToString() + comillas + Environment.NewLine); }

// se generandatos for (int i = 0; i <datos.Rows.Count; i++) { for (int j = 0; j <datos.Columns.Count; j++)

{ if (j != (titulos.Count - 1)) CSV.Append(comillas + datos.Rows[i][j].ToString() + comillas + ","); else CSV.Append(comillas + datos.Rows[i][j].ToString() + comillas + Environment.NewLine); } } w.Write(CSV.ToString()); //se escribe la cadena en el archivo w.Close(); } catch (Exception ex) { throw ex; } } //Fin de ExportCSV } // Fin de Clase OtrosFormatos

Cdigo del uso de esta clase en la Aplicacin para Exportar a Excel.


//Cdigo para exportar a Excel //Evento Onclick del Botn privatevoidBotExcel_Click(object sender, EventArgs e) { try {

ArrayListtitulos = newArrayList(); DataTable datosTabla = newDataTable(); //Especificar ruta del archivo con extensin de EXCEL. OtrosFormatos OF = newOtrosFormatos(Application.StartupPath + @\\test.xls); //obtenemos los titulos del grid y creamos las columnas de la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { titulos.Add(item.HeaderText); datosTabla.Columns.Add(); } //se crean los renglones de la tabla foreach (DataGridViewRow item in dataGridView1.Rows) { DataRowrowx = datosTabla.NewRow(); datosTabla.Rows.Add(rowx); } //se pasan los datos del dataGridView a la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { foreach (DataGridViewRowitemxin dataGridView1.Rows) { datosTabla.Rows[itemx.Index][item.Index] = dataGridView1[item.Index, itemx.Index].Value; } } OF.Export(titulos, datosTabla);

Process.Start(OF.xpath); MessageBox.Show("ProcesoCompleto"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //Fin del Evento Clic del Botn

Archivo de Excel Resultante.

Exportacin a WORD Para la exportacin de los datos a Word se sigue el mismo procedimiento que para exportar los datos a Excel, solo que en vez de guardar el archivo con extensin .xls lo guardamos con extensin .doc.
//Cdigo para exportar a Word //Evento Onclick del Botn privatevoidBotWord_Click(object sender, EventArgs e) {

try { ArrayListtitulos = newArrayList(); DataTable datosTabla = newDataTable(); //Especificar ruta del archivo con extensin de WORD. OtrosFormatos OF = newOtrosFormatos(Application.StartupPath + @\\test.doc); //obtenemos los titulos del grid y creamos las columnas de la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { titulos.Add(item.HeaderText); datosTabla.Columns.Add(); } //se crean los renglones de la tabla foreach (DataGridViewRow item in dataGridView1.Rows) { DataRowrowx = datosTabla.NewRow(); datosTabla.Rows.Add(rowx); } //se pasan los datos del dataGridView a la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { foreach (DataGridViewRowitemxin dataGridView1.Rows) { datosTabla.Rows[itemx.Index][item.Index] = dataGridView1[item.Index, itemx.Index].Value; }

} OF.Export(titulos, datosTabla); Process.Start(OF.xpath); MessageBox.Show("ProcesoCompleto"); } catch(Exception ex) { MessageBox.Show(ex.Message); } } //Fin del Evento Clic del Botn

Archivo .doc Resultante

Exportacin a HTML Para la exportacin a HTML es la mas sencilla ya que en este ejemplo lo que se crea es un archivo HTML solo se guarda con extensin HTML y ya esta.
//Cdigo para Exportar a HTML //Evento Click del Botn

privatevoidBotHTML_Click(object sender, EventArgs e) { try { ArrayListtitulos = newArrayList(); DataTable datosTabla = newDataTable(); //Especificar ruta del archivo con extensin de HTML. OtrosFormatos OF = newOtrosFormatos(Application.StartupPath + @\\test.html); //obtenemos los titulos del grid y creamos las columnas de la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { titulos.Add(item.HeaderText); datosTabla.Columns.Add(); } //se crean los renglones de la tabla foreach (DataGridViewRow item in dataGridView1.Rows) { DataRowrowx = datosTabla.NewRow(); datosTabla.Rows.Add(rowx); } //se pasan los datos del dataGridView a la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { foreach (DataGridViewRowitemxin dataGridView1.Rows) { datosTabla.Rows[itemx.Index][item.Index] =

dataGridView1[item.Index, itemx.Index].Value; } } OF.Export(titulos, datosTabla); Process.Start(OF.xpath); MessageBox.Show("ProcesoCompleto"); } catch(Exception ex) { MessageBox.Show(ex.Message); } } // Fin del Evento Click del botn

Archivo html resultante

Exportacin a CSV (comma-separated values)

La exportacin a este formato es bastante sencilla y se usa el mismo principio que en los dems solo que usando el mtodo ExportCSV de este ejemplo ya que el vaciado de los datos es diferente porque no se crea un documento HTML sino que se escribe directamente sobre un archivo csv. Nota: Cabe sealar que este tipo de formatos se puede abrir tambin en Excel en cual se mostrara los datos en forma de tabla.
//Cdigo para Exportar a CSV //Evento Click del Botn privatevoidBotCSV_Click(object sender, EventArgs e) { try { ArrayListtitulos = newArrayList(); DataTable datosTabla = newDataTable(); //Especificar ruta del archivo con extensin de CSV. OtrosFormatos OF = newOtrosFormatos(Application.StartupPath + @\\test.csv); //obtenemos los titulos del grid y creamos las columnas de la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { titulos.Add(item.HeaderText); datosTabla.Columns.Add(); } //se crean los renglones de la tabla foreach (DataGridViewRow item in dataGridView1.Rows) { DataRowrowx = datosTabla.NewRow(); datosTabla.Rows.Add(rowx);

} //se pasan los datos del dataGridView a la tabla foreach (DataGridViewColumn item in dataGridView1.Columns) { foreach (DataGridViewRowitemxin dataGridView1.Rows) { datosTabla.Rows[itemx.Index][item.Index] = dataGridView1[item.Index, itemx.Index].Value; } } OF.ExportCSV(titulos, datosTabla); Process.Start(OF.xpath); MessageBox.Show("ProcesoCompleto"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //Fin delEvento Click del Botn

Archivo CSV resultante

Este ejemplo en conjunto con todo su cdigo lo pueden descargar desde mi SkyDrive aqu. Nota: La conexin a la base de datos de este ejemplo la realice con SQLite, en el ejemplo pongo lo necesario para que funcione el ejecutable incluyendo la base de datos, la DLL iTextSharp y el DataProvider de SQLite, pero si quieren modificar el cdigo y que funcione tendrn que instalar el Proveedor de datos SQLite, esto lo hice por portabilidad ya que con SQlite la base de datos esta en un pequeo archivo. Pueden preguntar con toda confianza por si tiene alguna duda con SQLite y si esta dentro de mis posibilidades intentare ayudarlos. Saludos!!!

Etiquetas de Technorati: C#,Exportar,PDF,Excel,Word,HTML,DataGridView,WindowsForms,CSV,Visual Studio Posted: Nov 06 2009, 01:37 PM by Edgar Rafael Galicia Reyes | with 56 comment(s) Filed under: C#, Visual Studio 2008, Exportar, PDF, Word, Excel, CSV, HTML, DataGridView, Windows Forms
value:Filed%20un

Poner un Icono en la Barra de Tareas

El siguiente ejemplo es de como poner un icono en la barra de Tareas (a un lado del reloj) con una aplicacin en C#. Esto puede servirnos si queremos esconder nuestra aplicacin para que no estorbe en el escritorio y solo quede un icono en la barra de tareas con el cual podemos volver a hacer visible a nuestra aplicacin. Empecemos con el ejemplo. Creamos un proyecto nuevo de C# de tipo Windows Application con Visual Studio y le ponemos por nombre IconoBarraTareas y le damos mas o menos esta forma.

Despus de esto agregamos en control que sirve para mostrar un icono en la barra de tareas el cual se llama notifyIcon que se encuentra en el cuadro de herramientas en la seccin de controles comunes.

Tambin agregamos un control ContextMenuStrip este nos servir para cuando demos un clic derecho al icono en la barra de tareas nos muestre un men y podamos seleccionar opciones como la de volver a hacer visible la aplicacin.

Terminando con esto, al ContextMenuStrip le agregamos algunas opciones como la de Mostrar/Ocultar y Salir. Para el control notifyIcon tienen unas propiedades muy importantes las cuales hay que modificar para lograr el objetivo de mostrar un icono en la barra de tareas, las propiedades son las siguientes: BallonTipIcon: Modificando esta propiedad podemos elegir cual tipo de icono se mostrar en el globo informativo del notifyIcon. BallonTipTitle: Aqu se modifica el titulo del globo informativo. BallonTipText: Se modifica en texto del globo informativo. Icon: El icono que se le asigne a esta propiedad ser el icono que se mostrara en la barra de tareas. por ultimo en la propiedad ContextMenuStrip del notifyIcon1 le asociamos el contextMenuStrip1 que agregamos a nuestra aplicacin.

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespaceIconoBarraTareas { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { notifyIcon1.ShowBalloonTip(10000); } private void OcultarApp_Click(object sender, EventArgs e) { this.Hide(); } private void mostrarOcultarToolStripMenuItem_Click(object sender, EventArgs e) { this.Visible = !this.Visible; } private void salirToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } private void Form1_VisibleChanged(object sender, EventArgs e) { if (this.Visible) { notifyIcon1.BalloonTipText = "Forma Visible"; } else { notifyIcon1.BalloonTipText = "Forma NO Visible"; } notifyIcon1.ShowBalloonTip(100000); } } }

lo que hace este cdigo es que cuando la Forma Cambie de estado en su propiedad Visible,el notifyIcon mostrar un mensaje en el icono en la barra de tareas.

Y con esto ya tenemos una aplicacin la cual podemos ocultar para que no estorbe y realice lo que tenga que realizar sin molestar a nadie. Este ejemplo lo puedes descargar desde mi SkyDrive aqu. Etiquetas de Technorati: notifyIcon Posted: Aug 30 2009, 03:47 PM by Edgar Rafael Galicia Reyes | with 16 comment(s) Filed under: C#, Icono, NotifyIcon, Visual Studio 2008
value:Filed%20un

Crear un instalador para WindowsApplication en Visual Studio paso a paso.

Este es un tutorial muy bsico de como realizar un instalador en visual Studio pero esto solo abarca un la creacin de un instalador de aplicaciones Windows, un instalador para sitios Web es un poco diferente y mas adelante tratare de publicar otra entrada con ese tema. Habiendo quedando claro eso comencemos con la creacin del instalador. Paso 1.- Agregar un nuevo proyecto de instalacin a una solucin existente. Aqu tenemos nuestra solucin que se llama ProyectoPrueba que contiene un solo proyecto del tipo WindowsApplication que se llama tambin ProyectoPrueba, no importa el proyecto que sea, solo que sea del tipo Windows application.

Damos clic con el botn derecho en la solucin en el explorador de soluciones y seleccionamos Agregar > Nuevo proyecto.

Al hacer esto se nos mostrara la siguiente pantalla para elegir un nuevo proyecto y seleccionamos un proyecto en: Otros Tipos de proyectos > Instalacin e Implementacin > Proyecto de instalacin.

Paso 2.- Seleccionar que archivos de nuestro proyecto queremos aadir al instalador. Y al seleccionar el nuevo proyecto se nos mostrara la siguiente pantalla, la cual tratare de explicar a continuacin. Aqu se ve un rbol de exploracin que es el Sistema de archivos en el equipo de destino, esto se puede visualizar como el equipo en donde vamos a instalar nuestra aplicacin la cual se nos muestran 3 carpetas las cuales tratare de explicar a continuacin. Carpeta de aplicacin: Es donde se colocan todos los archivos necesarios para que nuestra aplicacin funcione. Escritorio del usuario: Es donde se colocan los elementos que se mostraran en el escritorio del usuario, casi siempre aqu se pone un acceso directo al Ejecutable (.exe) de nuestra aplicacin. Men programas del usuario: Lo que ponemos aqu se muestra en Inicio > Todos los programas del equipo de destino.

Ahora damos un clic derecho y seleccionamos Carpeta de aplicacin > Agregar > Resultados del proyecto

Y se nos mostrara la siguiente pantalla. En esta pantalla se nos da a elegir que es lo que vamos a colocar en la carpeta de la aplicacin donde podemos seleccionar lo que queramos de nuestro ProyectoPrueba (si tenemos mas proyectos en nuestra solucin podemos elegir el que queramos). Estas son algunas opciones que nos ofrece VS.

Resultado principal: Contiene los archivos DLL o EXE generados por el proyecto. Recursos adaptados: Contiene los ensamblados satlite para los recursos de cada referencia cultural. Archivos de cdigo fuente: Contiene todos los archivos de cdigo fuente del proyecto.

En este ejemplo seleccionaremos solo la opcin de resultados principal ya que no queremos darle al usuario final el cdigo fuente (o si?), y damos aceptar.

Con eso ya estar lista la carpeta de aplicacin ahora procedemos a configurar la carpeta Escritorio del usuario en la cual solo agregaremos un acceso directo al Resultado principal de la aplicacin (exe). Se selecciona la carpeta Escritorio del usuario y damos un clic derecho en la parte central de la pantalla y seleccionamos Crear acceso nuevo acceso directo tal como se muestra en la pantalla.

Al hacer esto se nos mostrara la siguiente pantalla que es para elegir a que va hacer referencia nuestro nuevo acceso directo. Para lo cual nos iremos a la carpeta de la aplicacin y seleccionaremos Resultado principal de la aplicacin, despus damos clic en aceptar.

Una vez hecho esto podemos editar el acceso directo y cambiarle el nombre, el icono que se mostrara, etc..

Por ultimo seleccionamos la carpeta Men programas del usuario damos un clic derecho en ella y seleccionamos Agregar > Carpeta, esto lo hacemos para agregar una nueva carpeta para que aparezca en Todos los programas del usuario final.

La cambiamos el nombre a la carpeta creada recientemente a Proyecto Prueba, la seleccionamos y damos un clic con el botn derecho en la parte central de la pantalla para agregar nuevamente un acceso directo tal y como lo hicimos en la carpeta Escritorio del usuario.

Despus de esto realizamos lo mismo que hicimos en la carpeta Escritorio del usuario y configuramos el acceso directo para que haga referencia al resultado principal del proyecto.

As ya tendremos configurado que archivos vamos a copiar, pero aun falta mas configuraciones que este tipo de proyectos de instalacin nos ofrece. Paso 3.- Configurando el proyecto de instalacin. La forma en que vamos a configurar este proyecto es muy bsica ya que este tipo de proyectos ofrece muchas configuraciones para los gustos y necesidades de cualquiera. En el explorador de soluciones seleccionamos el proyecto de instalacin y accedemos a sus propiedades.

Despus de hacer esto se nos mostrara la siguiente pantalla, donde se muestra varias configuraciones pero la nica que veremos aqu son los requisitos previos de la instalacin.

Al dar clic en Requisitos previos, se nos mostrara la siguiente pantalla en donde especificaremos cuales son los requerimientos que necesita nuestra aplicacin para funcionar en el equipo de destino.

Se pueden especificar cuales programas necesitan estar instalados para que nuestra aplicacin funcione, estos son algunos ejemplos:

.Net Framework (varias versiones): Esta opcin debe de estar seleccionada siempre, porque ya que si el equipo destino no tiene instalada le versin del Framework necesaria, nuestra aplicacin no funcionara. Windows Installer 3.1: Muy necesaria tambin porque al igual que el Framework es necesario para que el instalador funcione.

Existen mas opciones pero estas son las principales. tambin se puede especificar de donde se obtendrn los requerimientos previos es decir que si el instalador detecta que no se tienen los requerimientos necesarios mandara un mensaje al usuario con la informacin de donde puede obtener dicho requerimiento, esto es configurable en la parte inferior de la siguiente pantalla.

Una vez hecho esto damos por concluido el paso de configuracin, pero les repito que existen mas configuraciones y que estas con solo las bsicas. Paso 4.- Generar el archivo de Setup.

Por ultimo generaremos el archivo de setup cabe sealar que generar el archivo de setup es diferente a generar la solucin, este se tiene que hacer de forma separada, para esto seleccionamos Generar > Generar Setup tal como se muestra en la pantalla.

Una vez generado el setup lo podemos encontrar en la carpeta .\ProyectoPrueba\Setup\Debug ah se encuentran por lo regular 2 archivos que se nombran segn se le all puesto al proyecto de instalacin, uno es .exe y el otro es .msi y funcionan de la misma manera. Se puede acceder directamente a estos archivos para probar el instalador o podemos dar en proyecto> Instalar para probar el instalador.

Despus de haber seguido estos pasos ya tendremos nuestro instalador funcionando, estas son algunas imgenes del instalador funcionando.

Aqu en esta imagen se ve el resultado de la instalacin en la Carpeta de la aplicacin

Esto esta en el Escritorio del usuario.

Y para terminar se muestra lo que se agrego en la carpeta de Men programas del usuario.

Para descargar este ejemplo con todo y su cdigo fuente ah les dejo el enlace de mi SkyDrive ProyectoPrueba Si quieres saber mas acerca de los instaladores en visual studio pueden visitar este enlace Cmo... crear un proyecto de instalacin (Setup) Etiquetas de Technorati: Instalador,Visual Studio Posted: May 01 2009, 06:48 PM by Edgar Rafael Galicia Reyes | with 120 comment(s) Filed under: C#, Instalador
value:Filed%20un

WinSock en C#, Aplicacin Cliente-Servidor

Etiquetas de Technorati: Winsock,C# Hola, ya tenia mucho tiempo sin publicar nada pero la mezcla del trabajo y la escuela esta algo complicada. Bueno hoy le traigo un ejemplo de cmo utilizar los WinSock en c# con Visual Studio en las versiones 2005 y 2008. Este tema que me parece muy interesante aunque es algo avanzado aun cuando no son muchas lneas cdigo, pero tratare de explicar antes la tecnologa aplicada a este ejemplo. Para este ejemplo usamos el Winsock para establecer una conexin entre el cliente y el servidor. Esto es lo que se usa en todas las computadores hoy en da. La red es una

herramienta esencial y muy importante para los programadores y se debe aprender a utilizarla. Es este articulo veremos un sencillo programa de chat, el cual consistir en una aplicacin que ser el servidor y otra el cliente que se puede conectar directamente desde Internet o desde una LAN para simplemente intercambiar mensajes de texto. Control Winsock en C# El manejo de sockets es complejo realizando todo el trabajo desde cero, porque se tienen que controlar diversos factores como crear encabezados, tamaos de paquetes, tablas de hash, manejo de hilos y muchas mas cosas pero con el control Winsock nos evitaremos todo ese problema, este control es un componente COM y lo podemos aadir a nuestro programa en c# (o cualquier otro lenguaje por ser COM) de una manera muy fcil esto se vera en la construccin del ejemplo. Que se necesita para este ejemplo??? Se necesita una computadora con Windows, y tener instalado Visual Studio en cualquiera de sus versiones de 2005 o 2008. Ejemplo: Bueno aqu empieza lo chido, el cdigo.

Cliente
Lo primero que aremos ser construir la aplicacin cliente pare ello abriremos una instancia de Visual Studio y crearemos un nuevo proyecto del tipo WindowsApplication y la disearemos mas o menos as.

Despus el la caja e herramientas demos clic con el botn derecho y seleccionamos choose Items como se muestra en la imagen.

Se nos desplegara una ventana para elegir el control que ocuparemos para el ejemplo que es el Microsoft WinSock Control, versin 6.0

Lo seleccionamos y damos OK y este control nos aparecer en caja de herramientas del Visual Studio como se muestra en la imagen.

Luego arrastramos el control a la forma y as lo tendramos agregado en nuestra aplicacin. Esta es la imagen del control en la forma, se ve as ya que es un control que no es visible en la ejecucin pero como es COM no se pone en la parte de abajo como los otros controles no visibles de visual Studio.

Una vez diseada la forma se le introduce el siguiente cdigo.


using using using using System; System.Collections.Generic; System.ComponentModel; System.Data;

using using using using

System.Drawing; System.Linq; System.Text; System.Windows.Forms;

namespace WinSockClient { public partial class Form1 : Form { public Form1() { InitializeComponent(); // se le agregan los eventosnecesarios al //control axWinsock1 this.axWinsock1.Error += new AxMSWinsockLib. DMSWinsockControlEvents_ErrorEventHandler (this.axWinsock1_Error); this.axWinsock1.ConnectEvent += new System.EventHandler (this.axWinsock1_ConnectEvent); this.axWinsock1.DataArrival += new AxMSWinsockLib. DMSWinsockControlEvents_DataArrivalEventHandler (this.axWinsock1_DataArrival); } //variable para tener un control del estado de //conexion entre el cliente y el servidor bool isConnected = false; private void btnConectar_Click(object sender,EventArgs e) { //si esta conectado se cierra y si no se abre //la conexion if(isConnected == false) { try { //se cierra el winsock si esta abierto. axWinsock1.Close(); //se llama al mtodo connect del winsock //que pide una IP y un puerto a cual conectarse axWinsock1.Connect(IPTxt.Text, PuertoText.Text); isConnected = true; labelEstado.Text = "Conectado por el puerto: " + PuertoText.Text; labelEstado.ForeColor = Color.Green; btnConectar.Text = "Desconectar"; } // con un bloque try-catch se cacha //cualquier error y lo muestra en el log catch (System.Windows.Forms.AxHost.InvalidActiveXStateException g) { ListBoxLog.Items.Add(g.ToString()); }

catch (Exception ex) { ListBoxLog.Items.Add(ex.Message); } } else { try { //Esto cierra la conexion con el cliente axWinsock1.Close(); this.ListBoxLog.Items.Add("Desconectado..."); btnConectar.Text = "Conectar"; labelEstado.ForeColor = Color.Red; labelEstado.Text = "Desconectado"; isConnected = false; } catch { MessageBox.Show("Ocurri un error, el puerto no esta abierto", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void btnEnviar_Click(object sender,EventArgs e) { try { //si esta conectado puede enviar informacin if(isConnected) { //esto se enva la informacin que tenga //textbox txtMsg hacia el servidor axWinsock1.SendData(txtMsg.Text); //con esto visualizamos en pantalla //el mensaje que se acaba de enviar ListBoxLog.Items.Add("Cliente- " + axWinsock1.LocalIP + ": " + txtMsg.Text); //borramos el contenido del texbox para //dejarlo listo para mandar un nuevo mensaje txtMsg.Text = ""; } else MessageBox.Show("No se esta conectado con el servidor"); } // con un bloque try-catch se cacha //cualquier error y lo muestra en el log catch (AxMSWinsockLib.AxWinsock.InvalidActiveXStateException g) { ListBoxLog.Items.Add(g.ToString()); }

catch (Exception ex) { ListBoxLog.Items.Add(ex.Message); } } //en caso de algn error puramente del winsock //se activa este evento y se escribe en el log //la informacin del error void axWinsock1_Error(object sender, AxMSWinsockLib.DMSWinsockControlEvents_ErrorEvent e) { ListBoxLog.Items.Add("Error : " + e.description); isConnected = false; } // Este evento se activa cuando el servidor enva //y el winsock del cliente atrapa esa informacin private void axWinsock1_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e) { //creamos una variable para obtener //los datos que llegaron string data = ""; //creamos otra variable tipo object //porque el mtodo que se utiliza para //recibir datos es object object dat = (object)data; //obtenemos la informacin que envi //el servidor en forma de object axWinsock1.GetData(ref dat); //hacemos un cast a esa variable //y la guardamos en la variable data data = (string)dat; //mostramos la informacin en log ListBoxLog.Items.Add("Servidor - " + axWinsock1.RemoteHostIP + ": " + data); } //Esto pasa cuando se conecta a un servidor, //muestra la informacin de conexion en el log private void axWinsock1_ConnectEvent(object sender, EventArgs e) { ListBoxLog.Items.Add( "Conectado con el servidor en: " + axWinsock1.RemoteHostIP); isConnected = true; } } }

Servidor

Una ves construido el cliente pasamos a construir la aplicacin servidor que es muy similar al cliente, para esto abrimos otra instancia de Visual Studio y creamos un proyecto del tipo WindowsApplication y lo diseamos mas o menos as.

De la misma forma como e hizo en el cliente, agregamos el componente Microsoft WinSock Control, versin 6.0. Despus agregamos el cdigo del servidor.
using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

namespace WinSockServer { public partial class ServerForm1 : Form { public ServerForm1() { InitializeComponent(); } //variable para el tener un control //sobre el estado de la conexion bool isConnected = false;

private void btnEnviar_Click(object sender,EventArgs e) { try { if(isConnected) { //con esto se enva el texto que este el en txtMsg xWinsock1.SendData(txtMsg.Text); //Se muestra en pantalla la informacin que se envi ListBoxLog.Items.Add("Servidor: "+ txtMsg.Text); //se borra la info del txtmsg txtMsg.Text = ""; } else MessageBox.Show("No estas conectado"); } // con un bloque try-catch se cacha cualquier error //que ocurra, y se muestra en el log catch(AxMSWinsockLib.AxWinsock.InvalidActiveXStateException g) { ListBoxLog.Items.Add(g.ToString()); } catch(Exception ex) { ListBoxLog.Items.Add(ex.Message); } } private void btnEscuchar_Click(object sender,EventArgs e) { try { int x = 0; if(portText.Text != "" && int.TryParse(portText.Text, out x)) { //Para crear una conexion se necesita //que el servidor(host) siempre este //escuchando por un puerto especifico, //y si un cliente se quiere conectar //a el debe ir a abrir ese puerto //Con esto se le asigna el puerto al winsock axWinsock1.LocalPort = Int32.Parse(portText.Text); isConnected = true; //este comando abre la conexion //con el puerto y se mantiene escuchando //por el puerto especificado axWinsock1.Listen(); labelEstado.ForeColor = Color.Green; labelEstado.Text = "Escuchando por el puerto:"; labelPuerto.Text = portText.Text; labelPuerto.ForeColor = Color.Green; pictureBox1.Show(); pictureBox2.Hide();

ListBoxLog.Items.Add("Escuchando por el puerto: " + portText.Text); buttonDesconectar.Enabled = true; buttonEscuchar.Enabled = false; buttonEnviar.Enabled = true; } else { MessageBox.Show("Debe asignar un puerto para escuchar","ERROR",MessageBoxButtons.OK,MessageBoxIcon.Information); } } catch { MessageBox.Show("Ocurri un error, lo mas probable es que el puerto seleccionado no este disponible"); } } private void Desconectar_Click(object sender, EventArgs e) { try { //cierra la conexin con el cliente axWinsock1.Close(); this.ListBoxLog.Items.Add("Desconectado........."); buttonEscuchar.Enabled = true; buttonDesconectar.Enabled = false; buttonEnviar.Enabled = false; labelEstado.Text = "Sin Escuchar ningn puerto"; labelPuerto.Text = ""; labelEstado.ForeColor = Color.Red; pictureBox2.Show(); pictureBox1.Hide(); } catch { MessageBox.Show("Ocurri un error, el puerto no esta abierto", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } } //cuando se hace una peticin de //conexin de parte de un cliente private void axWinsock1_ConnectionRequest(object sender, AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent e) { if (isConnected == true) { axWinsock1.Close(); } //este comando acepta la conexin con el cliente axWinsock1.Accept(e.requestID); isConnected = true; //escribe en el log si el cliente esta conectado.

ListBoxLog.Items.Add("Cliente Conectado: " + axWinsock1.RemoteHostIP); } private void axWinsock1_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e) { //creamos una variable para obtener los //datos que llegaron string data = ""; //creamos otra variable tipo object porque //el mtodo que se utiliza para recibir //datos es object object dat = (object)data; //obtenemos la informacin que envi el //servidor en forma de object axWinsock1.GetData(ref dat); //hacemos un cast a esa variable y la //guardamos en la variable data data = (string)dat; //mostraos la informacin en log ListBoxLog.Items.Add(axWinsock1.RemoteHostIP + ": " + data); } private void Form1_Load(object sender, EventArgs e) { //se muestra el nombre del equipo lblHost.Text = axWinsock1.LocalHostName; //se muestra la IP del equipo lblIPlocal.Text = axWinsock1.LocalIP; } } }

Por ultimo en la imagen se ve a las dos aplicaciones interactuando, para que esto funcione se debe primero abrir la aplicacin servidor y ponerla a escuchar por algn puerto libre y despus abrir la app cliente y ponerle la IP de la app servidor as como el puerto por la cual esta escuchando, con esto se dar la conexin y todo funcionara bien, este programa lo hice lo prob de forma local pero tambin funciona sin ningn problema por una LAN o por Internet.

Bueno, espero le haya servido a alguien. Si alguien ve algn error o tienen una duda por favor comntela. Para descargar las dos aplicaciones con todo el cdigo fuente aqu les dejo el link de mi SkyDrive Winsocks Cliente-Servidor

Posted: May 01 2009, 06:25 PM by Edgar Rafael Galicia Reyes | with 70 comment(s) Filed under: C#, Winsock, Visual Studio 2008
Como cifrar y descifrar texto usando C#
value:Filed%20un

Hola, este tema es un poco mas complicado que el pasado, pero tambin creo que es de mucha utilidad, mas que nada cuando quieres guardar usuarios en una base de datos y no quieres que nadie, ni si quiera tu pueda saber la contrasea de los usuarios con tan solo mirar la tabla o con alguna consulta desde cualquier manejador de base de datos sea cual sea este. Este es un simple ejemplo hecho en C# de cmo encriptar y descencriptar texto utilizando una serie de clases provee el Framework, aqu una breve explicacin de estas clases. Clases y Espacios de nombres importantes para su implementacin son:
usingSystem.Text; using System.Security.Cryptography;

MD5CryptoServiceProvider (Clase)

Calcula el valor de hash MD5 (Message-Digest Algorithm 5), de los datos de entrada

utilizando la implementacin proporcionada por el proveedor de servicios criptogrfico (CSP). Esta clase no se puede heredar. UTF8Encoding (Clase) Representa una codificacin UTF-8 de caracteres Unicode. TripleDESCryptoServiceProvider (Clase) Define un objeto contenedor para obtener acceso a la versin del proveedor de servicios criptogrficos (CSP) del algoritmo TripleDES (algoritmo que hace triple cifrado del algoritmo Data Encryption Standard) No se puede heredar esta clase. CipherMode (Enumeracin) Especifica el modo de cifrado de bloques que se utilizar para cifrar. PaddingMode (Enumeracin) Especifica el tipo de relleno que se aplica cuando el bloque de datos del mensaje es ms pequeo que el nmero total de bytes necesarios para una operacin criptogrfica. ICryptoTransform (Interfaz) Define las operaciones bsicas de las transformaciones criptogrficas. Despus de ver esto, creamos un proyecto de visual Studio de tipo Windows Application y ya una ves en el explorador de soluciones agregamos una nueva clase y ponemos el siguiente cdigo de una clase que yo ocupo para encriptar texto en mis aplicaciones, se llama CcryptorEngine, que tiene un atributo key de tipo string que es la clave que se necesita para cifrar y descifrar el texto, solo dos mtodos uno que encripta el texto y otro que lo descencripta, pero debemos recordar que el texto que sea cifrado con determinada clave solo se puede descifrar con la misma clave.
classCCryptorEngine { private string key; //constructor public CCryptorEngine() { /* Estableceruna clave. La misma clave debe ser utilizada para descifrar los datos que son cifrados con esta clave. pueden ser los caracteres que uno desee*/ key = "ABCDEFGHIJKLMOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz"; }

public string Encriptar(string texto) { //arreglo de bytes donde guardaremos la llave byte[] keyArray; //arreglo de bytes donde guardaremos el texto //que vamos a encriptar byte[] Arreglo_a_Cifrar = UTF8Encoding.UTF8.GetBytes(texto); //se utilizan las clases de encriptacin //provistas por el Framework //Algoritmo MD5 MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); //se guarda la llave para que se le realice //hashing keyArray = hashmd5.ComputeHash( UTF8Encoding.UTF8.GetBytes(key)); hashmd5.Clear(); //Algoritmo 3DAS TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.PKCS7; //se empieza con la transformacin de la cadena ICryptoTransform cTransform = tdes.CreateEncryptor(); //arreglo de bytes donde se guarda la //cadena cifrada byte[] ArrayResultado = cTransform.TransformFinalBlock(Arreglo_a_Cifrar, 0, Arreglo_a_Cifrar.Length); tdes.Clear(); //se regresa el resultado en forma de una cadena return Convert.ToBase64String(ArrayResultado, 0, ArrayResultado.Length); } public string Desencriptar(string textoEncriptado) { byte[] keyArray; //convierte el texto en una secuencia de bytes byte[] Array_a_Descifrar = Convert.FromBase64String(textoEncriptado); //se llama a las clases que tienen los algoritmos //de encriptacin se le aplica hashing //algoritmo MD5

MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash( UTF8Encoding.UTF8.GetBytes(key)); hashmd5.Clear(); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(Array_a_Descifrar, 0, Array_a_Descifrar.Length); tdes.Clear(); //se regresa en forma de cadena return UTF8Encoding.UTF8.GetString(resultArray); } }

Despus diseamos una Windows Form ms o menos as.

Ponemos Tres cajas de texto, tres etiquetas, tres botones y unas imgenes PNG de flechas, lo que hace el programa es que al dar clic al botn encriptar cifra el texto del primer textbox y lo muestra en el segundo y al dar clic al botn descencriptar descifra el texto y lo muestra en el ultimo textbox, esto se muestra en el siguiente cdigo.
private void button1_Click(object sender, EventArgs e) { //se agrega un bloque try catch //para prevenir cualquier error try { //se crea un objeto de la clase CCryptorEngine CCryptorEngine crypto = new CCryptorEngine(); //se cifra la informacin del textbox1 textbox2.Text = crypto.Encriptar(textbox1.Text); } catch(Exception ex) { MessageBox.Show("Ocurri un error: " + ex.Message); } } private void button2_Click(object sender, EventArgs e) { //se agrega un bloque try catch para //prevenir cualquier error try { //se crea un objeto de la clase CCryptorEngine CCryptorEngine crypto = new CCryptorEngine(); //se descifra la informacin del textbox2 textbox3.Text = crypto.Desencriptar(textbox2.Text); } catch(Exception ex) { MessageBox.Show("Ocurri un error: " + ex.Message); } }

Con esto ya tenemos una aplicacin que cifra y descifra texto y no solo se puede usar en Windows Forms yo lo he utilizado en paginas web en ASP.net, en mviles y en servicios web XML, todo esto en .Net, bueno espero esto le sirva a alguien. Saludos!!! Aqu dejo en link de mi SkyDrive para que bajen esta aplicacin con todo y su cdigo fuente link

Etiquetas de Technorati: cifrar y descifrar,C#

Posted: May 01 2009, 06:21 PM by Edgar Rafael Galicia Reyes | with 58 comment(s) Filed under: C#, Encriptar, Visual Studio 2008
value:Filed%20un

Modificar una variable de una Windows Form a otra Windows Form en C#

Hola, esto es algo muy sencillo pero en la escuela me lo han preguntado muchas veces y pues a lo mejor a alguien le sirva. La manera en que yo lo hago es poner el modificador de acceso (public, private, protected, etc) de la variable en public y as poder acceder a ella desde una Form1 a una Form2. Veamos el ejemplo. Suponemos que ya tenemos nuestro proyecto creado y con las 2 formas la Form1 y la Form2.

En diseador de la Form2 agregamos un control Label llamado label1 y lo ponemos en el centro de la Form2, a la label1 le cambiamos el tamao de letra al tamao 14.

Seleccionamos la Form2 en el diseador y damos doble clic sobre la Form2 para generar el prototipo del evento Form2_Load que es cuando la forma es cargada por primera vez. Despus en el cdigo de la Form2 que es el archivo Form2.cs escribimos el siguiente cdigo pero solo el que esta resaltado lo dems es generado automticamente por el IDE de Visual Studio.
namespace WindowsApplication1 { public partial classForm2 : Form { /*Esta es la variable que se va a modificar desde la otra forma se pueda accesar desde afuera*/ public string variable_a_modificar; publicForm2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { //Se muestra la variable en la label //cuando la forma es cargada label1.Text = variable_a_modificar; } } }

Y eso seria todo en la Form2, enseguida nos vamos a la Form1, donde en el diseador seleccionamos un control Button llamado button1 y lo ponemos en centro de la Form1.

A continuacin activamos el evento button1_Click del button1 dando doble click sobre el button1 y escribimos el siguiente cdigo.
private void button1_Click(object sender, EventArgs e) { //creamos un objeto de tipo Form2 llamado formaDos Form2 formaDos = newForm2(); //se modifica la variable de la Form2 desde la Form1 formaDos.variable_a_modificar = Saludos!!!!!!; //mostramos la formaDos formaDos.Show(); }

Con esto ejecutamos el programa oprimiendo la tecla F5 y al momento de hacer clic sobre el botn nos aparecer la Form2 y la etiqueta del centro estar modificada con en mensaje Saludos!!!!!!, que escribimos desde la Form1.

Espero esto le haya servido alguien, Saludos!!. Etiquetas de Technorati: Programacion,C#,Windows Forms Posted: May 01 2009, 06:06 PM by Edgar Rafael Galicia Reyes | with 1 comment(s) Filed under: C#, variables, Visual Studio 2008
value:Filed%20un

S-ar putea să vă placă și