viernes, 11 de mayo de 2012

Agrupar GridView asp.net

Ahora les quiero mostrar como hacer grupos con sus totales y totales generales a un GridView en asp.net

Vamos a agrupar el siguiente Grid:


Para agrupar por una columna en un grid de asp.net, debemos hacer TemplateFields la o las columnas por las que vayamos a crear los grupos.  En este caso voy a agrupar por mi columna "Proveedor":


<asp:TemplateField HeaderText="Proveedor" Visible="false" AccessibleHeaderText="Proveedor">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Proveedor") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Proveedor") %>'></asp:TextBox>
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Left" />
<ItemStyle HorizontalAlign="Left" />
</asp:TemplateField>

Deben descargar las siguientes clases aquí.

Para crear el grupo, deben escribir el siguiente código:

GridViewHelper helper = new GridViewHelper(this.gridVentas);

helper.RegisterGroup("Proveedor", true, true);
helper.GroupHeader += new GroupEvent(helper_GroupHeader);

helper.ApplyGroupSort();
gridVentas.DataBind();


Esto nos dará el siguiente resultado:


Ahora, para agregar los totales por grupo deben copiar el siguiente código:


helper.RegisterSummary("Valor1", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
helper.RegisterSummary("Valor2", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
helper.RegisterSummary("Valor3", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
helper.GroupSummary += new GroupEvent(helper_Bug);


Y este para los totales generales:


helper.RegisterSummary("Valor1", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
helper.RegisterSummary("Valor2", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
helper.RegisterSummary("Valor3", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
helper.GeneralSummary += new FooterEvent(helper_GeneralSummary);

Para poder darle formato a las filas del grupo, del total por grupo y total general, debemos usar los siguientes eventos que ya fueron referenciados arriba:

private void helper_Bug(string groupName, object[] values, GridViewRow row)
{
    if (groupName == null) return;

    row.Cells[1].Text = "TOTAL PROVEEDOR:";
    row.Cells[1].HorizontalAlign = HorizontalAlign.Right;
 
    row.Font.Bold = true;
    row.BackColor = System.Drawing.ColorTranslator.FromHtml("#F5F6CE");
   
}

private void helper_GeneralSummary(GridViewRow row)
{
    row.Cells[1].Text = "TOTAL GENERAL:";
    row.Cells[1].HorizontalAlign = HorizontalAlign.Right;

    row.Font.Bold = true;
    row.ForeColor = System.Drawing.Color.White;
    row.BackColor = System.Drawing.ColorTranslator.FromHtml("#5D7B9D");
}

private void helper_GroupHeader(string groupName, object[] values, GridViewRow row)
{
    if (groupName == "Proveedor")
    {
row.Cells[0].Font.Bold = true;
        row.Cells[0].HorizontalAlign = HorizontalAlign.Left;
        row.BackColor = System.Drawing.ColorTranslator.FromHtml("#B3D5F7");
        row.Cells[0].Text = string.Format("Proveedor:   {0}", values[0].ToString());
    }
}


El producto final que vamos a obtener es el siguiente:


Y así se verá el total general:


Para los que no tenemos Telerik o DevExpress esta bueno verdad??? jajaja


12 comentarios:

  1. Hola Rop, mira soy estudiante y seguí tu código para poder agrupar en un gridview. Sirvió de maravillas, sin embargo a mi control, le agregué un template en la primera columna, con un checkbox en su interior. Al recorrer la grilla para saber qué checkbox fue seleccionado, no logro obtener aquella fila. Por ejemplo:

    foreach (GridViewRow gvRow in gvResultado.Rows)
    {

    if (gvRow.RowType == DataControlRowType.DataRow)
    {
    if (gvRow.FindControl("chkSeleccionar") != null)
    {

    CheckBox chkSeleccionar = (CheckBox)gvRow.FindControl("chkSeleccionar");

    if (chkSeleccionar.Checked)
    { ....


    Si tengo 4 filas como resultado, y selecciono la última, a pesar de que encuentra el control checkbox, lo toma como si no estuviese seleccionado, por tanto nunca entra en la condición.

    La verdad es que no logro determinar cómo hacerlo. Espero me hayas entendido, a ver si logras darme una mano.

    De antemano gracias.

    Saludos!

    ResponderEliminar
  2. Como estas? mira será que podrías postear un ejemplo completo o poner un zip con todos los archivitos...Saludos

    ResponderEliminar
  3. Me genera un error cuando hago la paginación que la verdad no tengo mucha idea.

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. hola

    2 consultas, para realizar lo de la primera agrupacion, no puedo ocupar est (helper_GroupHeader).
    y segunto este codigo en que evento lo utilizo??

    gracias

    ResponderEliminar
  6. Estimado Cuando realizo un postback x ejemplos cuando selecciono un elemto de un combo del formulario, se desconfigura la grilla del ejemplo :S, como puedo hacer para q permanesca igual

    ResponderEliminar
  7. hola buena tarde, gracias por tu aportacion, si funciona estaria de maravilla, hasta el momento no se en que evento va la parte del codigo que indicas es para agrupacion, y otra, esta variable no la encuentro o que seria esto helper_GroupHeader

    ResponderEliminar
  8. Helper_GroupHeader:




    protected void Page_Load(object sender, EventArgs e)
    {
    GridViewHelper helper = new GridViewHelper(this.GridView1, true);
    helper.RegisterGroup("ShipRegion", true, true);
    helper.RegisterGroup("ShipName", true, true);
    helper.GroupHeader += new GroupEvent(helper_GroupHeader);
    helper.ApplyGroupSort();
    }


    private void helper_GroupHeader(string groupName, object[] values, GridViewRow row)
    {
    if ( groupName == "ShipRegion" )
    {
    row.BackColor = Color.LightGray;
    row.Cells[0].Text = "  " + row.Cells[0].Text;
    }
    else if (groupName == "ShipName")
    {
    row.BackColor = Color.FromArgb(236, 236, 236);
    row.Cells[0].Text = "  " + row.Cells[0].Text;
    }
    }


    Fuente: http://forums.asp.net/t/1047828.aspx/1

    ResponderEliminar
  9. Hola a todos:
    Funciona perfecto, a excepción del problema que reporta Deyvis Sosa. Estoy haciendo unas validaciones en la página que tiene la grilla, pero al momento de hacer un postback y volver, las filas de la grilla se desordenan.
    Alguien ha encontrado alguna solución?

    ResponderEliminar
  10. Hola a todos, hice los pasos que dice el post, pero al llegar al evento helper.ApplyGroupSort(); . Me sale un error de que mi gridview desencadeno un evento sorting que no esta controlado. No se si tenga que activar alguna propiedad del gridview, o si mis columnas estan mal distribuidas. Espero me puedan ayudar. Saludos

    ResponderEliminar
  11. Hay alguna versión de las librerias en .vb?

    ResponderEliminar
  12. Hola soy nuevo en programacion ... por favor me podrian indicar donde tengo que pegar este codigo .

    **********
    GridViewHelper helper = new GridViewHelper(this.gridVentas);

    helper.RegisterGroup("Proveedor", true, true);
    helper.GroupHeader += new GroupEvent(helper_GroupHeader);

    helper.ApplyGroupSort();
    gridVentas.DataBind();
    ***********************

    helper.RegisterSummary("Valor1", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
    helper.RegisterSummary("Valor2", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
    helper.RegisterSummary("Valor3", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
    helper.GroupSummary += new GroupEvent(helper_Bug);


    Y este para los totales generales:


    helper.RegisterSummary("Valor1", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
    helper.RegisterSummary("Valor2", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
    helper.RegisterSummary("Valor3", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
    helper.GeneralSummary += new FooterEvent(helper_GeneralSummary);

    ResponderEliminar