Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Conservar datos de un DataTable luego de un postback

1,917 views
Skip to first unread message

Alexa

unread,
May 20, 2009, 4:46:38 AM5/20/09
to
Tengo un GridView con una columna para controles Button el cual dispara el
evento RowCommand . El referido GridView lo lleno a trav�s de un DataTable
el que a su vez lo lleno mediando un loop agreg�ndoles objetos DataRow.
Hasta all� todo bien, pero el problema viene que al clicar sobre los
controles BUTTON se genera el POSTBACK con lo cual pierdo todos los datos
en memoria del DATATABLE, el cual deseo seguir manteniendo en memoria para
que me actualice el GridView y asi no tener que estar conectandome a la
Base de Datos cada vez que elimino un registro del GridView .
Agradecer� las correcciones o sugerencias que les puedan hacer a este
c�digo para que funcione sin problemas.

Nota: OperacionesBD es una clase que he creado para OPERACIONES CON LA BASE
DE DATOS y que funciona sin problemas.

------------------------------------------------------------------------------------------------------------------------------------------------
Imports System.Data.SqlClient
Imports System.Data
Imports guiaASP
Partial Class PruebaImagenes : Inherits System.Web.UI.Page
Dim oCon As New OperacionesBD
Dim dt As New DataTable()
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load
ModuloConexion.Cnx.Close()
If Not Page.IsPostBack Then
bindData()
End If
End Sub

Private Sub bindData()
Dim cmd_Imagen As SqlCommand = New SqlCommand("SELECT
IMA_nombre,IMA_tipo,IMA_titulo," _
& "IMA_descripcion,IMA_fecha FROM AVTiMaImagen", ModuloConexion.Cnx)
ModuloConexion.Cnx.Open()
Dim DR_imagen As SqlDataReader = cmd_Imagen.ExecuteReader()
dt.Columns.Add("IMA_orden", Type.GetType("System.Int16"))
dt.Columns.Add("IMA_nombre", Type.GetType("System.String"))
dt.Columns.Add("IMA_tipo", Type.GetType("System.String"))
dt.Columns.Add("IMA_titulo", Type.GetType("System.String"))
dt.Columns.Add("IMA_descripcion", Type.GetType("System.String"))
dt.Columns.Add("IMA_fecha", Type.GetType("System.String"))
dt.Columns.Add("IMA_path", Type.GetType("System.String"))
Dim drow As DataRow : Dim i As Int16
If DR_imagen.HasRows Then
Do While DR_imagen.Read()
drow = dt.NewRow()
drow(0) = i
drow(1) = DR_imagen.GetValue(0)
drow(2) = DR_imagen.GetValue(1)
drow(3) = DR_imagen.GetValue(2)
drow(4) = DR_imagen.GetValue(3)
drow(5) = DR_imagen.GetValue(4)
drow(6) = ResolveUrl("ThumbnailCreator.aspx?ImageId=" &
Server.MapPath("~/imagesUpload/tacna/") & DR_imagen.GetValue(0))
dt.Rows.Add(drow)
i = i + 1
Loop
Else
MsgBox("No hay registros")
End If
Me.GridView_Imagen.DataSource = dt
Me.GridView_Imagen.DataBind()
DR_imagen.Close()
ModuloConexion.Cnx.Close()
End Sub

Protected Sub GridView_Imagen_RowCommand(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.GridViewCommandEventArgs) Handles

GridView_Imagen.RowCommand
Dim indice As Integer = Convert.ToInt32(e.CommandArgument)
Dim filaSeleccionada As GridViewRow = Me.GridView_Imagen.Rows(indice)
dt.Rows.Remove(dt.Rows(e.CommandArgument))

Dim strCnx As String = oCon.GetStringConection.ConnectionString()
Dim eliminar As New SqlCommand("DELETE FROM AVTiMaImagen WHERE
IMA_nombre='" + filaSeleccionada.Cells(1).Text + "'")
oCon.DELETE_COMMAND = eliminar
Dim status As Boolean = oCon.DeleteFields()
bindData()

End Sub
End Class


Alberto Poblacion

unread,
May 20, 2009, 5:28:37 AM5/20/09
to
" Alexa" <a...@hotmail.com> wrote in message
news:%23IcBCeS...@TK2MSFTNGP03.phx.gbl...
> [...] el problema viene que al clicar sobre los controles BUTTON se
> genera el POSTBACK con lo cual pierdo todos los datos en memoria del
> DATATABLE, el cual deseo seguir manteniendo en memoria para que me
> actualice el GridView y asi no tener que estar conectandome a la Base de
> Datos cada vez que elimino un registro del GridView .

Puesto que el dt es una variable miembro de la clase, se pierde en todos
los postbacks. Para conservarlo, hay que recurrir a alguna de las t�cnicas
de conservaci�n del estado que tiene asp.net. Algunas de las opciones se
indican a continuaci�n. En todas ellas, el proceso consistir�a en salvar el
DataTable en el almacenamiento correspondiente justo despu�s de construirlo,
y luego recuperarlo incondicionalmente durante cada postback, al principio
del FormLoad, fuera del "Not IsPostBack".

1) Meterlo en el Session o el Application. El Session mantiene una copia
para cada usuario y el Application es global. En ambos casos se mantiene en
memoria del servidor (salvo que redirijas el Session a otro sitio).
2) Guardarlo en el ViewState. En este caso, se guarda en un campo Hidden en
el navegador, y viaja de ida y vuelta al servidor durante cada postback.
3) Guardarlo en el Cache. Funciona igual que el Application, pero se libera
autom�ticamente si el servidor anda escaso de memoria. En ese caso, al
leerlo te devuelve Nothing, y entonces hay que volverlo a cargar desde base
de datos.

Alexa

unread,
May 20, 2009, 11:37:40 AM5/20/09
to
Fijaos aqui, en donde con un STATIC al dataset se soluciona todo (pero no
encuentro el equivalente de STATIC en VB Net):

using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
/// <summary>
/// Autor: Hanz Cocchi
/// URL: http://hanzcocchi.net
/// </summary>
public partial class _Default : System.Web.UI.Page
{
static DataSet dts = new DataSet();
DataTable tbl = new DataTable("miTabla");
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//Agregar las columnas a la tabla
tbl.Columns.Add(new DataColumn("id", Type.GetType("System.Int32")));
tbl.Columns.Add(new DataColumn("nombre", Type.GetType("System.String")));
tbl.Columns.Add(new DataColumn("apellido", Type.GetType("System.String")));
//Agregar Datos a la tabla
tbl.Rows.Add(new object[] { 1, "Hanz", "Cocchi" });
tbl.Rows.Add(new object[] { 2, "Maria", "Lopez" });
tbl.Rows.Add(new object[] { 3, "Miguel", "Gonzales" });
tbl.Rows.Add(new object[] { 4, "Lucia", "Soto" });
tbl.Rows.Add(new object[] { 5, "Jos", "Ruiz" });
//Si existe el objeto, eliminarlo
if (dts.Tables["miTabla"] != null)
dts.Tables.Remove("miTabla");
//Agregar la nueva tabla
dts.Tables.Add(tbl);
//Enlazar los datos de la tabla para que se muestren en el GridView
gdv.DataSource = dts.Tables["miTabla"].DefaultView;
gdv.DataBind();
}
}
protected void ibt_Click(object sender, ImageClickEventArgs e)
{
//Recuperar el cdigo de registro que se desea eliminar
string strCodigo = ((ImageButton)sender).CommandArgument;
//Obtener un array de filas cuyo id sea el recuperado. Tericamente solo debe
eliminar uno
DataRow[] filas = dts.Tables["miTabla"].Select("id = " + strCodigo,
string.Empty);
//Recorrer las filas para eliminarlas. Nuevamente, en teora, solo uno
foreach (DataRow item in filas)
dts.Tables["miTabla"].Rows.Remove(item);
//Mostrar el mensaje indicando el Id del registro eliminado
lblMensaje.Text = "Se ha eliminado el registro: " + strCodigo;
//Enlazar los datos de la tabla para que se muestren en el GridView
gdv.DataSource = dts.Tables["miTabla"].DefaultView;
gdv.DataBind();
}
}


"Alberto Poblacion" <earthling-quitae...@poblacion.org>
escribi� en el mensaje news:OrQMp1S2...@TK2MSFTNGP05.phx.gbl...

Alberto Poblacion

unread,
May 20, 2009, 3:23:02 PM5/20/09
to
" Alexa" <a...@hotmail.com> wrote in message
news:%23YqEuDW...@TK2MSFTNGP03.phx.gbl...

> Fijaos aqui, en donde con un STATIC al dataset se soluciona todo (pero no
> encuentro el equivalente de STATIC en VB Net):

El equivalente en VB.Net es "Shared".

Ojo con las variables Shared, que las comparten todos los usuarios. Si
el DataSet es el mismo para todos, puede valer, pero si cada uno carga sus
datos, no te sirve (aunque funcionar� durante las pruebas si se prueba la
web desde un �nico navegador).

Alexa

unread,
May 20, 2009, 5:53:12 PM5/20/09
to
Gracias, vale la aclaraci�n, lo tratar� de hacer usando ViewState.

"Alberto Poblacion" <earthling-quitae...@poblacion.org>
escribi� en el mensaje news:%239hlpBY...@TK2MSFTNGP06.phx.gbl...

Sashka

unread,
May 20, 2009, 7:55:20 PM5/20/09
to
M�s bien con session no?

Sashka
" Alexa" <a...@hotmail.com> escribi� en el mensaje de
noticias:#bdhkVZ2...@TK2MSFTNGP02.phx.gbl...
> Gracias, vale la aclaraci�n, lo tratar� de hacer usando ViewState.
>
> "Alberto Poblacion" <earthling-quitae...@poblacion.org>
> escribi� en el mensaje news:%239hlpBY...@TK2MSFTNGP06.phx.gbl...


>>" Alexa" <a...@hotmail.com> wrote in message
>>news:%23YqEuDW...@TK2MSFTNGP03.phx.gbl...
>>> Fijaos aqui, en donde con un STATIC al dataset se soluciona todo (pero
>>> no encuentro el equivalente de STATIC en VB Net):
>>
>> El equivalente en VB.Net es "Shared".
>>
>> Ojo con las variables Shared, que las comparten todos los usuarios. Si
>> el DataSet es el mismo para todos, puede valer, pero si cada uno carga

>> sus datos, no te sirve (aunque funcionar� durante las pruebas si se
>> prueba la web desde un �nico navegador).
>>
>
>

Alexa

unread,
May 20, 2009, 10:47:17 PM5/20/09
to
Ya lo acabo de hacer sin Session, solo con ViewState y me sali� muy bien
:-))

Con esto almaceno el valor del DataTable en un ViewState
ViewState("myDataTable") = DT_Imagen

Con esto rescato los valores del DataTable
DT_Imagen = DirectCast(ViewState("myDataTable"), DataTable)

Estoy analizando como trabaja el ViewState Caching , todavia es algo un poco
avanzado para mi. Lo hare mucho m�s adelante.


"Sashka" <Sas...@comunidad.anti-spam> escribi� en el mensaje
news:D43CE105-B63B-4C49...@microsoft.com...
> M�s bien con session no?
>
> Sashka
> " Alexa" <a...@hotmail.com> escribi� en el mensaje de
> noticias:#bdhkVZ2...@TK2MSFTNGP02.phx.gbl...
>> Gracias, vale la aclaraci�n, lo tratar� de hacer usando ViewState.
>>
>> "Alberto Poblacion" <earthling-quitae...@poblacion.org>
>> escribi� en el mensaje news:%239hlpBY...@TK2MSFTNGP06.phx.gbl...


>>>" Alexa" <a...@hotmail.com> wrote in message
>>>news:%23YqEuDW...@TK2MSFTNGP03.phx.gbl...
>>>> Fijaos aqui, en donde con un STATIC al dataset se soluciona todo (pero
>>>> no encuentro el equivalente de STATIC en VB Net):
>>>
>>> El equivalente en VB.Net es "Shared".
>>>
>>> Ojo con las variables Shared, que las comparten todos los usuarios.
>>> Si el DataSet es el mismo para todos, puede valer, pero si cada uno

>>> carga sus datos, no te sirve (aunque funcionar� durante las pruebas si
>>> se prueba la web desde un �nico navegador).
>>>
>>
>>


Sashka

unread,
May 21, 2009, 8:57:55 AM5/21/09
to
Poner un datatable en el ViewState no es una buena pr�ctica, mira el html
que se genera (click derecho en la p�gina, ver c�digo fuente) y verifica el
tama�o del viewstate, esto le quita performance a la carga de la p�gina.

Sashka


" Alexa" <a...@hotmail.com> escribi� en el mensaje de
noticias:#LQ655b2...@TK2MSFTNGP06.phx.gbl...
> Ya lo acabo de hacer sin Session, solo con ViewState y me sali� muy bien

> :-))
>
> Con esto almaceno el valor del DataTable en un ViewState
> ViewState("myDataTable") = DT_Imagen
>
> Con esto rescato los valores del DataTable
> DT_Imagen = DirectCast(ViewState("myDataTable"), DataTable)
>
> Estoy analizando como trabaja el ViewState Caching , todavia es algo un

