Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Totale nel footer

  1. #1

    Totale nel footer

    Ragazzi scusatemi ma non capisco cosa c'è di sbagliato in questo codice per mostrare il totale in un footer del datagrid.

    Nell'itemdatabound ho inserito questo codice, ma mi viene restituito sempre zero:

    Sub BoundDgrCarrello(ByVal sender As Object, ByVal e As DataGridItemEventArgs)

    If e.Item.ItemType = ListItemType.Item And e.Item.ItemType = ListItemType.AlternatingItem Then

    Totale = CType(e.Item.FindControl("LblPrezzo"), Label).Text

    End If

    If e.Item.ItemType = ListItemType.Footer Then

    e.Item.Cells(3).Text = "Euro " & Totale

    End If


    End Sub

    Sopra a tutto ho dichiarato
    Private Totale as double

    In cosa sbaglio?
    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    Re: Totale nel footer

    Originariamente inviato da zetaweb
    Sopra a tutto ho dichiarato
    Private Totale as double

    In cosa sbaglio?
    Grazie a tutti
    In un vecchio esempio che ho, ho dichiarato Protected Totale as Double e non private :master:
    Pietro

  3. #3
    ciao pietro,
    purtroppo ho provato anche così ma niente...

    In pratica non recupera il valore del prezzo quando calcolo il totale, perchè Euro me lo stampa correttamente.

    Nel datagrid il campo in questione lo mostro così':

    <asp:TemplateColumn HeaderText="Prezzo" HeaderStyle-Width="70" HeaderStyle-HorizontalAlign="right" ItemStyle-HorizontalAlign="right">
    <ItemTemplate>
    <asp:Label
    ID="LblPrezzo"
    Text='<%# CPrezzo(Container.Dataitem("prezzo_prodotto"), Container.dataitem("quantita_prodotto")) %>'
    runat="server">
    </asp:Label>
    </ItemTemplate>

    Dove Cprezzo è una funzione di questo tipo:

    Function CPrezzo(ByVal valore As String, ByVal valore2 As String)
    Return "Euro " + FormatNumber(valore * valore2, 2)
    End Function


    Forse l'errore è in qualcosa del genere?

    Girando su internet ho letto che qualcuno un calcolo del genere piuttosto che al itemdatabound lo fa all'itemcreated...sinceramente non so se cambia qualcosa, ma anche in quel caso non funziona e continua a mostrare Euro 0.

    Spero tu riesca a darmi una mano.

    Grazie mille

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    questo è il mio vecchio esercizio; vedi se lo puoi adattare


    pagina
    codice:
    <asp:TemplateColumn HeaderText="LONG">
    	<ItemTemplate>
    		<%#Eval("long")%>
    	</ItemTemplate>
    	<FooterTemplate>
    		<%#somma%>
    	</FooterTemplate>
    	<FooterStyle Font-Bold="True"></FooterStyle>
    </asp:TemplateColumn>
    codice
    codice:
    Protected Somma As Integer = 0
    
    Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound
    	Select Case e.Item.ItemType
    		Case ListItemType.Item, ListItemType.AlternatingItem
    			'ottengo il DbDataRecord che fornisce i dati legati
    			Dim dbr As Data.Common.DbDataRecord = DirectCast(e.Item.DataItem, Data.Common.DbDataRecord)
    
    			'estraggo il campo [long]
    			Somma += DirectCast(NullToZero(dbr("long")), Integer)
    
    			'aggiungo ad ogni riga lo stile
    			e.Item.Attributes.Add("onmouseover", "this.style.backgroundColor = 'Silver'")
    			If e.Item.ItemType = ListItemType.AlternatingItem Then
    				e.Item.Attributes.Add("onmouseout", "this.style.backgroundColor = 'White'")
    			Else
    				e.Item.Attributes.Add("onmouseout", "this.style.backgroundColor = 'White'")
    			End If
    
    			'aggiungo il title
    			Dim grid As DataGrid = DirectCast(sender, DataGrid)
    			Dim id%
    			id = CInt(grid.DataKeys(e.Item.ItemIndex)) 'uguale a id = CInt(dbr("id"))
    
    			Dim wc As WebControl = DirectCast(e.Item.Cells(16).Controls(1), WebControl)
    			wc.ToolTip = "Cancella record n° " & id
    			'disabilito il pulsante se id=4
    			If id = 4 Then wc.Enabled = False
    
    			wc = DirectCast(e.Item.Cells(17).Controls(0), WebControl)
    			wc.ToolTip = "Cancella record n° " & id
    
    			wc = DirectCast(e.Item.Cells(14).Controls(1), WebControl)
    			wc.ToolTip = "Informazioni su record n° " & id
    
    
    
    	End Select
    
    End Sub

    ps. la griglia è riempita con un DataReader
    Pietro

  5. #5
    pietro niente da fare...sto uscendo pazzo... mi ritorna sempre e solo 0....

    Ho provato anche mettendo il footertemplate:

    <FooterTemplate>
    <%#Totale%>

    </FooterTemplate>


    mentre nel code behind ho fatto questa piccola modifica, ma il risultato non cambia

    codice:
     Sub BoundDgrCarrello(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DgrCarrello.ItemDataBound
    
            If e.Item.ItemType <> ListItemType.Footer And e.Item.ItemType <> ListItemType.Header Then
    
                DirectCast(e.Item.Cells(4).Controls(0), WebControl).CssClass = "menu"
                DirectCast(e.Item.Cells(5).Controls(0), WebControl).CssClass = "menu"
    
    
            End If
            If e.Item.ItemType = ListItemType.Item And e.Item.ItemType = ListItemType.AlternatingItem Then
    
                Totale = CType(e.Item.Cells(3).Text, Double)
    
            End If
    
            If e.Item.ItemType = ListItemType.Footer Then
    
                e.Item.Cells(3).Text = "Euro " & Totale
    
            End If
    
    
        End Sub
    uff...ma cosa sto sbagliando...

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Il tuo codice è un poco diverso dal mio.
    Io non lo posso controllare. Però ti ho passato un esempio di codice funzionante. Molte cose sono inutili perchè è un esercizio, ma la somma la fa:

    'per prima cosa devi ottenere il DbDataRecord che fornisce i dati legati

    Dim dbr As Data.Common.DbDataRecord = DirectCast(e.Item.DataItem, Data.Common.DbDataRecord)


    (questo codice vale solo per il datareader)

    'Una volta che hai il recordset ne estrai il campo che ti interessa, nel mio caso il campo [long]
    'e poi fai la somma
    Somma += DirectCast(NullToZero(dbr("long")), Integer)
    Pietro

  7. #7
    Ma così su due piedi.. a me l'errore sembra qui:

    If e.Item.ItemType = ListItemType.Item And e.Item.ItemType = ListItemType.AlternatingItem Then

    Totale = CType(e.Item.Cells(3).Text, Double)

    End If

    Gli stai dicendo di aggiungere un valore al totale quando l'item del repeater è contemporaneamente un ListItemType.Item ed un ListItemType.AlternatingItem ovvero MAI!

    Invece di usare l'AND dovresti usare l'OR meglio ancora l'ORELSE quindi prova così:

    If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then

    Totale = CType(e.Item.Cells(3).Text, Double)

    End If

    Facci sapere se funziona
    Ciao.

  8. #8
    Ah.. dimenticavo ovviametne se non hai l'AlternatingItem nel repeater devi fare così:

    If e.Item.ItemType = ListItemType.Item Then

    Totale = CType(e.Item.Cells(3).Text, Double)

    End If

    Ovvero non devi calcolare il totale sull'AlternatingItem.

    Mm... mentre scrivo in questo istante mi rendo conto anche di un'altra cosa...
    questa riga di codice:

    Totale = CType(e.Item.Cells(3).Text, Double)

    non calcola il totale, ma sostituisce il contenuto della variabile Totale ad ogni item con il valore in esso presente. Dovresti fare una cosa del genere:

    Try
    Totale += CType(e.Item.Cells(3).Text, Double)
    Catch ex As InvalidCastException
    ' ... gestisci errore...
    End Try


    Insomma c'è un po' di confuzione..
    Ciao.

  9. #9
    Ciao MArco,
    grazie per le risposte.

    Alla fine ho risolto in un altro modo, semplicemente impostando una nuova funzione che mi va a calcolare il totale.

    Effettivamente il discorso che fai tu sul OR invece dell'AND mi sembra corretto cmq...
    Appena rimetto mano al codice, faccio ugualmente la prova, soprattutto per capire il perchè questo codice non funzionasse.
    Sul totale era chiaro, avevo messo questo valore piu per ottenere un risultato che funzionasse piu che ottenere il totale vero e proprio.

    GRazie mille

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 © 2026 vBulletin Solutions, Inc. All rights reserved.