lunes, 30 de enero de 2012

Agregar controles a formularios de forma dinámica (por código o en tiempo de ejecución) en .net con C#

El editor de Visual Studio nos permite tener un gran control granular de la interfaz que tendrá nuestra aplicación winforms en cuanto al manejo de controles se refiere, sin embargo es muy conveniente saber cómo podemos agregar nuestros propios controles al formulario en tiempo de ejecución (en forma dinámica o mediante código).

Probablemente no lo consideren necesario, pero es algo realmente útil por ejemplo si quieres crear una lista de imágenes en miniatura que genera las miniaturas a partir de las imágenes que contenga un folder, en cuyo caso es muy dificil controlar la cantidad de PictureBox que tendrá tu formulario a menos que se generen dinámicamente en tiempo de ejecución.

Nuestro ejemplo será precisamente ese, un formulario que genere las miniaturas de las imágenes que se encuentran en un folder determinado.

Primeramente creamos nuestro proyecto de tipo "Windows Forms Application".



El siguiente paso es personalizar nuestro formulario. En este ejemplo se agregó:
Controles iniciales.
TextBox: para conocer el folder del cual se extraerán las imágenes, se le llamo txtBxFolder
Button: para crear el cuadro de diálogo que nos permite seleccionar un folder, se le llamo txtFolder
Button: para ejecutar la acción de obtener las imágenes, se le llamó btnObtenerImg.

Para poder desplegar las imágenes necesitamos controles de tipo PictureBox y los colocaremos sobre un control del tipo FlowLayoutPanel. La razón es para evitarnos el problema de ir colocando los controles uno tras otro y que su posicionamiento cambie de acuerdo al tamaño de nuestra ventana. Se debe aclarar que generalemte los controles que agregamos dinámicamente deben de tener las propiedades del lugar donde se colocaran dichos controles.

Agregamos el control del tipo FlowLayoutPanel y lo llamaremos PanelImgs, el formulario resultante queda así:


A continuación crearemos el cuadro de diálogo que nos permitirá elegir un folder dentro de nuestro sistema de archivos, para eso debemos controlar el evento clic de nuestro botón btnSelectFolder y agregamos el siguiente código:

martes, 17 de enero de 2012

Manejo de Formularios MDI con C# y Visual Studio 2010 Express

Antes de iniciar debemos aclarar que existen dos tipos de Formularios:
SDI (Single Document Interface)
MDI (Multiple Document Interface)

Los Formularios MDI son aquellos que permiten contener otros formularios dentro de ellos.

Para crear una aplicación de tipo MDI primeramente tenemos que crear nuestro proyecto (Aplicación de Windows).
En el formulario principal debemos establecer la propiedad IsMdiContainer a True.

Formulario Principal


Posteriormente debemos Crear el formulario base que será la plantilla que tendrán nuestros formularios child. En nuestro caso hemos tratado de simular un editor de texto bastante simple pero con soporte MDI.

Agregamos un nuevo formulario a nuestro proyecto.

Agregamos un primer panel en la parte inferior que podrá contener botones si así lo deseamos, para hacer eso establecemos la propiedad Dock del panel en Bottom.


Después agregamos un segundo panel que contendrá nuestro cuadro de texto y establecemos la propiedad Dock en Fill.



Agregamos nuestro textbox y lo renombramos a txtBoxContent y establecemos su propiedad Dock en Fill.





Agregamos un botón al panel de la parte inferior que sera la simulación de un botón que servirá para guardar nuestro documento. Con esto tendremos nuestro formulario base.

Formulario Base


Ahora crearemos un menú para tener una administración muy sencilla de las ventanas child (en el formulario Principal). Observemos que la opción "Lista ->"  no tiene subelementos ya que los crearemos en tiempo de ejecución

.

miércoles, 9 de noviembre de 2011

Modelo de datos desconectado - ADO.NET

Dentro de la arquitectura de ADO.NET existe una muy buena característica que se ajusta especialmente a ambientes de tipo WEB: Modelo de datos desconectado.

En esta entrada hablaremos de una forma muy superficial este tema, lo suficiente para entenderlo y saber qué es.

Primeramente estableceremos que en el modelo de datos desconectado, a diferencia del modelo tradicional, se solicita una copia de los datos a manipular a la fuente de datos central; posteriormente, estando offline modificamos los datos y nos reconectamos a la fuente de datos para reflejar los cambios que hicimos offline. Los cambios únicamente son reflejados si todas las restricciones se cumplen (homogeneidad, concurrencia, etc).

