jul 20 2009

Gridview: Agrupar, Formatear, mostrar Resumen por Grupo o General

Category: Artículos | Webjayson_quintero @ 06:32

GridView: Agrupando, Creando Resumen o Formateando con pocas lineas de Codigo.

ASP.NET 2.0, 3.5
GridView Control

Muchas veces nos ha tocado trabajar con el gridView para mostrar un conjunto de datos alineados por columnas.
El GridView es un control que nos facilita mucho el mostrar datos de ese tipo de formato. Si a esto, agregamos un buen uso de
CSS, tendremos estilos muy porfesionales. Pero yo les vengo a hablar es de Agrupar y mostrar resumenes con el gridview, sin tener
que programar casi nada, tan solo con dos o tres lineas de código.

Hay varias maneras de lograr agrupar o mostrar resumenes finales o por grupo por el GridView, hay quienes ya han creado extensiones del control GridView para que haga esto de manera personalizada. Yo me encontre con un código que me facilito lograr agrupar y mostrar resumenes de estas agrupaciones. De este código es que voy a escribir.

GridView Help: consta de 5 archivos cs, los cuales ya tienen la logica requerida para hacer los procesos.
Yo me vi obligado a hacer un pequeno cambio, ya que este codigo agrupaba solo cuando tu tenias formateado el gridview con BoundField, como yo los tenia para templatefield, solo le agregue que utilizara tambien el templatefield a la hora de agrupar.

Como Usarlo:

1)Pogamos este ejemplo, de un metodo que retornar un datatable vas a alimentar el Gridview
DataTable dt2 = gestor.GestorGeneral("storeprocedurename", ListaParametros);
this.GridView1.DataSource = dt2;

Hasta aqui es lo que tu normalmente haces, claro luego lo atas con el databind, pero antes de hacer el databind

al gridview puedes formatearlos usando el Helper, aqui te ayudo con algunos pasos. Al final de cada punto haces el DataBind.

2)Para usar el helper creamos una instancia del objeto y le pasamos al constructor el control GridView

Esto es importante, ya que al pasarle el gridview al helper el identifica que control Grid va a formatear.
GridViewHelper helper = new GridViewHelper(this.GridView1);

Ahora supongamos que este ya tiene definido un templatefield con el campo Code
<asp:TemplateField HeaderText="Code" Visible="false">
  <ItemTemplate>
    <asp:Label ID="lblCRS" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.CODE") %>'></asp:Label>
  </ItemTemplate>
 <ItemStyle Width="35px" />
</asp:TemplateField>

Hasta este punto no has formateado nada, los puntos a continuacion te indicaran un proceso ya sea agrupar o hacer un summary.

3)Luego de instanciar el helper y pasarle el gridview en el constructor, pasaremos a nuestro primer punto (Agrupar)

Solo si queremos agrupar agregamos este codigo bajo la instancia (helper) que mostre arriba
helper.RegisterGroup("Code", true, true);

con solo esta linea de codigo ya el gridview se va a mostrar agrupado por la columna Code.

4)Ahora si tu necesitas mostrar resumenes por grupo en unas columnas especificas por ejemplo la columna Cargo
solo debes agregar este codigo:
helper.RegisterSummary("Cargo", SummaryOperation.Sum, "Code");


--Claro Cargo debe existir es tu templatefield veamos:
<asp:TemplateField HeaderText="Cargo" AccessibleHeaderText="Cargo">
<ItemTemplate>
<asp:Label ID="lblTotal42" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Monto") %>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="75px" CssClass="money" />
</asp:TemplateField>

5) Este resumen por grupo la mayoria de las veces queremos formatearlo con un estilo especifio, otro color o tipo de letra
   para eso creamos un evento con su metodo:

 helper.GroupSummary += new GroupEvent(helper_Bug);
 private void helper_Bug(string groupName, object[] values, GridViewRow row)
        {
            if (groupName == null) return;

            row.BackColor = System.Drawing.ColorTranslator.FromHtml("#F5F6CE");
            row.Cells[0].HorizontalAlign = HorizontalAlign.Center;
            string malapractica = "";
            malapractica = ObtenerMP(values[0].ToString()).descripcion;
            row.Cells[0].Text = "[ Total  " + malapractica + " ]";
        }

6) Ahora si quieres poner un titulo antes de cada Grupo para mostrarle al usuario que este grupo tiene tal nombre o lo que
necesites poner. Aqui deberas declarar un evento y en el metodo del evento pones el codigo, aqui te muestro:
  helper.GroupHeader += new GroupEvent(helper_GroupHeader);
  private void helper_GroupHeader(string groupName, object[] values, GridViewRow row)
        {
            if (groupName == "Code")
            {
                row.BackColor = System.Drawing.ColorTranslator.FromHtml("#ECECEC");
                row.Cells[0].Text = "Titulo por Grupo:";
            }
        }

7) Si queremos mostrar resumenes finales, donde sumamos todos los cargos (ejemplo) :
    helper.RegisterSummary("Cargo", SummaryOperation.Sum);

8) Y siquieres Formatear esta salido, como en el punto 5 sería:

            helper.GeneralSummary += new FooterEvent(helper_GeneralSummary);
            private void helper_GeneralSummary(GridViewRow row)
         {
          
             row.BackColor = System.Drawing.ColorTranslator.FromHtml("#ECECEC");
             row.Cells[0].Text = "Total Cargos: ";
      
         }
 
9) Al Final le haces el DataBind al contro, gridview. Al final de cada punto empenzando en el punto 3 debes atar el gridview.

            this.GridView1.DataBind();

Este código seguro te va hacer de mucha ayuda, yo espero me hayas entendido cada uno de estos pasos que puse para cada proceso.
si no, deja tu comentario.

Aqui te dejo las clases...

GridViewGroup.cs (4.10 kb)

GridViewGroupList.cs (1,002.00 bytes)

GridViewHelper.cs (27.15 kb)

GridViewSummary.cs (8.20 kb)

GridViewSummaryList.cs (1.01 kb)

Tags:

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5