CLR: .Net / Mono / Boo / Otros CLR > ASP .NET

 Viewstate No Guarda Los Datos

(1/2) > >>

Javier Santamaria:
Hola,

Tengo un pequeño problemilla, estoy desarrollando un aaplicacion para reservar pasajes. El tema es que inicialmente tengo una tabla vacia (asp:table) y un DropDownList. En el DropDownList selecciono el numero de pasajeros y en base a ese numero creo el numero de filas necesarias en la tabla para meter los datos de cada pasajero. Bien el problema es que cuando pincho en el boton de validar y guardar datos la tablae sta vacia, es decir, no me guarda los datos introducidos. Queria saber como solucionar este tema. He oido algo sobre ViewState, pero no se como utilizarlo, ya que la tabla tiene el ViewState = true. Lo que he intentado hacer es:

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    Me.ViewState.Add("Tabla", PHPassengers)
End Sub

Pero eso me da el siguiente error:

Server Error in '/Concession Form' Application.
Type 'System.Web.UI.WebControls.PlaceHolder' in Assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.Serialization.SerializationException: Type 'System.Web.UI.WebControls.PlaceHolder' in Assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.

A ver si alguien sabe como solucionar esto.

Muchas gracias por adelantado.

cuajoa:
mirá al agregar datos a una base o hacer una consulta o lo que sea que necesite traer o dejar datos, requiere de una "actualizacion", o sea lo que tenes que hacer es darle un Update o algo parecido, pero la tabla no tiene update, creo, lo que podes usar es un gridview, pero es un poco mas complejo que una tabla.

El view State sirve para mantener el estado entre las idas y vueltas al servidor.
Por ejemplo, tenes un formulario que el usuario debe llenar y cuando presiona el boton "Submit" del formulario entran en juego los validadores, si uno de estos falla la pagina le avisa que tiene un error, en esa accion se genera una ida y vuelta al servidor y aca es donde entra en juego el view state, que sirve para que el pobre usuario no tenga que escribir todos los campos nuevamente.

Saludos

Javier Santamaria:
Hola cuajoa, muchas gracias por responder.

No se si me explique bien.

Mi problema es que los datos no existen, son datos nuevos introducidos por el usuario, por eso no puedo hacer ninguna consulta a la BD para luego modificar los datos de la tabla o gridview con un update. Lo que yo necesito es crear una tabla (me da igual tabla que gridvew, que formview) que sea capaz de añadir o eliminar filas dinamicamente guardando los datos ya escritos por el ususario. Te pongo un ejemplo:

1. Al principio la tabla esta vacia (solo tiene la cabecera) porque no tengo ningun pasajero.

Campo1   Campo2   Campo3   Campo4   Campo5


2. El usuario decide (con el dropdownlist) poner 3 pasajeros. La tabla tendria tres filas.

Campo1          Campo2         Campo3        Campo4       Campo5
Pasajero1   Pasajero1   Pasajero1   Pasajero1   Pasajero1
Pasajero2   Pasajero2   Pasajero2   Pasajero2   Pasajero2
Pasajero3   Pasajero3   Pasajero3   Pasajero3   Pasajero3


3. El usuario decide meter dos pasjeros mas. La tabla deberia de mostrar 5 filas (3 ya rellenas y 2 vacias).

Campo1          Campo2         Campo3        Campo4       Campo5
Pasajero1   Pasajero1   Pasajero1   Pasajero1   Pasajero1
Pasajero2   Pasajero2   Pasajero2   Pasajero2   Pasajero2
Pasajero3   Pasajero3   Pasajero3   Pasajero3   Pasajero3
(Vacio)             (Vacio)       (Vacio)         (Vacio)           (Vacio)
(Vacio)             (Vacio)       (Vacio)         (Vacio)           (Vacio)


4. El usuario decide dejar solo dos pasajeros. La tabla deberia dejar las filas de los pasajeros 1 y 2, borrando las demas.

Campo1          Campo2         Campo3        Campo4       Campo5
Pasajero1   Pasajero1   Pasajero1   Pasajero1   Pasajero1
Pasajero2   Pasajero2   Pasajero2   Pasajero2   Pasajero2


5. Si decidiera meter otros dos pasajeros, deberian aparecer otras dos filas vacias (no la tercera con la informacion del pasajero3 anteriormente introducida).

Campo1          Campo2         Campo3        Campo4       Campo5
Pasajero1   Pasajero1   Pasajero1   Pasajero1   Pasajero1
Pasajero2   Pasajero2   Pasajero2   Pasajero2   Pasajero2
(Vacio)             (Vacio)       (Vacio)         (Vacio)           (Vacio)
(Vacio)             (Vacio)       (Vacio)         (Vacio)           (Vacio)


Espero haberme explicado mejor ahora.

Alguien sabe como manejar el ViewState para hacer funcionar esta tabla. Tener en cuenta que el ViewState no guarda contrles, por tanto no guarda los textbox donde introduzco la informacion de los pasajeros, solo guarda el texto del textbox, pero no el control completo.

Gracias de nuevo.

Saludos

cuajoa:
Mirá yo hice algo parecido a eso, y lo que el usuario tenia que conpletar tres textbox, y los mostraba con un gridview, y automáticamente cuando lo presionaba el boton se actualizaba el gridview, sin tener en cuenta el viewstate.

Y el mismo gridview te permite eliminar y modificar los datos, y escribiendo muy poco codigo.

Si queres te paso la pagina que hice y te fijas.

Saludos

Javier Santamaria:
EDITADO

Hola de nuevo,
Ya consigo añadir mis filas dinamicamente y puedo guardar el estado de las mismas en el viewstate. Cuando se ve la solucion parece sencilla, pero hasta que no llegas a ella no es tan obvia. Voy a contar como lo he hecho por si a alguien le viene bien. Lo he conseguido de la siguiente forma:

Aqui lo que hago es añadir una fila nueva y luego guardo el estado de la tabla en el ViewState.
Protected Sub BtnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnAdd.Click
AddNewRow(TblPassengers)
SaveTblPassengers()
End Sub

Aqui me leo el ViewState para meterlo en la tabla y recuperar la informacion que teniamos en ella.
Protected Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreLoad
Bucles de lectura (Algo larguillos, por eso no los pongo, pero si se necesitan pedirlos)
End Sub

La idea del codigo es que veais cual es la secuencia para llenar y recuperar el ViewState.

Ahora, como no podia ser de otra forma, tengo la siguiente duda:

Al crear los controles dinamicamente no puedo crear procedimientos que manejen sus eventos, ya que al no estar declarados estaticamente no se reconocen. Es decir, yo dinamicamente me creo un control llamado "RdoLeadtbl3", pero no puedo definir en mi archivo .aspx.vb un procedimiento que sea:

Protected Sub RdoLeadtbl3_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RdoLeadtbl3.CheckedChanged

Esto me dice que no se puede compilar, porque no esta definido RdoLeadtbl3 (recordad que lo defino en ejecucion). Por tanto mi problema es: yo voy añadiendo pasajeros a la tabla. De estos pasajeros solo uno puede ser principal. Esto obviamente lo controlo con unos RadioButton (no puede ser RadioButtonList porque quiero un boton por fila y no una lista de botones por fila). El problema que me encuentro es que no se como capturar el evento CheckedChanged de estos RadioButton para cambiar el pasajero principal segun se seleccione uno u otro. Actualmente me pone el puntito en todos los que pinches y lo que deberia de hacer es cambiarlo. Por tanto la pregunta es:

¿Como se capturan los evetos de los controles creados dinamicamente?

Agradezco cualquier ayuda.

Un saludo.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa