#733 - Aggiungere righe di riepilogo delle categorie al DataGrid

Per migliorare a livello visivo le informazioni contenute nel DataGrid può essere utile l'aggiunta di una riga che riepiloghi, ad esempio, la categoria.
Ovviamente perchè questo script possa funzionare al meglio, è necessario che la query che estrae i dati dal database ordini già i risultati in base alla categoria.
Successivamente sarà necessario effettuare un ciclo sui record restituiti, in modo da aggiungere righe fittizie, che in realtà ci serviranno solo per modificare il DataGrid in fase di databinding:

// variabile per contenere la categoria corrente


string currentCategory = String.Empty;

// prendo i dati dal DataSet popolato

DataTable dt = ds.Tables[0];

for (int i = 0; i<dt.Rows.Count; i++)
{
  // controllo se la categoria è la stessa della riga precedente

  if (ds.Tables[0].Rows[i]["category"].ToString() != currentCategory)
  {
    // aggiungo una nuova riga al DataTable

    DataRow dr = dt.NewRow();
    dr[0] = dt.Rows[i]["category"].ToString();
    dt.Rows.InsertAt(dr, i);
  }

  // salvo la categoria corrente

  currentCategory = ds.Tables[0].Rows[i]["category"].ToString();
}

currentCategory = String.Empty;

// faccio il binding dei dati sul datagrid

dg.DataSource = dt;
dg.DataBind();

Per convenzione abbiamo salvato nella prima colonna della nuova riga la categoria, in modo che poi attraverso il ciclo che segue, mutuato dallo script #697, venga preparata la riga con la descrizione e rimossa la prima colonna da tutte le altre:

// routine per intercettare il databind e modifica il DataGrid

private void dg_ItemDataBound(object sender, DataGridItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
    // controllo se la categoria è sempre la stessa

    // la cerco nella prima colonna, le altre sono vuote

    if (e.Item.Cells[0].Text != currentCategory)
    {
      // cambio il colspan, così la cella è grande tutta la riga

      e.Item.Cells[0].ColumnSpan = e.Item.Cells.Count;

      // e tolgo via le altre celle

      for (int i = 1; i < e.Item.Cells.Count; i++)
        e.Item.Cells.RemoveAt(i);
    }
    else
    {
      // rimuovo solo la prima riga, che contiene la categoria

      e.Item.Cells.RemoveAt(0);
    }

    // salvo il titolo corrente prima di continuare il ciclo

    currentCategory = e.Item.Cells[0].Text;
  }
}

Per approfondimenti si veda:

#697 - Aggiungere al DataGrid un effetto al passaggio del mouse
http://www.aspitalia.com/script/697/AggiungereDataGridEffettoPassaggioMouse.aspx


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

latinoitalia scrive:
#733 - Aggiungere righe di riepilogo delle categorie al DataGrid

questa è la traduzione in visua basic dello scriptDim dt As DataTable = ds.Tables(0) For i As Integer = 0 To dt.Rows.Count If ds....
martedì 4 ottobre 2005

Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC