Está en la página 1de 8

Gestin de una aplicacin completa con .

NET
Servicio de Informtica

TEMA 9: Controles dinmicos y objetos persistentes


Objetos persistentes........................................................................................................................1 Introduccin.................................................................................................................................1 Serializacin de clases................................................................................................................2 Asignacin y lectura de ViewState...............................................................................................3 Variables de sesin y aplicacin..................................................................................................4 Cambiar la ubicacin de almacenamiento...................................................................................4 Controles dinmicos........................................................................................................................5 Agregar controles dinmicamente a un formulario.......................................................................5 Propiedades ms comunes......................................................................................................5 Paneles........................................................................................................................................6 Cajas de Texto............................................................................................................................6 Etiquetas......................................................................................................................................6 Botones y gestin de eventos......................................................................................................7 Controles en una pgina..............................................................................................................7

Objetos persistentes
Introduccin
Por necesidades de una aplicacin nos puede interesar mantener un objeto con los mismos datos entre diferentes envos de datos (postbacks).. Por ejemplo supongamos que tenemos un objeto ClaseAlumnos sobre el que realizamos numerosas operaciones en distintas pginas de nuestra aplicacin web y damos la opcin al usuario de guardar esos cambios en la base de datos en cualquier momento mediante un botn de guardar. Nos sera de gran utilidad mantener una instancia de ClaseAlumnos que se mantenga durante todo el proceso hasta que el usuario decidiese almacenar sus datos en la base de datos (o rechazar los cambios). De esta forma slo accederamos a la base de datos al principio, para cargar los datos y al final, para guardarlos, manteniendo todos los datos almacenados en la instancia, sin preocuparnos de crear campos ocultos para ir pasando los datos de una pgina a otra.
personales.aspx expediente.aspx economicos.aspx

Cargar Datos

Modificar Datos personales

Modificar Datos Expediente

Modificar Datos Econmicos

Guardar Datos

alumnoActual = new ClaseAlumno(id); alumnoActual.Carga();

alumnoActual.Guarda();

Tema 9 / Pgina 1

Gestin de una aplicacin completa con .NET


Servicio de Informtica

Las pginas web de ASP.NET tiene una tcnica para mantener los cambios de estado entre envos de datos, llamado Viewstate. Viewstate almacena el estado de los controles de un formulario web para poder recuperarlos despus de un reenvo. Por defecto en un campo oculto del formulario llamado _VIEWSTATE. Podemos aprovecharnos de esta caracterstica para almacenar nuestros objetos en el viewstate y recuperarlos despus de un envo de datos.