Una de las ventajas de este modelo es que no necesitamos una conección constante a nuestra fuente de datos, lo que libera los recursos de la fuente de datos central y hace posible que se atienda un mayor número de peticiones para datos compartidos.

 ADO.NET utiliza cachés de datos que almacena en memoria, lo cual elimina la necesidad de hacer locks a las bases de datos para proteger la integridad de los datos. Otra ventaja es que facilita el intercambio de la información entre capas (en caso de tener una arquitectura orientada a capas).

Los tipos de datos utilizados en las aplicaciones ADO.NET son fuertemente tipados, lo que elimina la sobrecarga de procesamiento en conversiones de tipos de datos y facilita el entendimiento del código.

martes, 11 de octubre de 2011

SecureString - Almacenar contraseñas en memoria de forma segura en .net.

En mi caso y espero que no sea su caso (por lo de la contraseña), al desarrollar las aplicaciones que se conectarán a una base de datos me gusta tener una clase que me administre la conexión a la Base de Datos y todos los campos que ésta necesita (incluyendo la contraseña de acceso).  Para evitar almacenar la contraseña en memoria en un tipo string podemos utilizar SecureString [System.Security.SecureString].

Uno de los puntos importantes es que SecureString implementa CriticalFinalizerObject, lo cual significa que SecureString se considera una Región de ejecución restringida (Constrained Ejecution Region - CER) lo que significa que las excepciones de tipo out-of-band estan prohibidas en regiones de tipo CER por lo que evitamos que cierta parte del código no se ejecute (con el fin de liberar de memoria el objeto SecureString llamando la función Dispose()). Se debe tener en cuenta que SecureString se mantiene en una región no administrada de la memoria, por lo que es nuestra responsabilidad liberar ese recurso.

Nota: Considera que no tiene caso almacenar una contraseña o cualquier dato sensible en un  string y pasarlo como parámetro para agregarlo a un objeto SecureString si no eliminamos de memoria ese string inmediatamente despues de utilizarlo.

Utilizar SecureString.

una de las formas en que podemos utilizar SecureString en combinación con las propiedades (get & set):

En mi caso marqué la propiedad get como privada para accesar únicamente desde la misma clase.
 Es importante volver a decir que no debemos almacenar permanentemente una copia de la contraseña en memoria.




martes, 27 de septiembre de 2011

Crear un Web Service básico con C# y Visual Studio Web Developer 2010 (Express)

Teniendo Visual Studio Web Developer 2010 (lo puedes descargar gratis de la página oficial de Microsoft) podemos desarrollar nuestros propios Web Services de una forma muy sencilla.

En el ejemplo mostrado corremos nuestro Web Service bajo nuestro propio servidor IIS en XP.

Si no tienes noción sobre los Web Services te recomiendo una ligera lectura con la que tendrás una mejor idea de lo que se trata.

Primeramente crearemos un nuevo sitio web, damos clic en el boton "Browse..."











Posteriormente seleccionamos "Local IIS", "Default Web Site", "Create new Web Application", le asignamos un nombre y damos clic en "Open".





Damos clic en el botón "OK" de la ventana New Web Site.






Creando el Web Service.

En nuestro Explorador de soluciones damos clic con el botón derecho en el Web Site y seleccionamos "Add New Item..."

lunes, 26 de septiembre de 2011

¿Qué es un Web Service? - Introducción

Probablemente ya habrás escuchado hablar sobre los Servicios Web [Web Services], aquí intentaremos explicar brevemente y de una forma muy sencilla qué son esos Web Services.

Iniciaremos diciendo que los Web Services nos permiten la interoperabilidad entre dos dispositivos sobre una red mediante un esquema Cliente-Servidor.

Debido a que la comunicación es  con estándares XML los Web Services no dependen de ninguna plataforma, Sistema Operativo o Lenguaje de Programación; por lo que yo pudiera tener un cliente desarrollado en .net y corriendo bajo Windows XP y consumir un Web Service desarrollado en Java y corriendo bajo Linux, es por esa razón que los Web Services se utilizan ampliamente en el uso de "Sistemas Distribuidos".

La mayoría de los Web Services utiliza HTTP y HTPPS para poder transmitir mensajes (tanto de solicitud como de respuesta).

Actualmente las grandes empresas utilizan Web Services para poder establecer comunicación en un esquema Cliente-Servidor que permita la transmisión de objetos mediante la serialización XML, esto significa que transforman el Objeto en memoria a una versión XML que puede ser transmitido a través de HTTP y al recibir el mensaje XML se puede volver a instanciar un objeto con las características originales que se describieron en el mensaje XML.

SOAP es el protocolo base que define la forma en que se transmitirán los mensajes; está basado en XML.

viernes, 23 de septiembre de 2011