ASP.NET - Carro de compras implementado con arrayList

 
Vista:

Carro de compras implementado con arrayList

Publicado por danielGT (11 intervenciones) el 01/10/2004 06:52:47
Hola chicos.

Otra vez yo por aqui molestando.
Necesito que alguien me ayude con esto. Estoy implementando un carro de compras usando un arrayList, ya que no quiero hacerlo usando la base de datos. El problema que tengo es que mi carro de compras (o sea, el arrayList) se destruye despues que le agrego un producto.

Tengo el siguiente codigo

Public Class WebForm2
Inherits System.Web.UI.Page
Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
Protected WithEvents lstProductos3 As System.Web.UI.WebControls.DataGrid
Public carrito As SisControl.CarroCompras
Private arrProductos As System.Collections.ArrayList

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objProducto As New SisControl.Producto()

carrito = Session("carrito")
Try
arrProductos = objProducto.Listado(-1, -1, -1, 127, "")
lstProductos3.DataSource = arrProductos
Page.DataBind()
Catch excepcion As System.Exception
Response.Write(excepcion.Message)
End Try
Session("carrito") = carrito
End Sub

Private Sub lstProductos3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstProductos3.SelectedIndexChanged
Dim idx As Integer
Dim usrProducto As New SisControl.Producto(True)
Dim itemListado As SisControl.ListadoProductos

carrito = Session("carrito")
idx = lstProductos3.SelectedIndex
itemListado = arrProductos.Item(idx)
usrProducto.Producto_id = itemListado.Producto_id
usrProducto.Descripcion = itemListado.Descripcion
usrProducto.Precio = itemListado.Precio
usrProducto.Cantidad = itemListado.Cantidad
usrProducto.Disponibilidad = itemListado.Disponibilidad

usrProducto.Llevar(carrito)
usrProducto = Nothing
Session("carrito") = carrito
End Sub
End Class

CarroCompras es una clase, que no es otra cosa sino un objeto con una unica propiedad y que en realidad no es otra cosa sino un arrayList, que pretendo usar para ir guardando los productos. En el evento SelectedIndexChanged es donde agrego un producto al carro, y lo hace perfectamente (lstProductos3 es un dataGrid, que esta vinculado a los productos que obtengo de la base de datos). El problema es que una vez que el evento termina, despues cuando inserto otro, el carro esta vacio, desde cero nuevamente. Pense que usando Sessions se resolveria mi problema, pero no resulto como yo esperaba. En el global.asax , creo una session donde creo el carro, y despues recupero la session en el codigo que les mostre. El carro se recupera bien, pero vacio (bueno, la primera vez, esta bien que este vacio, pero las veces siguientes no).

Alguien me podria sugerir algo? necesito ayuda por favor.

Un saludo y gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 56
Bronce
Ha mantenido su posición en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

RE:Carro de compras implementado con arrayList

Publicado por Yamil Bracho (1136 intervenciones) el 01/10/2004 15:39:46
Aparentemnete se bien el codigo lo unico que veo que me llama la atencion es la llamada al metodo usrProducto.Llevar(carrito)
Me parece mas bien que este metodo deberia ser de SisControl.CarroCompras. Algo como

carrito.AgregarProducto( usrProducto)

y alli haces el Add al ArrayList

Tambien revisa cual es el timpo de timeout de tus conexiones, no vaya a ser que este muy pequeño y este expirando muy pronto, destruyendo el carrito

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Carro de compras implementado con arrayList

Publicado por DanielGT (11 intervenciones) el 02/10/2004 06:14:10
Si, ya veo... es posible que sea eso.

No creo que sea mucho problema que cambie el metodo al lugar que le corresponda, pero, solo por si las dudas, el metodo llevar lo tengo definido asi:

Public Sub Llevar(ByRef carro As SisControl.CarroCompras)
carro.Productos.Add(Me)
End Sub

O sea lo que hace es, el producto se agrega por si mismo (Me) al carro. ¿Esta un poco trucho esto, no? Pero de todas formas creo que, como me lo aconsejas, mejor dejare el metodo en el CarroCompras. Parece que tiene el mismo problema que se metodo donde el arrayList tenian todos los elementos el mismo objeto, y era porque todos tenia la misma referencia.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Carro de compras implementado con arrayList