Serializacin de clases
Para poder poder pasar un objeto de un envo a otro se necesita que el objeto sea transformable en una cadena de texto. Esto se hace mediante la directiva Serializable que pondremos antes de la declaracin de la clase. Por ejemplo en nuestra clase de alumno pondramos:
[Serializable] public class ClaseAlumno { private int _numeroExpediente; private int _nombre;

...

Si una clase tiene como variables miembro otras clases estas tambin tienen que ser serializables. Por ejemplo si la clase de alumno tuviese una variable miembro del tipo clase expediente:
[Serializable] public class ClaseAlumno { private int _numeroExpediente; private int _nombre; private ClaseExpediente _expediente;

... Tendramos que modificar tambin est ltima


[Serializable] public class ClaseExpediente { int _codigoEstudio;

Ahora ya se puede transformar las instancias de la clase en una cadena de texto para ser enviado de pgina a pgina.

Tema 9 / Pgina 2

Gestin de una aplicacin completa con .NET


Servicio de Informtica

Si intentamos guardar en ViewState un objeto de una clase que no est marcada como serializable obtendremos el error: El tipo 'NombreDeLaClase' del ensamblado 'App_Code.axi01zgc, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' no est marcado como serializable

Asignacin y lectura de ViewState


Para almacenar un objeto en el ViewState simplemente le asignamos una clave y lo agregamos con:
ViewState["elAlumno"] = elAlumno;

y para leerlo realizaremos la operacin contraria pero aadiendo conversin de tipos


elAlumno = (ClaseAlumno) ViewState["elAlumno"];:

Ejemplo, nos guardamos un objeto alumno en viewstate y lo leemos si hay envo de datos
ClaseAlumno elAlumno; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { elAlumno = new ClaseAlumno(); elAlumno.Nombre = "Pepe"; elAlumno.Apellidos = "Garca Lpez"; ViewState["elAlumno"] = elAlumno; Consola.Text = "<br />" + elAlumno.Nombre + " " + elAlumno.Apellidos + " guardado en View State"; } else { elAlumno = (ClaseAlumno) ViewState["elAlumno"]; Consola.Text = "<br />" + elAlumno.Nombre + " " + elAlumno.Apellidos + " ledo de View State"; } }

Tema 9 / Pgina 3

Gestin de una aplicacin completa con .NET


Servicio de Informtica

Variables de sesin y aplicacin


Podemos almacenar objetos en variables de sesin y aplicacin aunque estos no estn etiquetados como serializables. Guardar un objeto
Session["laAlumna"] = laAlumna;

Recuperarlo
laAlumna = (ClaseAlumno)Session["laAlumna"];

Cambiar la ubicacin de almacenamiento


Podemos alterar nuestra aplicacin para que el estado de los controles (ViewState) se almacene en el estado de la sesin en vez de en un campo oculto de la pgina. Para ello sobrescribimos la propiedad PageStatePersister de la siguiente forma:

protected override PageStatePersister PageStatePersister { get { return new SessionPageStatePersister(this); } }

Tema 9 / Pgina 4

Gestin de una aplicacin completa con .NET


Servicio de Informtica

Controles dinmicos
Puede ser que a priori no conozcamos los controles que vamos a mostrar en una pgina, que estos dependan por ejemplo de ciertos valores que tenemos en una base de datos y que cambian en distintas ejecuciones de la pgina. Por ejemplo si mostramos un formulario para modificar los datos de un alumno y sus estudios. Hasta que no sepamos el alumno que vamos a modificar no sabremos cuantos ni que estudios tiene por lo que los controles de la pgina tendrn que generarse al vuelo.

Agregar controles dinmicamente a un formulario


Para agregar controles a un formulario necesitaremos un panel o cualquier otro contenedor para insertarlos. El mecanismo ser siempre el mismo: creacin del control, asignarle valores y agregarlo a la lista de controles del contenedor.
Control miControl = new Control(); miControl.Propiedad = "Valor"; Contenedor.Controls.Add(miControl);

Propiedades ms comunes
A continuacin se muestran algunos de las propiedades ms comunes que se aplican a los controles
AutoPostBack Indica si se produce una devolucin automtica de datos cuando el control cabia ClientID Identificador del control de servidor generado por .NET CssClass Estilo que se le va a aplicar al control Enabled Establece si esta habilitado o no

EnableViewState
Indica si tiene que mantener su valor entre reenvos ID Obtiene o establece el identificador de programacin Page Obtiene una referencia a la pgina que contiene el control Parent Obtiene una referencia al control que contiene al actual

Tema 9 / Pgina 5

Gestin de una aplicacin completa con .NET


Servicio de Informtica

ReadOnly Obtiene o establece si el control es de slo lectura SkinID Identificador del skin para el control Text Contenido del control Visible Obtiene o establece si el control es visible o no

Paneles
Utilizaremos los paneles como contenedores de otros controles
Panel Datos = new Panel(); Datos.ID = "DatosAlumno"; Datos.CssClass = "panelDatos"; Contenedor.Controls.Add(Datos);

El cdigo de cliente que me generara sera simplemente:


<div id="DatosAlumno" class="panelDatos"> </div>

Cajas de Texto
Para que el usuario introduzca datos
TextBox textBoxTitulo = new TextBox(); textBoxTitulo.ID = "TextBoxTitulo"; textBoxTitulo.Text = "Pon el titulo"; Datos.Controls.Add(textBoxTitulo);

Etiquetas
Para poner bloques de texto en los formularios. Podemos asociarlas a otro control.
Label titulo = new Label(); titulo.Text = "Titulo"; titulo.AssociatedControlID = "TextBoxTitulo"; Datos.Controls.Add(titulo);

Como se puede observar en los ejemplos estamos aadiendo los controles al primer control creado, el panel Datos, que a su vez es un control del panel Contenedor.

Tema 9 / Pgina 6

Gestin de una aplicacin completa con .NET


Servicio de Informtica

Botones y gestin de eventos


Podemos crear dinmicamente controles que generen eventos como los botones Para gestionar los eventos agregaremos un gestor de eventos al evento que queramos tratar de la forma:
nombreControl.Evento += new EventHandler(MetodoAejecutar);

Luego nos tendremos que crear el mtodo que trata el evento:


void MetodoAejecutar(object sender, EventArgs e) { // Bla bla bla }

Un ejemplo con un botn sera:


Button botonAceptar = new Button(); botonAceptar.Text = "Aceptar"; botonAceptar.CausesValidation = false; botonAceptar.Click += new EventHandler(botonAceptar_Click); Datos.Controls.Add(botonAceptar);

y el gestor
void botonAceptar_Click(object sender, EventArgs e) { // Gestionar evento }

Controles en una pgina


Podemos recorrer todos los controles que hay en una pgina o en otro control mediante la coleccin Controls. Por ejemplo si queremos saber el identificador de los controles contenidos en el Panel Datos:
foreach (Control elControl in Datos.Controls) { } Label1.Text +="<br />Control: " + elControl.ID;

Si queremos saber si un control contiene otros utilizaremos el mtodo HasControls


if (Datos.HasControls())

Tema 9 / Pgina 7

Gestin de una aplicacin completa con .NET


Servicio de Informtica

Para buscar un control en una pgina o en otro control se utiliza el mtodo FindControl. Este mtodo recibe como parmetro el identificador del control y devuelve el control. Busca en toda la jerarqua de controles:
TextBox elTextBox = (TextBox) Page.FindControl("TextuuuBoxTitulo");

Tema 9 / Pgina 8