Aggiungere righe di riepilogo delle categorie al DataGrid

di Daniele Bochicchio, in ASP.NET, ADO.NET, DataBinding,

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;
  }
}

Approfondimenti


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

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi