Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Label che mi conta gli elementi nel carrello non si aggiorna subito dopo

    Ciao ragazzi,
    come ho anticipato nel titolo ho una situazione di questo tipo:

    Ho una pagina .aspx che contiene due UserControl.
    Il Primo UserControl ha Sub che al caricamente dello stesso UserControl mi aggiorna in una Label il totale dei prodotti inseriti in carrello.
    L'altro UserControl è composto da un ListView, con un pulsante che all'ItemCommand mi inserisce l'articolo nel carrello.

    Il problema è che quando clicco sul pulsante del ListView, il prodotto viene sì inserito correttamente nel database, ma la label dell'altro user non viene aggiornata se non al successivo ricaricamento di pagina.

    Sapreste dirmi dove sbaglio?
    Grazie mille

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    116
    Non ne sono certo perché non ho visto il codice, ma suppongo che il problema sia l'ordine col quale vengono eseguite le tue sub.
    Ti faccio un esempio:
    A mio avviso al postback la pagina cosa fa:
    1)ricarica la pagina richiamando i metodi della classe page (init, load ecc)
    2)esegue i metodi che hai scritto tu (quindi a questo punto del postback verrà eseguito l'ItemCommand, e verrà inserito il dato)
    3)unload della pagina

    dunque così facendo prima visualizzi il controllo e poi aggiungi il dato nel Db, perché suppongo che sia nella load della pagina che carichi i dati nella label.

    Spero di essere stato chiaro ( e di averci azzecccato ) comunque se esegui il sito in modalità debug ti accorgi subito di qual'é l'ordine col quale esegue le operazioni

  3. #3
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Confermo, è una questione di sequenze dell'evento Page_Load.
    Quello degli UC viene eseguito dopo quello della pagina.
    Al momento dell'incapsulamento dello user control di turno, per intenderci.

    Pero' dovresti mostrarci un po' di codice, il modo di gestire gli UC non è soltanto uno.

  4. #4
    eh ma infatti avevo capito che era quello il problema.
    Adesso non ho il codice con me, ma stasera dovrei riuscire a postare un pò di codice.

    Grazie mille

  5. #5
    Allora vi posto un pò di codice delle pagine in questione:
    La prima pagina: default.aspx carica al Pageload entrambi gli UC in questa maniera e li associa ad un Placeholder:

    Dim Shopping As UserControl = LoadControl("/include/inc_shopping.ascx")
    Dim Novita As UserControl = LoadControl("/include/inc_novita.ascx")
    PlcShopping.Controls.Add(Shopping)
    PlcNovita.Controls.Add(Novita)

    Lo UC Novita effettua l'inserimento dell'articolo nel carrello quando si esegue la Sub
    Sub LstNovita_ItemCommand(ByVal sender As Object, ByVal e As ListViewCommandEventArgs), richiamata dal ListView con OnItemCommand="LstNovita_ItemCommand".

    Infine lo UC Shopping al PAgeLoad Carica gli elementi presenti nel carrello e li associa ad una Label.

    Il problema in pratica è che al Click del pulsante che fa scaturire l'ItemCommand del Listview accade che prima avviene il Postback, quindi vengono contanti gli elementi nel carrello e infine inserito il prodotto nel carrello, giusto?

    Le sub di caricamento dei prodotti del carrello e dell'inserimento nello stesso sono molto semplici, per questo non le ho postate. Non penso sia per quello che non funziona.

    Come posso fare secondo voi a guidare il flusso di esecuzione ?
    Grazie mille

  6. #6
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    Hai provato ad intercettare l'evento onprerender della pagina ed aggiornare il carrello ??

    per farlo ti baste semplicemente creare una funzione pubblica nell'uc che ti legge il carrello e richimarla nel prerender della pagina che contiene questo uc

    non posso aiutarti con il codice perche conosco il solo C#


  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Originariamente inviato da GabbOne
    Hai provato ad intercettare l'evento onprerender della pagina ed aggiornare il carrello ??
    Ho provato e questa è la soluzione giusta, caricare il secondo UC al prerender della pagina ospitante i due UC, e non al Load.

    codice:
        Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
            Dim Shopping As UserControl = LoadControl("/include/inc_shopping.ascx")
            PlcShopping.Controls.Add(Shopping)    
        End Sub
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim Novita As UserControl = LoadControl("/include/inc_novita.ascx")
            PlcNovita.Controls.Add(Novita)
        End Sub
    Prova cosi'.

  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    L'esempio che ho fatto è questo:

    Pagina ASPX con i due UC: (ho usato una label sulla pagina principale per simulare il DB)
    codice:
    <form id="form1" runat="server">
        <div>
        <asp:PlaceHolder ID="ph1" runat="server"></asp:PlaceHolder>
        
    
    </p>
        <asp:PlaceHolder ID="ph2" runat="server"></asp:PlaceHolder>
        </div>
        
    
    
        (Prodotti nella tabella carrello:
        <asp:Label ID="lbContaHidden" runat="server" Text="0" ForeColor="#cccccc"></asp:Label>)
    </form>
    
    
        Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
            Dim Novita As UserControl = LoadControl("due.ascx")
            ph2.Controls.Add(Novita)
        End Sub
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim Shopping As UserControl = LoadControl("uno.ascx")
            ph1.Controls.Add(Shopping)
        End Sub
    Usercontrol UNO (Listview che incrementa i prodotti in tabella):
    codice:
    <%@ Control Language="VB" AutoEventWireup="false" CodeFile="uno.ascx.vb" Inherits="usercontrols_uno" %>
    <asp:Button ID="btnAdd" runat="server" Text="Incrementa" />
    
    Partial Class usercontrols_uno
        Inherits System.Web.UI.UserControl
    
        Public n As Integer
        Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
            n = CInt(CType(Me.Page.FindControl("lbContaHidden"), Label).Text)
            CType(Me.Page.FindControl("lbContaHidden"), Label).Text = CStr(n + 1)
        End Sub
    End Class
    Usercontrol DUE (Riepilogo del carrello):
    codice:
    <%@ Control Language="VB" AutoEventWireup="false" CodeFile="due.ascx.vb" Inherits="usercontrols_due" %>
    IN CARRELLO:<asp:Label ID="lbConta" runat="server"></asp:Label>
    
    Partial Class usercontrols_due
        Inherits System.Web.UI.UserControl
    
        Public prodotti As Integer
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            prodotti = CInt(CType(Me.Page.FindControl("lbContaHidden"), Label).Text)
            lbConta.Text = CStr(prodotti)
        End Sub
    End Class
    E le due labels sono perfettamente sincronizzate.

  9. #9
    Grazie mille per l'esempio dettagliato.
    Domani sera potrò provarlo.

    Nel primo esempio penso che hai erroneamente inserito al prerender lo UC Shopping, cioè quello che mostra gli elementi del carrello, immagino che sia il contrario, e cioè che prima carico le novità al prerender e poi al pageload la label con il totale elementi.

    L'unico dubbio ce l'ho sul fatto che hai messo la label sulla page.aspx e non all'interno dello UC stesso, ma forse non cambia niente.

    Grazie mille, provo il tutto e ti faccio sapere!!

  10. #10
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    La label sulla pagina e' per simulare la tabella del tuo DB.

    La label "lbConta" invece e' nello user control DUE,
    codice:
    IN CARRELLO:[b]<asp:Label ID="lbConta" runat="server"></asp:Label>
    ...non sapevo quale dei due e' il carrello e quale l'altro UC, forse li ho confusi, ma e' il modus operandi la cosa importante.


    Insomma, uno dei due caricamenti va nel Prerender della pagina, come diceva GabbOne

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.