Impostare un totale nella forma Euro con separatore delle migliaia.

venerdì 26 dicembre 2008 - 20.48

86Marco Profilo | Expert

Salve, avrei una richiesta da fare sulla mia applicazione asp.net.
Riesco a fare il totale di una colonna di dati di una gridview.
Ma la mia domanda è come fare stampare il risultato con separatore delle migliaria, io riesco semplicemente in Dbl.

Se il risultato è 1936,27 vorrei averlo stampato 1.936,27.
Come fare? Grazie.

alx_81 Profilo | Guru

>Salve, avrei una richiesta da fare sulla mia applicazione asp.net.
Ciao!

>Riesco a fare il totale di una colonna di dati di una gridview.
>Ma la mia domanda è come fare stampare il risultato con separatore
>delle migliaria, io riesco semplicemente in Dbl.
>Se il risultato è 1936,27 vorrei averlo stampato 1.936,27.
>Come fare?
Allora, se stai usando un gridview puoi utilizzare la proprietà DataFormatString del BoundField:
http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.boundfield.dataformatstring(VS.80).aspx

Vedrai che puoi scegliere ogni formato che ti interessa

>Grazie.
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

Ciao molto interessante veramente.
Grazie,

tuttavia ho altre due domande.
1) Come posso fare un totale direttamente sull'ultima riga di una gridview??


2) Nel particolare io faccio un totale che mi viene stampato da un'altra parte della pagina tramite il seguente codice:

Dim i As Integer
Dim a As Decimal
a = 0
For i = 0 To GridView1.Rows.Count - 1
a = a + GridView1.Rows(i).Cells(3).Text
'a = a + CDec(GridView1.Rows(i).Cells(3).Text)

Next i
Response.Write("Il totale è : " & CDbl(a))


Il tutto mi funziona correttamente e mi fa il totale della colonna numerica che la grid mi ripropone, ma come posso settare una formattazione del tipo € 1.450,52 quando stampo a schermo il totale stesso?

Grazie, spero saprai, come credo, rispondermi.
Mille grazie ancora

alx_81 Profilo | Guru

>tuttavia ho altre due domande.


>1) Come posso fare un totale direttamente sull'ultima riga di una gridview??
Puoi prendere il datatable sorgente della griglia, fare i calcoli tramite il metodo Compute del Datatable e aggiungere alla fine la riga coi totali:
http://msdn.microsoft.com/en-us/library/system.data.datatable.compute.aspx

>2) Nel particolare io faccio un totale che mi viene stampato da un'altra parte della pagina tramite il seguente codice:
Usa il metodo spiegato sopra.. eviti di scrivere cicli

>Il tutto mi funziona correttamente e mi fa il totale della colonna numerica che la grid mi ripropone, ma come posso settare una
>formattazione del tipo € 1.450,52 quando stampo a schermo il totale stesso?
Se lo lasci sulla response.write, devi usare il metodo ToString del tuo oggetto Decimal, impostando però la formattazione come fai per il DataFormatString:
http://msdn.microsoft.com/en-us/library/fzeeb5cd.aspx

>Grazie, spero saprai, come credo, rispondermi.
Grazie per la fiducia!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

CIao, so che magari potro sembrare un po tonto, ma non ho capito bene il primo punto, non è che me lo spiegjeresti nel dettaglio o magari postarmi un esempio?
Mille grazie

alx_81 Profilo | Guru

Andiamo passo passo. Come popoli la tua griglia? Usi un SQLDataSource? Un AccessDataSource? Un ObjectDataSource? Da codice usando ADO.Net?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

ti posto il codice della mia gridview :)

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" BackColor="LightGoldenrodYellow" BorderColor="Tan"
BorderWidth="1px" CellPadding="2" DataKeyNames="id" DataSourceID="SqlDataSource1"
GridLines="None" ForeColor="Black"
style="font-size: small; font-family: Arial">
<FooterStyle BackColor="Tan" />
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True"
SortExpression="id" />
<asp:BoundField DataField="Descrizione" HeaderText="Descrizione" SortExpression="Descrizione" />
<asp:BoundField DataField="Importo" DataFormatString="{0:C}"
HeaderText="Importo" ItemStyle-HorizontalAlign="Right"
SortExpression="Importo" >

<ItemStyle HorizontalAlign="Right"></ItemStyle>
</asp:BoundField>

</Columns>
<PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue"
HorizontalAlign="Center" />
<SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
<HeaderStyle BackColor="Tan" Font-Bold="True" />
<AlternatingRowStyle BackColor="PaleGoldenrod" />
</asp:GridView>

alx_81 Profilo | Guru

>ti posto il codice della mia gridview :)
Ok, dalla proprietà DataSourceID stai usando un SQLDataSource (se non gli hai cambiato tu il nome, quello è il default dei SQLDataSources, oggetti in cui scrivi le query di selezione e/o aggiornamento che gestiranno un controllo, nel tuo caso la griglia).

