quarta-feira, 10 de fevereiro de 2010

C#: Agrupando um GridView

Objetivo: 

Agrupar um GridView por determinada coluna.

Ola pessoal, hoje vamos falar de algo que era para ser default do GridView mas que ainda gera muitas duvidas em relação ao seu uso, que é o agrupamento do GridView por um determinado "assunto" mas antes de começarmos, vamos fazer o download do GridViewHelper, desenvolvido pela http://www.agrinei.com/ (eu não sei quem são, mas fizerem um bom trabalho).

segue o link do download: 

descompacte o zip, e sobre a pasta App_Code do seu site, ou em um projeto de classe, adicione todos esses arquivos, menos, claro o webform, ".aspx"


O uso dele é muito simples, e no site do desenvolvedor você encontra todas as funções, vou listar aqui apenas a mais básica, mas com um porém, no site da fornecedora desse "ajudante" eles esquecem de mencionar que precisa ter uma referência para um evento do gridView que não foi postado lá. 

 Agora vamos criar nossa pagina, e vê como está a estrutura do nosso projeto:



Agora vamos colocar um pouco de código nisso aqui!

primeiro vá no seu projeto e adicione o arquivo Pais.xml com a seguinte estrutura:



Até ai ta tudo normal, nada que você não tenha visto, agora vamos adicionar o código do nosso helper, e vê como o gridview vai se comportar


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace testeHelper
{
    public partial class _Default : System.Web.UI.Page
    {
        public void RealizaConsulta()
        {

            //==============================================
            // Criando um dataset e lendo arquivo XML
            //==============================================

            DataSet objDataSet = new DataSet();
            objDataSet.ReadXml(Server.MapPath("\\") + "Pais.xml");

            //==============================================
            // Passando nosso dataset e dando bind dos dados
            //==============================================

            grvGridHelper.DataSource = objDataSet;
            grvGridHelper.DataBind();

       
        }

        protected void Page_Load(object sender, EventArgs e)
        {

            RealizaConsulta();
          
            GridViewHelper helper = new GridViewHelper(this.grvGridHelper);
            helper.RegisterGroup("Estado", true, true);
            helper.ApplyGroupSort();

        }

        protected void grvGridHelper_Sorting(object sender, GridViewSortEventArgs e)
        {
            // Esse evento precisa ser declarado
            RealizaConsulta();

        }
    }
}

Reparem no código acima; Tivemos que realizar a consulta duas vezes, o que não é muito aconselhado se for um sistema muito requisitado, pense em outra forma de da um bind no grid no momento que ele faz o Sorting. 

E o resultado da nossa Grid fica assim:


Simples não? mais facil que isso só andar pra frente.

2 comentários:

  1. Ótimo, Matheus! Eu estava agarrado nesse "esquecimento" do pessoal do agrinei.com.

    O que eu gostaria de lhe perguntar é o seguinte: e pra formatar essa linha que vai agrupar os registros? Se eu quisesse um fundo cinza para a linha que vai mostrar a sigla do estado no seu exemplo, como faria?

    O exemplo do artigo no outro site não funcionou.

    ResponderExcluir
  2. Boa tarde,
    estou usando este código para agrupar por curso as turmas. Porém vi que o código só funciona se colocar no Page Load. Mas quando tento usar o evento RowCommand e tento resgatar o valor do id da linha e.CommandArgument o primeiro click vem sempre vazio apenas no segundo clique do usuario

    ResponderExcluir