Archivo de la etiqueta: Windows Form

Cargar DLL de forma dinámica


 

Problemática: Tengo una aplicación grande, y varios grupos de desarrolladores que necesitan incluir sus despliegues al mismo sistema. Es basado en WindowsForm, y estamos administrando los módulos a través de un formulario MDI.

Adicional es necesario que por cada usuario final que ingrese al sistema se cargue el formulario asociado a su perfil. Por lo tanto se plantea lo siguiente, tener una sola aplicación base donde estará el formulario MDI, para que los demás grupos de desarrolladores interactúen con este proyecto, cada grupo hará su proyecto basado en DLL, las mismas tendrán los procesos que a cada módulo corresponda con sus respectivas pantallas o formularios. Luego estas se incluirán dinámicamente al proyecto principal.

Pues bien, va lo primero, crear el aplicativo principal, es decir, el que tendrá el formulario MDI donde estarán los demás módulos.

Trabajaremos con Visual Studio 2013, un proyecto de tipo WindowsForm

TipoProyecto

Le damos un nombre, en este caso es Demo.WF.MDI, y agregamos un nuevo elemento al proyecto que sería un formulario tipo MDI que servirá como contenedor de los formularios de todos los equipos de trabajo que trabajan alrededor de este proyecto.

AgregaMDI

Quedaría así

ProyectoMDIDonde el formulario de nombre “Principal.cs” es precisamente el de tipo MDI que contendrá las demás ventanas.
El formulario “FrmInterna.cs” es el formulario que viene de forma predeterminada al crear el proyecto.
El archivo “App.config” es donde se imprimen configuraciones globales del proyecto y de los ensambladores que se referencian.

 

Y el archivo “Program.cs” es la clase de inicio del proyecto.

Listo, ahora agregamos a la solución otro proyecto tipo Ensamblador, este tipo de proyectos no tiene puntos de entrada como el anterior que es en el “Program.cs”

Sobre la solución se da clic derecho y en el menú vamos a la opción “Agregar” y luego “Nuevo Proyecto”.

AgregaDLL

Le damos un nombre a este proyecto y le damos aceptar, esto agrega a la solución el proyecto y queda como vemos en la siguiente figura.ProyectoDLL

Le he agregado 2 clases de tipo formulario para realizar este ejemplo, la “App01.cs” y la “App02.cs”

Adicional le he eliminado los archivos que vienen de forma predeterminada al crear un proyecto de este tipo.

A cada formulario agregado le he colocado un botón, la acción del mismo es salir del formulario (this.Close();).

Crearemos un pequeño modelo de objetos EF (EntityFramework) donde se incluirá la información del menú que se cargará de forma automática cuando inicie el sistema. Existirá un formulario de inicio de sesión, cuando ingrese el usuario 1 se cargarán todas las aplicaciones y el usuario 2 solo unas cuantas. No se creará el mantenimiento de estos perfiles, lo manejaremos directamente en la base de datos. Quizá haga otro post de este tema de perfiles.

AgregarComponentes Tenemos como quedaría el Proyecto, en el recuadro azul hemos creado una carpeta con nombre “Base”, en la cual hemos creado el modelo de objetos, a partir del mismo generamos la base de datos en un servidor de SQL Server, y adicional hemos creado un script para insertar la información necesaria para que el sistema opere, dado que este demo no contempla el mantenimiento de las tablas creadas.

En el recuadro café hemos creado el formulario que hará de inicio de sesión de nuestro Demo, es aquí donde cargaremos al usuario validado con su respectivo perfil, en el cual ya estará configurado los accesos por usuario.

Aquí está el modelo de objetos, como vemos tenemos 3 objetos: Usuario, Perfil y Funcionalidad, en el primero tendremos información del usuario que ingresará al sistema, este tendrá configurado un perfil y a su vez, dicho perfil tendrá asignado varias funcionalidades, las mismas solo abarcarán hasta definir qué formularios puede o no ver el usuario validado para efectos del Demo.

ModeloObjetos

A partir de aquí se generará la base de datos de forma automática, la misma creará 3 tablas asociadas a cada objeto y adicional 2 tablas más que harán de relaciones para los objetos, tal como se ve en la siguiente figura.

BaseDatos

En la tabla “Funcionalidad” está la información que se usará para cargar los formularios de forma dinámica, queda así:

FuncionalidadLos nombres son descriptivos, en el campo “Ruta” estoy ingresando la dirección física con el nombre de la DLL para cada instalación, obviamente para que esto funciones en cada máquina que se instale debe tener la misma dirección física. Para el campo “NombreLogico” no es más que el NameSpaces incluyendo el nombre de la clase Form a la que hacemos referencia para que se cargue. Esta tabla es recursiva, y cada registro tiene un registro asociado padre que es el menú de quién depende, si nos fijamos esta consta solo de 3 niveles.

Pues bien, así sería el proceso de como el usuario hace interacción con el sistema y como el sistema hace para cargar los formularios.

image De los procesos y subprocesos se explicará brevemente el tercero (inicia el logon y carga usuario con perfiles) y el sexto (carga los formularios por medio de los ensambladores).

Como dice el flujo desde el formulario MDI se pregunta si tenemos el usuario autenticado con la condición que tenga por lo menos asignado 1 perfil, sino es así pasa al Logon.

Proceso1 En el código, luego que el usuario validó su credenciales, asigna el objeto a “usuarioActivo” y empieza a realizar la construcción de los menús dependiendo de los perfiles. Como hicimos un modelo de objetos EF y relacionamos al usuario con los perfiles y este a su vez con las funcionalidades, si cargamos al usuario, el mismo trae consigo todos los objetos relacionados y podemos escribir código como el siguiente.

Proceso2 Luego agregamos los formularios al menú por medio del método “AgregaMenuHijo”

Proceso3 Ahora veremos la carga del ensamblado de forma dinámica, como vemos se le pasa la ruta física y el espacio de nombres incluido el nombre de la clase de tipo Form.

Proceso4 Y listo, de un formulario que en diseño se ve sin menú, luego se poblará con el menú según el perfil de la persona.

Resultado

Este es el resultado visual de nuestra demo. Si desean el fuente completo con base y datos de prueba, déjame tu correo.

Espero les sirva.

Anuncios

Agregar dígito a tus contactos de Outlook


Hola a todos, hoy quiero mencionar algo que ocurrió en Ecuador, pues resulta que hay tantas personas con un número celular que la numeración estaba a punto de terminarse y la entidad correspondiente decidió aumentar 1 dígito a todos los números de celular para resolver el problema.

Pero esto significa que tooooodos los usuarios debían actualizar sus agendas porque sino el 1 de octubre no podrían llamar a ningún contacto registrado en cada celular.

Para esto las operadoras dieron una solución para los teléfonos que más comercializan, como son los BlackBerry, Symbian, Android, y IPhone a travésde varios mecanismos, pero hay un grupo de personas que utiliza WindowsPhone (como yo…. y conozco algunos más) que no entraron con este beneficio, entonces supongo que algunos se tomaron la molestia de actualizar sus contactos 1 a 1…, terrible…

Como estoy en la misma colada (como se dice acá) me puse algo ingenioso para buscar una solución mas rápida a la actualización de mi agenda. Pensé en varias opciones como construir una app que se conectara directamente al servicio de contactos de Windows Live y actualizarlo mediante código, utilizando las api de Live Connect, pero esta versión solo es para Windows 8 y/o Windows phone y aunque tengo mi Win8 instalado quizás no todos lo tengan. Entonces decidí hacerlo un poco mas rústico el tema.

La idea fue realizar una exportación de contactos del correo luego a través de código C# modificar el campo del número de teléfono aumentando el dígito en la posición necesaria y listo. Después de esto solo quedaba importar el archivo modificado, pero iban a dar conflictos con los contactos existentes y para variar no hay manera de realizar una eliminación masiva desde internet.

Mi idea era exportar los contactos, modificarlos con mi app, luego eliminar todos mis contactos en mi correo. Y seguido importar los contactos modificados. Maestro verdad….. Jajaja

Luego me topé con otro dilema…, aparentemente es imposible eliminar mis contactos de forma masiva desde la Web, entonces configure el cliente MS_Outlook con mi cuenta de correo, luego eliminé mis contactos y acto seguido subí los contactos importando el resultado de mi App desde la web.

