Gestione totali intermedi tra le righe

giovedì 23 ottobre 2008 - 23.03

squilibrio Profilo | Expert

Ciao, ho un grid view che contiene elementi del tipo

Tipo - Descrizione - Gen - Feb - Mar - Apr - Mag ....

Con una serie di valori per mese

Tipo può essere C -> Costo e R -> Ricavo

i valori presenti nel grid view sono ordinati in base ad una logica prestabilita: gruppo di costi e gruppo d ricavi ... qualche cosa del tipo

C ... valori mensili
C ... valori mensili
C ... valori mensili
R ... valori mensili
R ... valori mensili
C ... valori mensili
C ... valori mensili
C ... valori mensili

Io vorrei inserire un totale ad ogni cambio di Tipo con il totale degli elementi del gruppo di appartenenza, quindi qualche cosa del tipo

C ... valori mensili
C ... valori mensili
C ... valori mensili
TOTALE C (di ogni singola colonna, quindi di ogni singolo mese)
R ... valori mensili
R ... valori mensili
TOTALE R (di ogni singola colonna, quindi di ogni singolo mese)
C ... valori mensili
C ... valori mensili
C ... valori mensili
TOTALE C (di ogni singola colonna, quindi di ogni singolo mese)


Ho già implementato una logica che mi da la somma di ogni mese... in fondo al grid view, sommando quando trova un R e sottraendo quando trova un C ... vorrei utilizzare la stessa logica per inserire i subtotali (ma mantenendo il mio "totalone" che non include ovviamente i nuovi subtotali inseriti tra le righe del grid view)


Ora la versione funzionante, col totale è:


DataRow dr = dsElenco.Tables[0].NewRow();
dr[0] = "Totale Generale";
dsElenco.Tables[0].Rows.Add(dr);

gwElenco.DataSource = dsElenco.Tables[0];
gwElenco.DataBind();

//Calcola i totali intermedi
Calculate_Total();






private void Calculate_Total()
{
double[] Array = new double[gwElenco.Columns.Count];
foreach (GridViewRow gvr in gwElenco.Rows)
{
for (int i = 2; i < gwElenco.Columns.Count; i++)
{
if (gvr.Cells[1].Text.ToString() == "R")
{
Array[i] = Convert.ToDouble(Array[i]) + Convert.ToDouble(gvr.Cells[i].Text.ToString());
}
else if (gvr.Cells[1].Text.ToString() == "C")
{
Array[i] = Convert.ToDouble(Array[i]) - Convert.ToDouble(gvr.Cells[i].Text.ToString());
}
else if (gvr.Cells[0].Text.ToString() == "Totale Generale")
{
gvr.Cells[i].Text = Array[i].ToString() ;
}

}
}
}




ed il gridview qualche cosa del tipo





<asp:GridView ID="gwElenco" runat="server" AllowPaging="False"
AutoGenerateColumns="False" DataKeyNames="Descrizione" EmptyDataText="Nessun elemento trovato!" Width="99%">
<Columns>
<asp:BoundField DataField="Descrizione" HeaderText="Descrizione">
<ItemStyle CssClass="Testo8" HorizontalAlign="Left" />
<HeaderStyle HorizontalAlign="Left" />
</asp:BoundField>
<asp:BoundField DataField="Tipo" HeaderText="T">
<ItemStyle CssClass="TestoRight8" HorizontalAlign="Right" />
<HeaderStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:BoundField DataField="1" HeaderText="Gen">
<ItemStyle CssClass="TestoRight8" HorizontalAlign="Right" />
<HeaderStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:BoundField DataField="2" HeaderText="Feb">
<ItemStyle CssClass="TestoRight8" HorizontalAlign="Right" />
<HeaderStyle HorizontalAlign="Right" />
</asp:BoundField>
...

</Columns>
<PagerSettings Mode="NumericFirstLast" />
<RowStyle Height="18px" />
<AlternatingRowStyle BackColor="#E0E0E0" />
</asp:GridView>


Grazie infinite per l'aiuto

balfaz Profilo | Expert

mi è venuto una idea mentre cercavo altre cose in rete, credo aver trovato una maniera di come risolvere il tuo problema (possibilmente), purtroppo mi sa che esteticamente non è che se ne possa fare molto, ma come già saprai dovrai usare l'evento rowdatabound, dopodiché i campi con i valore numerici da sommare possono essere mostrati in una colonna di tipo ItemTemplate con dentro un controllo Literal che avrà come valore la tua attuale formattazione del campo (es. TuoLiteralCtrl.text = "<p CssClass='TestoRight8' HorizontalAlign='Right' >" & DataBinder.Eval(e.Row.DataItem, "2").ToString & "</p>")
poi fai la solita condizione di controllo per conoscere quando e cambiato il tipo (C o R) e se fosse ora di totalizzare fai dentro lo stesso literal

TuoLiteralCtrl.text += "<br /><div class='Div_TOt'>" & format(...,var_TOt) & "</div><br />"

no lo so mi è venuto questo in maniera Bansai!!! spero funzione devo continuare la mia ricerca in rete. AUGURI
"Ci sono due tipi di pazzi, quelli che dicono pazzie e quelli che le fanno diventare una realtà."
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