> poco avanzado para mi. Lo hare mucho m�s adelante.
>
>
> "Sashka" <Sas...@comunidad.anti-spam> escribi� en el mensaje
> news:D43CE105-B63B-4C49...@microsoft.com...
>> M�s bien con session no?
>>
>> Sashka
>> " Alexa" <a...@hotmail.com> escribi� en el mensaje de
>> noticias:#bdhkVZ2...@TK2MSFTNGP02.phx.gbl...
>>> Gracias, vale la aclaraci�n, lo tratar� de hacer usando ViewState.
>>>
>>> "Alberto Poblacion" <earthling-quitae...@poblacion.org>
>>> escribi� en el mensaje news:%239hlpBY...@TK2MSFTNGP06.phx.gbl...


>>>>" Alexa" <a...@hotmail.com> wrote in message
>>>>news:%23YqEuDW...@TK2MSFTNGP03.phx.gbl...
>>>>> Fijaos aqui, en donde con un STATIC al dataset se soluciona todo (pero
>>>>> no encuentro el equivalente de STATIC en VB Net):
>>>>
>>>> El equivalente en VB.Net es "Shared".
>>>>
>>>> Ojo con las variables Shared, que las comparten todos los usuarios.
>>>> Si el DataSet es el mismo para todos, puede valer, pero si cada uno

>>>> carga sus datos, no te sirve (aunque funcionar� durante las pruebas si
>>>> se prueba la web desde un �nico navegador).
>>>>
>>>
>>>
>
>

Jose A. Fernandez

unread,
May 27, 2009, 12:40:09 PM5/27/09
to
Hola Alexa

me sumo al comentario que realiza Sashka!!

....que me refresco la memoria de este excelente tip de Scott
Hanselman

- Moving ViewState to the Session Object and more Wrongheadedness
http://www.hanselman.com/blog/MovingViewStateToTheSessionObjectAndMoreWrongheadedness.aspx

Otro similar
http://neilkilbride.blogspot.com/2007/05/storing-viewstate-into-session.html


Espero que les sirva de ayuda o guia
______________________
Jose A. Fernandez
blog: http://geeks.ms/blogs/fernandezja


On 21 mayo, 09:57, "Sashka" <Sas...@comunidad.anti-spam> wrote:
> Poner un datatable en el ViewState no es una buena práctica, mira el html
> que se genera (click derecho en la página, ver código fuente) y verifica el
> tamaño del viewstate, esto le quita performance a la carga de la página.
>
> Sashka
>
> "  Alexa" <a...@hotmail.com> escribió en el mensaje de
> noticias:#LQ655b2JHA.1...@TK2MSFTNGP06.phx.gbl...
>
>
>
> > Ya lo acabo de hacer sin Session, solo con ViewState y me salió muy bien


> > :-))
>
> > Con esto almaceno el valor del DataTable en un ViewState
> > ViewState("myDataTable") = DT_Imagen
>
> > Con esto rescato los valores  del DataTable
> > DT_Imagen = DirectCast(ViewState("myDataTable"), DataTable)
>
> > Estoy analizando como trabaja el ViewState Caching , todavia es algo un

> > poco avanzado para mi. Lo  hare mucho más adelante.
>
> > "Sashka" <Sas...@comunidad.anti-spam> escribió en el mensaje
> >news:D43CE105-B63B-4C49...@microsoft.com...
> >> Más bien con session no?
>
> >> Sashka
> >> "  Alexa" <a...@hotmail.com> escribió en el mensaje de
> >> noticias:#bdhkVZ2JHA.1...@TK2MSFTNGP02.phx.gbl...
> >>> Gracias, vale la aclaración,  lo trataré de hacer usando ViewState.
>
> >>> "Alberto Poblacion" <earthling-quitaestoparacontes...@poblacion.org>
> >>> escribió en el mensajenews:%239hlpBY...@TK2MSFTNGP06.phx.gbl...


> >>>>" Alexa" <a...@hotmail.com> wrote in message
> >>>>news:%23YqEuDW...@TK2MSFTNGP03.phx.gbl...
> >>>>> Fijaos aqui, en donde con un STATIC al dataset se soluciona todo (pero
> >>>>> no encuentro el  equivalente de STATIC  en VB Net):
>
> >>>>    El equivalente en VB.Net es "Shared".
>
> >>>>    Ojo con las variables Shared, que las comparten todos los usuarios.
> >>>> Si el DataSet es el mismo para todos, puede valer, pero si cada uno

> >>>> carga sus datos, no te sirve (aunque funcionará durante las pruebas si
> >>>> se prueba la web desde un único navegador).

0 new messages