Publicado por DanielGT (11 intervenciones) el 02/10/2004 06:21:22
Por cierto... me surgio una duda. Me en este caso, a que esta haciendo referencia? al objeto "Producto" o al metodo?

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 56
Bronce
Ha mantenido su posición en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

RE:Carro de compras implementado con arrayList

Publicado por Yamil Bracho (1136 intervenciones) el 03/10/2004 18:15:31
Al objeto activo de la clase a la que pertenece el metodo. En este caso el objeto instanciado de la clase Producto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Carro de compras implementado con arrayList

Publicado por DanielGT (11 intervenciones) el 05/10/2004 06:36:24
Siguiendo con esto....

Hay algo raro con esto.

CarroCompras (el carrito del que les hablaba) tiene el metodo new como

Public Sub New()
If IsNothing(Productos) Then
Productos = New System.Collections.ArrayList()
End If
End Sub

Creo que ya se lo que pasa, pero no se como resolverlo, resulta que cada vez que se ejecuta el metodo SelectedIndexChanged de la pagina aspx que les mostre (dado que seleccione un elemento del dataGrid) se ejecuta el New de CarroCompras, le puse la funcion IsNothing para evitar que Productos (que es el arrayList que tiene la clase CarroCompras) se inicialize con un nuevo arrayList, pero el siempre encuentra que no ha sido instanciado. creandolo de nuevo.

No se como resolverlo, lo que mas me extraña es porque diablos se crea de nuevo el objeto Carrito (dado que puse un punto de quiebre en New para ver si pasa por ahi, y justamente, siempre se ejecuta New, y al pasar por Isnothing dice que Productos no ha sido instanciado y lo crea de nuevo. No se si tiene que ver con las Sessions, o con el ambito donde declare el carrito, o que ondas.

Por favor necesito un poco mas de ayuda ya que lamentablemente esto se me escapo de las manos. Creo que por ahi tengo una confusion en cuanto a las clases, las instancias, las sessions, etc.

Un saludo y gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 56
Bronce
Ha mantenido su posición en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

RE:Carro de compras implementado con arrayList

Publicado por Yamil Bracho (1136 intervenciones) el 05/10/2004 15:12:05
Creo que mas bien deberias colocar el arraylist en una variable de sesion y lo harias como :

if Session( "carrito") Is Nothing Then
Session("carrito") = new ArrayList()
End If

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Carro de compras implementado con arrayList

Publicado por danielGT (11 intervenciones) el 05/10/2004 15:59:29
Te refieres a que en el aspx ponga ese codigo? es decir, mantengo mi codigo igual que siempre, y agrego esas lineas en la pagina?

Pero y que hay con el New de la clase CarroCompras? de todas formas se me inicializaria una y otra vez el carrito.

Ahi lo que no me quedo muy claro es si esa session que me sugieres, la compruebe en el aspx o en la clase.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 56
Bronce
Ha mantenido su posición en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

RE:Carro de compras implementado con arrayList

Publicado por Yamil Bracho (1136 intervenciones) el 05/10/2004 18:17:13
No porque la inicializas la primera vez ya que la variable de sesion no existe y ya para la proxima vez si esta creada.
Colocale en el vento load lo siguiente:

If Not IsPostBack Then
Session("Carrito") = new ArrayList()
End If
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Carro de compras implementado con arrayList

Publicado por DanielGT (11 intervenciones) el 13/10/2004 04:02:55
Hola, tengo una duda (otra mas jejeje)

el IsPostBack me devuelve falso si es primera vez que se ingresa a la pagina.

Ahora bien, tengo en el global.asax, en el metodo Session_start,

Dim carrito As New SisControl.CarroCompras()
Session("carrito") = carrito

Con la idea de que solo cuando se iniciara una sesion (o sea solo la primera vez) se creara un carrito nuevo, pero me acabo de dar cuenta que Session_Start se ejecuta cada vez que carga la pagina (en asp 3.0 eso no ocurria). Con lo cual creo que es el gran culpable (ya me puse denso) de que el carrito y la session("carrito") se destruya una y otra vez. Pero mi duda es: Si no es en Session_start, entonces donde lo pongo? el Session_start parece comportarse como un vil, comun y corriente page_load. Si es asi, mejor no coloco nada en Session_start y mejor me valgo solo del isPostBack, no?

o me equivoco?

Un saludo y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar