martes, 1 de abril de 2008

Ds - Dt vs2005 - Interfaz

DataSet/DataTable tipados y Table Adapter con Visual Studio 2005 y 2008
Introducción- Data Label- Capa de Datos- Capa de Negocios- UI Interfaz

Creando la interfaz que consumirá las Capas creadas

Como ultimo paso, vamos a consumir la información y realizar las transacciones correspondientes a consultas de datos. Las transacciones de actualización de información se las dejo a ustedes.

Como requisito previo para este ejemplo necesitamos tener creado por lo menos un registro de empleado y un registro de usuario para realizar las consultas de despliegue de este.

Podríamos definir la interfaz en una aplicación web o en wpf, pero requeriría mucho trabajo y como estamos entregando lineamientos metodológicos de arquitectura de programación, me centraré en esta idea y agregaremos a la solución una aplicación de tipo windows en C#

Para esto, nos posicionaremos en el explorador de lasolución, sobre el nombre de esta y con el botón derecho del mouse seleccionaremos la opcion Nuevo/Agregar nuevo proyecto y seleccionaremos una aplicación de windows form, la cual llamaremos WinApp, como se muestra en la siguiente figura:





En el formulario por defecto agregaremos los siguientes controles:

ListBox lbxUsuario;
TextBox txtNombre;
TextBox txtAppPrimero;
TextBox txtAppSegundo;
TextBox txtFechaActivacion;
Label lblNombre;
Label lblAppPrimero;
Label lblAppSegundo;
Label lblFechaActivacion;


Quedando el formulario de la siguiente forma:

El siguiente paso es picar código, ahunque podríamos realizar las referencias desde los objetos, pero esto presenta algunos problemitas, si existe problemas en la ejecución la aplicación fallará y deberemos crear manejadores de errores el un archivo general, lo cual lo veremos más adelante y, adicionalmente, prefiero picar el código para hacer estas cosas, por que es más controlado y podemos tener un código más transaprente.



Para esto habilitaremos dos métodos que adienten eventos:
  • Un método que atienda el evento de carga del formulario (Load)
  • Un método que atienda el evento select del listbox (SelectedIndexChanged)


Los métodos que deben crearse y que se generan al seleccionar los objetos despues del construtor son:

private void Form1_Load(object sender, EventArgs e)
{
}


private void lblUsuario_SelectedIndexChanged(object sender, EventArgs e)
{
}



Hasta aquí todo bien, lo siguiente es tener accesibilidad a las capas que hemos creado, para ello agregaremos dos referencias en el proyecto, una ac CapaDato y otra a CapaNegocio.
Desde la aplicación Windows utilizaremos las estructuras creadas para rescatar la información retornada desde la Capa de Negocio y Capa de Negocio a su vez necesita realizar las solicitudes a Capa de Datos para que esta realice las transacciones a la Base de Datos. Para los que no se recuerdan como agregar referencias, les pongo dos imágenes de como se debe hacer.


Primero seleccionamos con el botón derecho del mouse, sobre el proyecto al que se desea agregar las referencias la opción agregar referencia, como se muestra a continuación



Al seleccionar esta opción, se nos abrirá la ventana que nos permitirá realizar esta acción, para este casoseleccionaremos la pestaña Proyectos y seleccionaremos el o los proyectos que deseamos referenciar, en esta caso serán CapaDato y CapaNegocio y seleccionaremos aceptar, como se muestra a continuación.





Si revisamos en el explorador de soluciones, en el proyecto en cuestión al que se le están agregando las referencias, veremos que se han agregado estas, como se muestra a continuación:




Nos queda poco, solo nos falta picar el código y probar, el código lo pongo a continuación:

En el método que atiende el evento load de la pagina, agregaremos las siguientes líneas de código:


private void Form1_Load(object sender, EventArgs e)
{
try
{
CapaDato.dsEmpleado.lnqUsuarioDataTable dt = new
CapaDato.dsEmpleado.lnqUsuarioDataTable();
CapaNegocio.clsEmpleado cls = new CapaNegocio.clsEmpleado();
dt = cls.fnUsuarioLista();
if (dt.Rows.Count>0){
this.lbxUsuario.DataSource = dt;
this.lbxUsuario.DisplayMember = dt.usuLoginColumn.ToString();
this.lbxUsuario.ValueMember = dt.empCodigoColumn.ToString();
}
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}



ANALISEMOS EL CODIGO

  • Primero definimos una variable del tipo de datatable lnqUsuario, esto es para cargar la información que se retorna desde la Capa de Negocio.
  • En segundo lugar creamos una instancias a la clase de la Capa de Negocio que contiene el método que debemos llamar para realizar la carga de datos.
  • Luego se realiza la llamada al método específico y el resultado se carga en la variable que tiene la misma estructura de lo retornado.


Bueno el resto del código se explica por si solo.

Si ejecutamos la aplicación y tenemos registro asociados, la información se verá de la siguiente forma:


Lo ultimo es habilitar el código de consulta del empleado en custión seleccionado, para ello deben agregar el siguiente ´codigo en el método que atiende el evento SelectedIndexChanged del control ListBox:


private void lblUsuario_SelectedIndexChanged(object sender, EventArgs e) {
int idx = -1;
try { idx = (int)this.lbxUsuario.SelectedValue; }
catch{ idx = -1; }
try {
if (idx>-1){
CapaDato.dsEmpleado.lnqEmpleadoDataTable dt = new
CapaDato.dsEmpleado.lnqEmpleadoDataTable();
CapaNegocio.clsEmpleado cls = new CapaNegocio.clsEmpleado();
dt = cls.fnUsuarioConsultar(idx);
if (dt.Rows.Count > 0){
this.txtNombre.Text = dt[0].empNombre.ToString();
this.txtAppPrimero.Text = dt[0].empApellidoPrimero.ToString();
this.txtAppSegundo.Text = dt[0].empApellidoSegundo.ToString();
this.txtFechaActivacion.Text = dt[0].empFechaActivacion.ToString("dd/MM/yyyy");
}
}
}catch (Exception ex){
MessageBox.Show(ex.Message);
}
}


ANALISEMOS EL CODIGO

Bueno amigos, aquí he tenido que hacer un arreglin, que por falta de tiempo no lo he solucionado así que esta tarea se las dejo a ustedes.

El try catch que se ha agregado al inicio se define para controlar la primera entrada de carga, ya que al asignar el origen de datos, se instancia el método que atiende el evento selectedindexshange y como en este momento no tiene la información cargada, al rescatar el selectedvalue entrega System.Data.DataRowView, lo cual no nos sirve, así que he creado un condicionador con el control de errores (ocurrente no???).

  • Bueno lo demás va por la misma línea, creamos una variable con la estructura de la información que deseamos rescatar.
  • En segundo lugar creamos una instancias a la clase de la Capa de Negocio que contiene el método que debemos llamar para realizar la carga de datos.
  • Luego se realiza la llamada al método específico y el resultado se carga en la variable que tiene la misma estructura de lo retornado.

Bueno amigos a ejecutar y suerte, a mi me funciona.

5 comentarios:

Anónimo dijo...

Hola, en primera, felicitarte por tu aporte. Mi cosulta es la sgte, si quisera modificar por ejemplo en mi base de datos, el nombre de un campo o agregar mas campos a una tabla, esto implicaria modificar en cada capa e incluso parte del codigo. ¿Cómo puedo evitar realizar muchos cambios y mejorar esta dificultad.
Gracias

Mario Roa dijo...

La verdad es que creo que esta accion no se puede llevar a cabo desde una capa de datos de proyecto, ya que cuando mapeas una tabla, por detras se está creando una select que rescata los campos que deseas modificar, permitiendote crear un método fill y un metodo getdata. Recuerda que un DataTable es creado en relación a un conjunto de datos de una o muchas tablas. Debo destacar que antes de ponerte a programar debes tener bien clara la estructura de tu modelo entidad relación, lo cual facilitará la modificación de los campos que se mapeen desde tu Dataset. Es por esto que la mejor forma de programar las capas es OO, por que es más facil realizar modificaciones de los mismos en todos los niveles

Pedro Tablas dijo...

Pues yo estoy aprendiendo c# y esta muy interesante tu aporte espero seguir este blob tambien me intereso ya que dice que posiblemente va a poner unaporte donde comentes como programar Orientado a Objetos seguire el block y gracias....

Anónimo dijo...

Estoy aprendiendo c# y esta interesante tu aporte te felicito y seguire tus block ya que comentas que escribiras unaporte donde mensionaras como programar o.o. grax

Anónimo dijo...

TODO FUNCIONA SOLOQUE NO MUESTRA LOS CAMPOS EN LOS TEXTBOX PERO SI MUESTAR LA LISTA EN EL LIST BIX MUY BIEN APORTE GRACIAS ESPERO EL BLOK DE APRENDER A PROGRAMAR EN ORIENTADO A OBJETTOS