asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 7949
ASPCode.it - Store

  > > Articoli

Calcolare il valore totale su una colonna di un DataGrid

Data di pubblicazione: 15/05/2005        Voto della community: 0,00 (Votanti: 0)


In questo articolo vedremo come è possibile "scorrere" i record di un datagrid allo scopo di calcolare il totale dei valori presenti in una colonna, sia per la pagina correntemente visualizzata nel datagrid, sia per l'intera sorgente di dati del datagrid stesso.

Il DataGrid è un WebControl piuttosto versatile che consente di visualizzare, secondo formattazioni e stili ampiamente configurabili tramite le proprietà del datagrid stesso, dati provenienti da una qualunque sorgente (database relazionale, file XML, ecc.).
Nel seguito di questo articolo analizzeremo un tipo di elaborazione possibile dei dati presenti in un ipotetico datagrid dg1 presente nella nostra applicazione web. In particolare, supponendo di avere un attributo denominato IMPORTO contenente dei valori numerici, ciò che vogliamo ottenere è il valore totale dei record per tale campo, sia nella pagina correntemente visualizzata (il valore sarà visualizzato nella Label lbTotale), sia nella intera sorgente di dati da cui il nostro datagrid attinge (il valore verrà visualizzato nella Label con id lbTotaleAllPages); i due valori totali saranno ovviamente identici se il datagrid è costituito da una sola pagina.

Nella funzione Page_Load() devono essere innanzitutto caricati i dati all'interno del datagrid; lascio al lettore l'onere di eseguire questa operazione di inizializzazione effettuabile a partire, ad esempio, tramite la lettura dei dati da un comune database MS Access. Successivamente viene richiamata la funzione ComputeTotals() che è il cuore di questo articolo, cioè la funzione che effettivamente effettua il calcolo dei totali sull'attributo IMPORTO.
Nella prima parte di questa funzione viene istanziato un oggetto ds1 di tipo DataSet che andiamo a popolare con la sorgente di dati del datagrid; se tale oggetto risulterà nullo significa che il datagrid non è associato ad alcuna sorgente di dati per cui potremo fermare l'esecuzione dello script. Un discorso analogo per la presenza di record o meno nella sorgente di dati viene effettuato nelle righe successive.
Segue la porzione di codice che valuta il totale della pagina correntemente visualizzata: per ogni Item del datagrid viene letto il valore della cella 0 (quindi si suppone che la colonna IMPORTO sia la prima), tale valore viene convertito in double e sommato al valore già presente nella variabile tot che alla fine del ciclo conterrà il totale cercato.
La procedura per il calcolo del totale su tutto il dataset è simile. Tramite la funzione IndexOf() possiamo individuare l'indice della colonna di interesse e, successivamente, "cicliamo" fra le righe (Rows) del dataset stesso sommando i valori trovati alla variabile tot che avremo provveduto a reinizializzare a 0 prima di iniziare il ciclo.
Ed ecco il codice completo dell'esempio (ricordiamo di popolare il datagrid con una sorgente di dati contenente un attributo chiamato IMPORTO):

<%@ Import Namespace="System.Data" %>

<script language="C#" runat="server">

void Page_Load(Object sender, EventArgs e){
  // fill DataGrid with data
  // ...
  ComputeTotals();
}

private void ComputeTotals()
{
  DataSet ds1 = (DataSet)this.dg1.DataSource;
  if(ds1==null)
    return;
  if(ds1.Tables.Count>0)
  {
    // total current page
    double tot = 0;
    int i;
    for(i=0; i<this.dg1.Items.Count; i++)
    {
      tot += Convert.ToDouble(this.dg1.Items[i].Cells[0].Text);
    }

    if(i==0)
    {
      this.lbTotale.Visible = false;
    }
    else
    {
      this.lbTotale.Text = "<b>Totale record selezionati (pagina corrente): " + tot.ToString("F2") + "</b>";
      this.lbTotale.Visible = true;
    }

    // total all pages
    DataSet ds = ds1;

    int colIdx = ds.Tables[0].Columns.IndexOf("IMPORTO");

    tot = 0;

    for(i=0; i<ds.Tables[0].Rows.Count; i++)
    {
      tot += Convert.ToDouble(ds.Tables[0].Rows[i].ItemArray[colIdx].ToString());
    }

    this.lbTotaleAllPages.Text = "<b>Totale record selezionati (tutte le pagine): " + tot.ToString("F2") + "</b>";
  }
}

</script>

<html>
<head>
  <title> DataGrid - totale colonna </title>
</head>
<body>

<form runat="server">
<asp:Datagrid id="dg1" runat="server" />
<br /><br />
<asp:Label id="lbTotale" runat="server" />
<br />
<asp:Label id="lbTotaleAllPages" runat="server" />
</form>

</body>
</html>




Utenti connessi: 7949