Vous êtes sur la page 1sur 11

Criando colunas dinamicamente no ASP.

NET DataGrid
por Marcos Santos e Alexandre Santos

Este artigo discute Controle ASP.NET DataGrid Acesso a banco de dados

Este artigo usa as seguintes tecnologias: C#, SQL Download: fontesDataGridDinamico.zi

Chapu DataGrid Desde o lan!amento do ASP.NET o DataGrid " um dos controles mais em re#ados, rinci almente ela sua f$cil utiliza!%o e &uantidade de recursos &ue au'iliam o desen(ol(edor a criar $#inas robustas e atrati(as. Atra("s do )isual Studio .NET fica ainda mais ins irador o uso de DataGrid, dada * (elocidade de desen(ol(imento, +$ &ue em oucos cli&ues, t,m-se acesso aos .izards &ue confi#uram as colunas /Pro ert0 1uilder2 e o formato (isual /Auto 3ormat2, restando a enas atribuir o seu DataSource, odendo ser um DataTable, Cole!4es entre outros. 5 ob+eti(o deste arti#o " mostrar a formata!%o e cria!%o de colunas no DataGrid de forma din6mica. 7 criado um ro+eto ASP.NET &ue efetua uma consulta de Produtos com suas res ecti(as Cate#orias no banco de dados Nort89ind do SQL Ser(er. 7 a resentado ao usu$rio todos os Produtos a#ru ados or Cate#orias, com subtotais. Para isto, " utilizado como DataSource um no(o DataTable criado a artir dos dados retornados na consulta. Tal(ez (oc, este+a se er#untando: ;Por &ue criar colunas dinamicamente, se " oss<(el cri$las sem uma lin8a de c=di#o e de forma &uase &ue instant6nea utilizando o )S.NET>;. Certo> A res osta ara tal er#unta ode ser mel8or analisada atra("s do se#uinte &uestionamento: ;Como fazer ara &ue um mesmo DataGrid se+a arametrizado de forma tal, &ue em certas situa!4es a resente ? colunas e em outras situa!4es a resente @ colunas>;. Aes osta: Criar as colunas dinamicamente, odendo tamb"m utilizar artif<cios de orienta!%o a ob+etos /552 Beran!a e Polimorfismo. Para aumentar a com reens%o da res osta a resentada, ima#ine &ue (oc, &ueira centralizar seus relat=rios em a enas uma $#ina .as ' com a enas um DataGrid e &ue cada relat=rio ten8a consulta SQL diferente um do outro. Cma forma (i$(el, atra("s de 55 " criar uma classe ai AelatorioPadrao com dois m"todos: retornaColunas/2 e retornaDados/2 e ara cada relat=rio a ser #erado, criar classes fil8as /e'em lo AelatorioProduto2 &ue ir%o sobrescre(er estes m"todos. Desta forma, na $#ina .as ' ser$ instanciada a classe dese+ada e in(ocados os m"todos &ue retornam as colunas do DataGrid e seu DataSource. Neste arti#o, ara sim lificar, n%o ser$ modelado atra("s de classes e subclasses. A cria!%o das colunas, formata!%o do DataGrid e a#ru amento com subtotais ser%o feitos diretamente na classe da Dnterface /.as '2.

Projeto

Crie um ro+eto ASP.NET .eb A lication c8amado DataGridA#ru adoColunas usando como lin#ua#em o )isual C#, contendo um formul$rio c8amado GridA#ru adoColunas.as '. Dnsira E controles, F DataGrid /id G #ridProdutoCate#orias2, F 1utton /id G btnSelecionados 2 e F List1o' /id G lstSelecionados2 - (e+a a 3i#ura F. A enas obser(e &ue s%o utilizadas tabelas BTHL ara ossibilitar uma mel8or or#aniza!%o (isual.

Figura 1 - La0out de Dnterface su#erido. Para a#ilizar o tem o de desen(ol(imento, selecione o DataGrid e formate a cor e fonte do cabe!al8o, atra("s de suas ro riedades BeaderSt0le. Em tem o de desi#n n%o " necess$rio fazer mais nada. No ro+eto su#erido " realizada uma consulta ao 1anco de Dados Nort89ind do SQL Ser(er, retornando a tabela Products com sua res ecti(a Cate#ories, como na 3i#ura I. Por"m, os rodutos ser%o (isualizados a#ru ados or Cate#orias no DataGrid, incluindo subtotais e, no final, um Total Geral. Para isto, (ia ro#rama!%o, a artir da consulta ori#inal " criado um no(o DataTable no modelo final.

Figura 2 - Quer0 realizada no Nort89ind. No DataGrid s%o criadas J colunas dinamicamente: o!e Selecionar Descri!%o )alor Cnit$rio Quantidade Esto&ue )alor Esto&ue "ipo Tem lateColumn 1oundColumn 1oundColumn 1oundColumn 1oundColumn #$s% Tem lateColumnC8ecK1o'

1oundColumns s%o colunas &ue se relacionam com os cam os do DataSource do DataGrid em &uest%o. Tem lateColumns s%o colunas com le'as, &ue ermitem a inser!%o de di(ersos outros controles, or e'em lo um C8ecK1o'. Neste caso, a coluna ;Selecionar; ossuir$ um C8ecK1o' em todas as lin8as, menos nos #ru os e subtotais, ermitindo &ue o internauta informe &uais rodutos dese+a selecionar. Quando o usu$rio clicar no bot%o ;Hostra Selecionados;, os rodutos selecionados ser%o adicionados ao List1o'. Esta funcionalidade " ara e' licitar &ue mesmo sendo adicionados controles em tem o de desen(ol(imento /runtime2, seus (alores ermanecem entre Post1acKs. Dnicio da a#ina

C&digo
Primeira arte a ser desen(ol(ida " a cria!%o das colunas do DataGrid, ara isto no m"todo 5nDnit de(e ser in(ocada a rotina ;criaColunasGrid/2;. A necessidade da c8amada ser no 5nDnit ocorre de(ido &ue neste e(ento os controles ainda n%o s%o o ulados com seus dados elo Data)ie9, Lltimo estado entre Post1acKs. override protected void OnInit(EventArgs e)

{ InitializeComponent(); base.OnInit(e); //dever ser invocado aqui p/ manter a renderiza !o //das colunas" atrav#s de $ost%ac&s t'is.criaColunas(rid();

) Di#ite a rotina criaColunasGrid &ue cria as colunas dinamicamente no DataGrid. //Cria as colunas dinamicamente no *ata(rid private void criaColunas(rid() { //Colunas n!o geradas automaticamente grid$rodutoCategorias.Auto(enerateColumns + ,alse; //coluna -emplate que nos permite adicionar o c'ec&bo. -emplateColumn col/elecionar + ne0 -emplateColumn(); col/elecionar.1eader-e.t + 2/elecionar2; //in,orma o que o Item-emplate # do tipo -emplateColumnC'ec&%o. col/elecionar.Item-emplate + ne0 -emplateColumnC'ec&%o.(); //coluna descri !o %oundColumn col*escricao + ne0 %oundColumn(); col*escricao.*ata3ield + 2*escricao2; col*escricao.1eader-e.t + 2*escri !o2; col*escricao.Item/t4le.1orizontalAlign + /4stem.5eb.6I.5ebControls.1orizontalAlign.7e,t; //coluna valor unit8rio %oundColumn col9alor6nitario + ne0 %oundColumn(); col9alor6nitario.*ata3ield + 2valor6nitario2; col9alor6nitario.1eader-e.t + 29alor 6nit8rio2; col9alor6nitario.*ata3ormat/tring + 2{:;3<)2; col9alor6nitario.Item/t4le.1orizontalAlign + /4stem.5eb.6I.5ebControls.1orizontalAlign.=ig't; //coluna 6nidades no Estoque %oundColumn col6nidadesEstoque + ne0 %oundColumn(); col6nidadesEstoque.*ata3ield + 2unidadesEstoque2; col6nidadesEstoque.1eader-e.t + 2>uantidade Estoque2; col6nidadesEstoque.Item/t4le.1orizontalAlign + /4stem.5eb.6I.5ebControls.1orizontalAlign.=ig't; //coluna (valor6nitario ? unidadesEstoque) %oundColumn col9alorEstoque + ne0 %oundColumn(); col9alorEstoque.*ata3ield + 2valorEstoque2; col9alorEstoque.1eader-e.t + 29alor Estoque2; col9alorEstoque.*ata3ormat/tring + 2{:;3<)2;//duas casas decimais col9alorEstoque.Item/t4le.1orizontalAlign + /4stem.5eb.6I.5ebControls.1orizontalAlign.=ig't; //adiciona colunas criadas no grid grid$rodutoCategorias.Columns.Add(col/elecionar); grid$rodutoCategorias.Columns.Add(col*escricao); grid$rodutoCategorias.Columns.Add(col9alor6nitario); grid$rodutoCategorias.Columns.Add(col6nidadesEstoque); grid$rodutoCategorias.Columns.Add(col9alorEstoque);

) Perceba &ue ara as colunas 1oundColumn " necess$rio informar o cam o referente ao seu DataSource, atra("s da ro riedade Data3ield. Possibilita-se tamb"m a formata!%o atra("s de outras ro riedades, como BeaderTe't /nome no cabe!al8o2, Data3ormatStrin#, BorizontalAli#n, entre outras.

Para as colunas Tem lateColumn, a ro riedade DtemTem late ermite indicar &uais controles ser%o adicionados e (isualizados. Dsto " oss<(el indicando um ob+eto de uma classe &ue im lementa a interface DTem late. A&ui ser$ um C8ecK1o'. Para isto, crie uma no(a classe Tem lateColumnC8ecK1o', como se#ue: //*e,ine um Item-emplate c/ C'ec&%o. public class -emplateColumnC'ec&%o. ; /4stem.5eb.6I.I-emplate { public void InstantiateIn(/4stem.5eb.6I.Control container) { //adiciona um c'ec&bo. na coluna template /4stem.5eb.6I.5ebControls.C'ec&%o. c'=etorno + ne0 /4stem.5eb.6I.5ebControls.C'ec&%o.(); c'=etorno.I* + 2c'/elecionado2; container.Controls.Add(c'=etorno); ) At" a&ui as colunas do DataGrid +$ est%o sendo criadas dinamicamente. 5 r='imo asso " realizar a consulta ao banco de dados &ue ser$ mani ulada ara #erar o DataTable no formato final, o &ual ser$ o DataSource do DataGrid. Para isto, di#ite o m"todo ;retornaCate#oriasProdutos/2;: //=etorna *ata-able que ser8 navegado" para gerar o *ata-able agrupado (no ,ormato ,inal). public *ata-able retornaCategorias$rodutos() { //,az a cone.!o com o banco de dados e realiza a consulta com os dados //prim8rios que ser!o manipulados p/ servir de ,onte de dados ao grid string sCone.ao + 2Initial Catalog+@ort'0ind; *ata source+local'ost; user id+sa;2; /4stem.-e.t./tring%uilder s/ql + ne0 /4stem.-e.t./tring%uilder(); s/ql.Append(2 select c.Categor4@ame as Categoria" p.$roduct@ame as $roduto" p.$roductId as Id$roduto" 2); s/ql.Append(2 6nit$rice as valor6nitario" 2); s/ql.Append(2 6nitsIn/toc& as unidadesEstoque 2); s/ql.Append(2 ,rom categories c Aoin products p 2); s/ql.Append(2 on c.categor4id + p.categor4id 2); s/ql.Append(2 order b4 c.Categor4@ame" p.$roduct@ame2); /qlConnection cone.ao + ne0 /qlConnection(sCone.ao); cone.ao.Open(); /ql*ataAdapter daConsulta + ne0 /ql*ataAdapter(s/ql.-o/tring()"cone.ao); *ata/et dsConsulta + ne0 *ata/et(); daConsulta.3ill(dsConsulta); return dsConsulta.-ablesB:C; ) Cabe ressaltar &ue a cone'%o de(e ser confi#urada de acordo com a instala!%o do SQL Ser(er no ser(idor, odendo 8a(er Pass9ord, se#uran!a inte#rada, etc. Aten!%o: N%o es&ue!a de adicionar o names ace S0stem.Data.S&lClient na lista de usin#. Antes de criar o DataTable com os dados a#ru ados, " necess$rio declarar al#uns atributos na lista de ri(ate, &ue ser%o utilizados ara controle de &uebra de cate#oria, totalizadores e o r= rio DataTable /dtDadosA#ru ados2. //vari8vel que controla a troca de categoria private string deCategoriaAnterior + 22; )

//vari8veis setadas com os valores da lin'a do %* que est8 sendo manipulada private string deCategoriaAtual + 22; private string de$rodutoAtual + 22; private double valorAtual + :; private int unidadesAtual + :; //vari8veis -otalizadoras da Categoria Atual private double valorCategoriaAtual + :; private double valorEstoqueCategoriaAtual + :; private int quantidadeCategoriaAtual + :; //vari8veis -otalizadoras do 2-otal (eral2 private double valor-otal + :; private double valorEstoque-otal + :; private int quantidade-otal + :; //vari8vel p/ controlar a lin'a atual private int indice7in'a + D; //inicializado com D //*ata-able que conter8 os dados manipulados e servir8 de ,onte de dados p/ o grid private *ata-able dt*adosAgrupados; //enum p/ associar um tipo p/ cada lin'a. 6tilizado p/ pintar cada tipo de lin'a de uma cor. private enum -ipo7in'a {*escricaoCategoria" *escricao$roduto" /ub-otal" -otal); Di#ite o c=di#o &ue inst6ncia e cria as colunas no DataTable &ue conter$ os dados a#ru ados, elo m"todo ;criaDataTableDadosA#ru ados/2;. Atente ara as colunas ;Descri!%o; e ;ti oLin8a;. Para ermitir &ue se+a feito o a#ru amento, a coluna ;Descricao; ossuir$ as descri!4es das Cate#orias, Produtos, subtotais e Total Geral e or sua (ez a coluna ;ti oLin8a;, informar$ ao DataTable o ti o da lin8a conforme o enum Ti oLin8a, declarado na lista de ri(ate. //Cria *ata-able que conter8 os dados manipulados em ,orma de subgrupos. private void cria*ata-able*adosAgrupados() { t'is.dt*adosAgrupados + ne0 *ata-able(); t'is.dt*adosAgrupados.Columns.Add(2*escricao2" /4stem.-4pe.(et-4pe(2/4stem./tring2)); t'is.dt*adosAgrupados.Columns.Add(2valor6nitario2" /4stem.-4pe.(et-4pe(2/4stem.*ouble2)); t'is.dt*adosAgrupados.Columns.Add(2unidadesEstoque2" /4stem.-4pe.(et-4pe(2/4stem.IntE<2)); t'is.dt*adosAgrupados.Columns.Add(2valorEstoque2" /4stem.-4pe.(et-4pe(2/4stem.*ouble2)); t'is.dt*adosAgrupados.Columns.Add(2tipo7in'a2" /4stem.-4pe.(et-4pe(2/4stem.IntE<2)); ) Atra("s do m"todo ;retornaCate#oriasProdutos/2; criado anteriormente, obt,m-se o DataTable com o retorno do banco de dados, ossibilitando o reenc8imento do DataTable dtDadosA#ru ados +$ no formato a ser mostrado ao usu$rio, isto ", com #ru os de Cate#orias, subtotais e Total Geral. Di#ite o m"todo ; o ulaDataTableDadosA#ru ados;, &ue ent%o (arre o retorno do banco de dados e faz a (alida!%o de troca de cate#orias. Caso o re#istro atual da itera!%o se+a uma no(a cate#oria, s%o adicionadas lin8as de subtotal /da cate#oria anterior2 e a lin8a de Descri!%o da no(a cate#oria. No final, " adicionada a lin8a de Total Geral. 5bser(e &ue em cada itera!%o s%o atualizados os Totalizadores dos subtotais e Total Geral, sendo &ue na troca de cate#oria, os subtotais s%o zerados.

//@avega no *ata-able retornado no />7 e popula o *ata-able Agrupado (no ,ormato ,inal) private void popula*ata-able*adosAgrupados() { ,oreac' (*ata=o0 dr=etorno%* in t'is.retornaCategorias$rodutos().=o0s) { //salva os dados da lin'a atual p/ serem //manipulados nos outros m#todos deCategoriaAtual + dr=etorno%*B2Categoria2C.-o/tring(); de$rodutoAtual + dr=etorno%*B2$roduto2C.-o/tring(); valorAtual + Convert.-o*ouble(dr=etorno%*B2valor6nitario2C); unidadesAtual + Convert.-oIntE<(dr=etorno%*B2unidadesEstoque2C); //9alida troca de categoria... i, (t'is.deCategoriaAnterior F+ t'is.deCategoriaAtual) { //Insere sub-otal da Categoria anterior" por#m somente se //Gndice7in'a F+ D" pois neste caso seria a primeira itera !o no ,or i, (t'is.indice7in'a F+ D) dt*adosAgrupados.=o0s.Add(retorna7in'a/ub-otal()); //adiciona lin'a c/ a descri !o da nova Categoria. dt*adosAgrupados.=o0s.Add(retorna7in'aCategoria()); //2true2 p/ zerar os somatHrios desta categoria" pois mudou a categoria atualiza-otalizadores(true); //atualiza deCategoriaAnterior com a Atual deCategoriaAnterior + t'is.deCategoriaAtual;

//adiciona lin'a de $roduto no *ata-able agrupado. dt*adosAgrupados.=o0s.Add(retorna7in'a$roduto()); //Incrementa -otalizadores e 2,alse2 p/ n!o //zerar os somatHrios desta categoria. atualiza-otalizadores(,alse); indice7in'aII; )//,oreac' //adiciona subtotal da Jltima categoria dt*adosAgrupados.=o0s.Add(retorna7in'a/ub-otal()); //adiciona -otal (eral dt*adosAgrupados.=o0s.Add(retorna7in'a-otal());

) A se#uir, de(em ser adicionados os m"todos &ue retornam as lin8as descriti(as das Cate#orias, Produtos, subtotais e Total Geral ao DataTable dtDadosA#ru ados: //=etorna *ata=o0 com a *escri !o da Categoria Atual private *ata=o0 retorna7in'aCategoria() { //lin'a de subtitulo da categoria. *ata=o0 drCategoria + dt*adosAgrupados.@e0=o0(); drCategoria + dt*adosAgrupados.@e0=o0(); drCategoriaB2*escricao2C + 2 KKCategoria; 2I deCategoriaAtual; drCategoriaB2tipo7in'a2C + (int)-ipo7in'a.*escricaoCategoria; //,im lin'a de subtitulo da categoria

return drCategoria; ) //=etorna *ata=o0 com *ados do $roduto Atual private *ata=o0 retorna7in'a$roduto() { //retorna a lin'a com os dados do produto *ata=o0 dr$roduto + dt*adosAgrupados.@e0=o0(); dr$rodutoB2*escricao2C + de$rodutoAtual; dr$rodutoB2valor6nitario2C + valorAtual; dr$rodutoB2unidadesEstoque2C + unidadesAtual; dr$rodutoB2valorEstoque2C + valorAtual ? unidadesAtual; dr$rodutoB2tipo7in'a2C + (int)-ipo7in'a.*escricao$roduto; return dr$roduto; ) //=etorna *ata=o0 com /ub-otal da Categoria private *ata=o0 retorna7in'a/ub-otal() { //retorna a lin'a de subtotal apHs cada categoria. *ata=o0 dr/ub-otal + dt*adosAgrupados.@e0=o0(); dr/ub-otal + dt*adosAgrupados.@e0=o0(); dr/ub-otalB2*escricao2C + 2/ub -otal2; dr/ub-otalB2valor6nitario2C + valorCategoriaAtual; dr/ub-otalB2unidadesEstoque2C + quantidadeCategoriaAtual; dr/ub-otalB2valorEstoque2C + valorEstoqueCategoriaAtual; dr/ub-otalB2tipo7in'a2C + (int)-ipo7in'a./ub-otal; return dr/ub-otal; ) //=etorna *ata=o0 com -otal (eral private *ata=o0 retorna7in'a-otal() { //retorna a lin'a ,inal de -otal (eral. *ata=o0 dr-otal + dt*adosAgrupados.@e0=o0(); dr-otalB2*escricao2C + 2-otal (eral2; dr-otalB2valor6nitario2C + valor-otal; dr-otalB2unidadesEstoque2C + quantidade-otal; dr-otalB2valorEstoque2C + valorEstoque-otal; dr-otalB2tipo7in'a2C + (int)-ipo7in'a.-otal; return dr-otal; ) Para finalizar a im lementa!%o do reenc8imento do DataTable a#ru ado " necess$rio adicionar o m"todo ;atualizaTotalizadores;, &ue incrementa ou zera os totalizadores da cate#oria da itera!%o atual e &ue tamb"m incrementa os totalizadores do Total Geral. //Atualiza -otalizadores private void atualiza-otalizadores(bool Lzera-otCampan'aAtual) { i, (Lzera-otCampan'aAtual) { //zera totalizadores da Categoria Atual t'is.valorCategoriaAtual + :; t'is.quantidadeCategoriaAtual + :; t'is.valorEstoqueCategoriaAtual + :; ) else

{ //incrementa totalizadores da Categoria Atual valorCategoriaAtual I+ valorAtual; quantidadeCategoriaAtual I+ unidadesAtual; valorEstoqueCategoriaAtual I+ (valorAtual ? unidadesAtual); //incrementa totalizadores do -otal (eral valor-otal I+ valorAtual; quantidade-otal I+ unidadesAtual; valorEstoque-otal I+ (valorAtual ? unidadesAtual);

) ) Preenc8ido o DataTable a#ru ado, altere o e(ento Pa#eMLoad ara &ue efeti(amente fa!a a c8amada aos m"todos &ue criam e o ulam o DataTable, al"m de fornec,-lo ao DataGrid como seu DataSource. Todos os c=di#os contidos no /NPa#e.DsPost1acK2 ser%o e'ecutados a enas a rimeira (ez em &ue $#ina for carre#ada. //E.ecutado toda vez que carrega a p8gina. private void $ageL7oad(obAect sender" /4stem.EventArgs e) { i, (F$age.Is$ost%ac&) { //cria *ata-able com os *adosAgrupados cria*ata-able*adosAgrupados(); //popula *ata-able Agrupado" atrav#s dos dados provenientes //da consulta />7 no %anco de *ados popula*ata-able*adosAgrupados(); //seta a ,onte de dados e mostra os dados grid$rodutoCategorias.*ata/ource + dt*adosAgrupados; grid$rodutoCategorias.*ata%ind();

) //remove C'ec&%o. entre $ost%ac&s removeC'ec&%o.();

) Para cada item &ue for o ulado ao DataGrid ser$ criado um C8ecK1o', de(ido * coluna Tem lateColumn criada. Por"m, ara as lin8as de Cate#orias, subtotais e TotalGeral, n%o " dese+ado mostr$-lo ao usu$rio, +ustificando o uso da rotina ;remo(eC8ecK1o'/2; referenciada no Pa#eMLoad/2. //=emove C'ec&%o. das lin'as -otalizadoras. public void removeC'ec&%o.() { //remove C'ec&%o. nas lin'as de categoria" //subtotais e -otal (eral ,oreac' (*ata(ridItem item in grid$rodutoCategorias.Items) { i, ((item.CellsBDC.-e.t ++ 2/ub -otal2) MM (item.CellsBDC.-e.t ++ 2-otal (eral2) MM (item.CellsBDC.-e.t.-o/tring().Inde.O,(2KKCategoria;2) F+ ND) ) { item.CellsB:C.Controls.=emoveAt(:); ) ) ) No momento &ue " realizado o Data1ind/2 do DataGrid, automaticamente " dis arado o e(ento DtemData1ound, &ue ocorre como Lltima o ortunidade ara se acessar o dado de um item do #rid, antes &ue se+a e' osto ao usu$rio. Desta forma, o utilizaremos ara colorir as lin8as totalizadoras. Para criar este e(ento, selecione o #ridProdutoCate#orias e na +anela de ro riedades d, um du lo cli&ue no e(ento DtemData1ound.

//Evento que colore as lin'as de acordo com o seu -ipo. private void grid$rodutoCategoriasLItem*ata%ound(obAect sender" /4stem.5eb.6I.5ebControls.*ata(ridItemEventArgs e) { i, (e.Item.Item-4pe ++ 7istItem-4pe.Item MM e.Item.Item-4pe ++ 7istItem-4pe.AlternatingItem) { //drvItem ,az re,erencia a lin'a do data/ource do grid do item atual *ata=o09ie0 drvItem + (*ata=o09ie0)e.Item.*ataItem; -ipo7in'a tipo + (-ipo7in'a)(drvItemB2tipo7in'a2C); //s0itc' p/ colorir a lin'a de acordo com o tipo de lin'a s0itc' (tipo) { case -ipo7in'a.*escricaoCategoria ; { e.Item.%ac&Color + Color./ilver; brea&; ) case -ipo7in'a./ub-otal ; { e.Item.%ac&Color + Color.(ainsboro; brea&; ) case -ipo7in'a.-otal ; { e.Item.%ac&Color + Color.(ra4; brea&; ) ) ) //,im i, ) Note &ue (erificado o item atual do DataGrid encontra-se atra("s do DataAo9)ie9, o (alor da coluna ;ti oLin8a; do dtDadosA#ru ados. Atra("s deste (alor e do enum Ti oLin8a, colore-se o item do DataGrid. Com o ob+eti(o de mostrar &ue " oss<(el ca turar dados do DataGrid entre Post1acKs, mesmo &ue suas colunas ten8am sido criadas dinamicamente, d, um du lo cli&ue no bot%o btnSelecionados e di#ite o se#uinte c=di#o, &ue listar$ no List1o' todos os itens &ue o C8ecK1o' esti(er selecionado: //Oostra -odos os itens selecionados dos C'ec&%o.s da coluna -emplate private void btn/elecionadosLClic&(obAect sender" /4stem.EventArgs e) { lst/elecionados.9isible + true; lst/elecionados.Items.Clear(); lst/elecionados.Items.Add(2Items /elecionados;2); ,oreac' (*ata(ridItem item in grid$rodutoCategorias.Items) { C'ec&%o. c'/elecionado + (C'ec&%o.)item.3indControl(2c'/elecionado2); i, ((c'/elecionado F+ null) PP (c'/elecionado.C'ec&ed)) lst/elecionados.Items.Add(item.CellsBDC.-e.t); ) ) Sal(e o ro+eto e e'ecute /CTAL O 3J2 ara (er o resultado do #ridProdutoCate#orias montado dinamicamente /Figura '2. E' erimente selecionar al#uns C8ecK1o' e cli&ue no bot%o ;Hostrar Selecionados; e (e+a como os itens ermanecem selecionados e tamb"m listados no List1o'.

Figura ' - )ers%o final da $#ina sendo e'ecutada. Dnicio da a#ina

Conclus(o
A combina!%o entre DataGrid e DataTable ermite ao desen(ol(edor mani ular dados e mostr$-los aos usu$rios de uma forma muito din6mica e eficiente. A cria!%o de colunas dinamicamente (iabilizam a solu!%o de roblemas &uanto a formata!%o do DataGrid, aumentando em muito sua a licabilidade, como or e'em lo, um sistema de Gerao de Relatrios. Marcos Santos (marcososantos@yahoo.com) e Alexandre Santos (alexandrecpd@hotmail.com) so graduados em Ci ncias da Computao na !"SC# tra$alham como Analistas de Sistemas na So%t&ay Contact Center e com a plata%orma .'() desde a *erso +eta. ,nicio da pagina

Vous aimerez peut-être aussi