Y resultó, luego pongo el código de mi App.

Crear un reporte en reporting services y ligarlo con un proyecto de Windows en .Net (Parte2)


En la parte 1 vimos como crear un proyecto de Reporting Services con un reporte básico. Ahora veremos como hacer que en una ventana de windowsForm se visualice el reporte creado.

Inicialmente agregamos un proyecto de windowsApplications a nuestra solución actual.

image

image

Ponemos el diseñador del formulario que aparece en forma predeterminada en la solución y agregamos en el:

1 ReporViewer de nombre rpwReporte,

1 Botón con la etiqueta “Actualiza” de nombre btnActualiza,

2 Label de nombre lblServer y lblReporte,

2 TextBox de nombre txtServer y txtReporte.

image

En el evento clic del botón que creamos con nombre btnActualiza agregamos el siguiente código.

image

Con esto, de manera de código configuramos nuestro formulario para que se presente un reporte dependiendo de las direcciones que ingresemos en las cajas de texto.

Ahora bien, qué ponemos en las cajas de texto???

El nombre del server, debe ser la dirección web de donde se ha publicado el reporte, que puede ser “http://localhost/reporteserver” y en reporte “/MisReportes/MiReporte”, siendo “MiReporte” el nombre del mismo.

Pero esto es una forma, lo que se puede también hacer es poner estos valores en el archivo app.config de la aplicación de la siguiente manera.

image

Luego nuestro código cambiaría así:

image

Bueno, esto es todo en esta segunda parte, creo que me ha faltado algo… mmmmmmmmm, sí, nunca publicamos el reporte en ser servidor de Reporting Services. En la tercera parte veremos eso y espero que les sirva.

Nos vemos.

Crear un reporte en reporting services y ligarlo con un proyecto de Windows en .Net (Parte1)


Primero creamos un proyecto Windows con un form, luego a la solución creada le damos clic derecho a agregar nuevo proyecto de Business Intelligence

clip_image002

clip_image004

Luego agregamos un origen de datos

clip_image006

Lo configuramos con la base de datos que nos vamos a conectar, es nuestro caso SQL Server.

clip_image008

Agregamos un nuevo elemento de informe.

clip_image010

clip_image012

Damos en agregar y se crea un informe en blanco en el proyecto.

Ahora, vamos a crear un origen de datos que será específicamente del reporte. Anteriormente habíamos ya configurado un origen de datos, pero este es a nivel de proyecto, este nuevo será a nivel de reporte el cual hará referencia al de proyecto.

Esto es así porque uno puede crear orígenes de datos compartidos o específicos para un reporte, sin embargo, en este caso se crea un reporte y se configura para que utilice la configuración del origen de datos compartido. Espero se entienda, sino lo veremos en las gráficas como va.

Del lado derecho de la pantalla podemos ver la ventana de “Datos de informe”, en el cual creamos el origen de datos vinculando con el compartido que creamos al inicio.

clip_image014

clip_image016

Luego creamos el DataSet (conjunto de datos) que emplearemos en el reporte.

clip_image018

Y veremos del lado derecho un conjunto de datos para incluir en el reporte.

clip_image020

Luego utilizaremos un control de Tabla y lo arrastramos dentro del reporte.

clip_image022

Luego arrastramos los campos a la tabla.

clip_image024

Y damos clic en vista previa.

clip_image026

Con esto terminamos un reporte que solo consulta un “select”

 

Ir a Parte 2

Tomar valores del archivo .config en .Net


 

Para tomar valores del archivos .config de la aplicación .net que estemos desarrollando necesitamos antes crear estos valores de la siguiente forma:

 

image

Primero está la sección de las conexiones a la base de datos, acá se puede almacenar N conexiones dependiendo de lo que necesitemos. Además tenemos la sección de las variables de la aplicación “appSettings”.

 

Luego de configurar en archivo .config, para leerlo desde nuestra aplicación solo necesitamos de las siguientes líneas.

image

 

No olvidar antes tener referenciado el componente System.configuration en su aplicación y hacer un “using System.Configuration;” en la parte inicial de la página de código.

Espero les haya servido.