Carrello.... che perde colpi

mercoledì 18 aprile 2007 - 14.42

borgo79 Profilo | Newbie

Un saluto a tutti,
volevo sottoporvi un quesito riguardo una cosa piuttosto singolare che mi capita con il mio piccolo carrello. Cioè, io la considero singolare... poi magari il comportamento è quello giusto ed io non comprendo.

Situazione:

Ho un datalist con tutti i prodotti ed un pulsante "add to cart" che mi consente di aggiungere un prodotto al carrello. Inserisco questi dati nella mia tabella "dettagli_ordine". Ovviamente, dopo aver cliccato il pulsante Add To Cart (imagebutton) si scatena l'evento postback. Approfitto di questo evento per interrogare il database domandandogli (è solo una prova) quanti record ci sono nella tabella. Nonostante il record sia stato regolarmente aggiunto alla tabella, mi viene segnalato che i record sono, ad esempio, 6. Se aggiungo un nuovo record, mi dice che sono 7, quando in realtà sono 8... insomma, la progressione l'avete capita. E' come se stesse sempre un passo indietro.

Domanda:

Posso ovviare in qualche modo? Vorrei che l'utente sapesse quanto spende ogni volta che aggiunge un prodotto al suo carrello.

Un saluto,
Francesco

alx_81 Profilo | Guru

>Un saluto a tutti,
Ciao!

>volevo sottoporvi un quesito riguardo una cosa piuttosto singolare
>che mi capita con il mio piccolo carrello. Cioè, io la considero
>singolare... poi magari il comportamento è quello giusto ed io
>non comprendo.
>
>Situazione:
>
>Ho un datalist con tutti i prodotti ed un pulsante "add to cart"
>che mi consente di aggiungere un prodotto al carrello. Inserisco
>questi dati nella mia tabella "dettagli_ordine". Ovviamente,
>dopo aver cliccato il pulsante Add To Cart (imagebutton) si scatena
>l'evento postback. Approfitto di questo evento per interrogare
>il database domandandogli (è solo una prova) quanti record ci
>sono nella tabella. Nonostante il record sia stato regolarmente
>aggiunto alla tabella, mi viene segnalato che i record sono,
>ad esempio, 6. Se aggiungo un nuovo record, mi dice che sono
>7, quando in realtà sono 8... insomma, la progressione l'avete
>capita. E' come se stesse sempre un passo indietro.
>
>Domanda:
>
>Posso ovviare in qualche modo? Vorrei che l'utente sapesse quanto
>spende ogni volta che aggiunge un prodotto al suo carrello.
che dbms utilizzi?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

borgo79 Profilo | Newbie

MySql

alx_81 Profilo | Guru

>MySql
ok, ora posta il codice che vediamo cosa succede

Alx81 =)

http://blogs.dotnethell.it/suxstellino

borgo79 Profilo | Newbie

Allora. Ripeto velocemente dove siamo: in questa pagina ho un elenco di prodotti che è possibile aggiungere direttamente al carrello, senza andare, come usa di solito, in una pagina dedicata all'articolo che interessa.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'....
'....
sql = "SELECT * FROM dettagli_ordine"
myConnection = New MySqlConnection(bla bla)
ds = New DataSet()
dt = New DataTable()

Try
da = New MySqlDataAdapter(strSql, myConnection)
da.Fill(ds, "nome-tabella")
dt = ds.Tables("nome-tabella")
Catch ex As Exception
Finally
myConnection.Close()
End Try

Response.Write(dt.Rows.Count)
End Sub

Come detto attraverso il datalist inserisco i prodotti nel carrello, la procedura di inserimento avviene con successo

Protected Sub DL_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
sql = "INSERT INTO dettagli_ordine (IDO, IDA, qta) VALUES ('" & _
IDO & "', " & ID & ", " & qta & ")"
End Sub

Nel momento in cui clicco sul pulsante che mi consente di inserire il prodotto, la pagina viene ricaricata, il dato correttamente inserito nel database, ma il famoso Response nel Page Load non da segni di vita

alx_81 Profilo | Guru

>Allora. Ripeto velocemente dove siamo: in questa pagina ho un
>elenco di prodotti che è possibile aggiungere direttamente al
>carrello, senza andare, come usa di solito, in una pagina dedicata
>all'articolo che interessa.
>
>Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
> '....
> '....
> sql = "SELECT * FROM dettagli_ordine"
> myConnection = New MySqlConnection(bla bla)
> ds = New DataSet()
> dt = New DataTable()
>
> Try
> da = New MySqlDataAdapter(strSql, myConnection)
> da.Fill(ds, "nome-tabella")
> dt = ds.Tables("nome-tabella")
> Catch ex As Exception
> Finally
> myConnection.Close()
> End Try
>
> Response.Write(dt.Rows.Count)
>End Sub
>
>Come detto attraverso il datalist inserisco i prodotti nel carrello,
>la procedura di inserimento avviene con successo
>
>Protected Sub DL_ItemCommand(ByVal source As Object, ByVal e
>As System.Web.UI.WebControls.DataListCommandEventArgs)
>sql = "INSERT INTO dettagli_ordine (IDO, IDA, qta) VALUES ('"
>& _
> IDO & "', " & ID & ", " & qta & ")"
>End Sub
>
>Nel momento in cui clicco sul pulsante che mi consente di inserire
>il prodotto, la pagina viene ricaricata, il dato correttamente
>inserito nel database, ma il famoso Response nel Page Load non
>da segni di vita
Come hai detto prima il problema sta nel fatto che ottieni il valore del reale conteggio -1...
Il motivo è che stampi il conteggio delle righe, prima di fare la insert.. infatti prima di passare all'evento click del bottone, viene gestito l'evento Load.. Ad ogni chiamata, Load viene scatenato sempre prima di ItemCommand..
quindi il conteggio è corretto, va solo messo da un'altra parte, ad esempioo nell'item command stesso. puoi controllare lì il conteggio delle righe del datasource..
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

borgo79 Profilo | Newbie

vado a.. intuito.

La pagina viene eseguita: controllo immediatamente quanti recordo ci sono nel database. E al primo controllo saranno 0, giusto? Nell'item_command aggiungo un record al database, la pagina si "ricarica". Rincontrollo quanti record ci sono nel db (nel Page_Load) e continuano ad essere 0, anche se in realtà nel DB il record è presente.

martinez Profilo | Senior Member

Scusa se dico la mia ...
Anzitutto Ciao

A mio parere dovresti effettuare il databind del tuo controllo nel post-back della pagina al momento che questa viene ricaricata, infatti, almeno secondo me se non effettui alcun databind il controllo rimane "congelato" al post oppure al load precedente ...

prova a fare databind nell'item command

Saluti

alx_81 Profilo | Guru

@borgo79

>La pagina viene eseguita: controllo immediatamente quanti recordo
>ci sono nel database. E al primo controllo saranno 0, giusto?
giusto

>Nell'item_command aggiungo un record al database, la pagina si
>"ricarica".
e passa prima per la load.. passa proprio prima di fare l'itemcommand e quindi l'inserimento!!

>Rincontrollo quanti record ci sono nel db (nel Page_Load)
>e continuano ad essere 0, anche se in realtà nel DB il record
>è presente.
per il motivo di cui sopra..

@martinez

non è questione di databind.. ma di ordine di eventi..
quando la pagina viene ricaricata, passa prima dalla load e quindi fa vedere il numero di record prima della insert.
Poi passa per l'itemcommand e solo qui il record viene inserito.. quindi la prossima pressione del tasto porterà ad un conteggio nuovamente errato (ovvero -1 rispetto al contenuto reale della tabella)..
tutto qui..

Poi quello che dici è comunque corretto.. , come dicevo anche nei post precedenti.. anche solo per avere il corretto conteggio, sarà necessario spostarsi sull'itemcommand..

Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5