Di conseguenza, da codice, prima che il Binding dei dati avvenga (Binding = Collegamento della sorgente alla griglia), ad esempio all'evento DataBinding (http://msdn.microsoft.com/en-us/library/system.web.ui.control.databinding.aspx), devi ricavare il datatable che contiene la tua query. Qui un esempio:

using System.Data; [...] // ottengo la tabella DataView dv = (DataView)SQLDataSource1.Select(DataSourceSelectArgument s.Empty); Datatable dt = dv.Table; // ottengo una nuova riga partendo dallo schema del datatable DataRow dr = dt.NewRow(); // calcolo i dati nella nuova riga dr["campo1"] = dt.Compute("SUM(campo1)", String.Empty); dr["campo2"] = dt.Compute("MAX(campo2)", String.Empty); // aggiungo la riga alla fine dt.Rows.Add(dr);

Qualcosa di simile


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

ok credo di avere capito bene. Soltanto che nn riesco a trovare l'evento nel quale inserire il codice da te espostomi sopra:)
Grazie

alx_81 Profilo | Guru

>ok credo di avere capito bene. Soltanto che nn riesco a trovare
>l'evento nel quale inserire il codice da te espostomi sopra:)
Cosa significa che non riesci a trovarlo? Se usi Visual Basic hai le tendine in alto nell'editor del VB che ti permettono di scegliere la griglia (a sinistra) e il suo evento da gestire (a destra). Se usi C#, nella finestra delle proprietà di Visual Studio (attivabile con F4) mentre scrivi l'aspx o usi il designer troverai un'icona con un fulmine. Quelli sono gli eventi.
Prima clicki sulla gridview e poi guardi gli eventi. Fai doppio click sull'evento DataBinding e Visual studio ti creerà il metodo che gestisce quell'evento.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

mi sono spiegato male:)
Gli eventi li trovo tutti.

Non riesco a farlo funzionare:
nell'evento DataBinding di sqldatasource1 inserisco questo codice che credo sia giusto:


Dim dv As System.Data.DataView
dv = SqlDataSource1.Select(DataSourceSelectArguments.Empty)

Dim dt As New System.Data.DataTable
dt = dv.Table

Dim dr As System.Data.DataRow
dr = dt.NewRow()
dr("Importo") = dt.Compute("SUM(Importo)", String.Empty)

dt.Rows.Add(dr)

Purtroppo pero niente da fare non mi cambia niente!

Ho provato a incollare lo stesso codice ache sulla proprietà DataBinding di DataGrid maanche in qyesta occasione niente ... :(
xche?

alx_81 Profilo | Guru

>mi sono spiegato male:)
>Gli eventi li trovo tutti.
Prova ad usare l'evento PreRender. Ho fatto una prova e lì dovrebbe funzionare. Ricordati però alla fine di assegnare alla proprietà datasource del tuo gridview la dt popolata con la riga nuova e di mettere nella proprietà DataSourceID String.Empty. In questo modo userai la tua tabella come sorgente.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

In questo modo?

'ottengo la tabella
Dim dv As System.Data.DataView
dv = SqlDataSource1.Select(DataSourceSelectArguments.Empty)

Dim dt As New System.Data.DataTable
dt = dv.Table

'ottengo una nuova riga partendo dallo schema del datatable
Dim dr As System.Data.DataRow
dr = dt.NewRow()

'calcolo i dati nella nuova riga
dr("Importo") = dt.Compute("SUM(Importo)", String.Empty)

'aggiungo la riga alla fine
dt.Rows.Add(dr)

GridView1.DataSource = dt
GridView1.DataSourceID = String.Empty

Scusa l'ignoranza in materia, e ti ringrazio nuovamente per la infinita pazienza!

alx_81 Profilo | Guru

>In questo modo?
Sì, poi fai GridView1.DataBind() per collegare i dati.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

perfetto. grazie mille.

un ultimissima cosa. in questa gridview ho settato la selezione di ogni riga della stessa gridview.
Ora come posso fare x evitare che l'utente non possa selezionare solo la riga relativa al totale?
Grazie.

alx_81 Profilo | Guru

>perfetto. grazie mille.
>
>un ultimissima cosa. in questa gridview ho settato la selezione
>di ogni riga della stessa gridview.
>Ora come posso fare x evitare che l'utente non possa selezionare
>solo la riga relativa al totale?
nell'evento di selezione, se l'indice della riga selezionata è il count delle righe - 1, non fai nulla ed esci dalla modalità di selezione.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

86Marco Profilo | Expert

L'ho fatto in questa maniera, ma è selezionabile comunque!

Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
If GridView1.SelectedIndex = GridView1.Rows.Count - 1 Then
Response.Write("Non selezionabile")
Else
Response.Write(GridView1.Rows(GridView1.SelectedIndex).Cells(1).Text)
End If

alx_81 Profilo | Guru

>L'ho fatto in questa maniera, ma è selezionabile comunque!
Devi cercare di leggere le guide con più attenzione
Prendilo come un consiglio eh

Per deselezionare una riga devi mettere la proprietà SelectedIndex a -1
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.selectedindex.aspx (leggi il remark)
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5