Usando o controle ReportViewer no ASP.NET 2.0
Autor:Eve Cole
Data da Última Atualização:2009-07-01 16:43:40
Tradução deste artigo: webabcd
introduzir
Um requisito comum para qualquer aplicativo baseado em dados são os relatórios. No entanto, esse recurso muito importante não é fornecido no ASP.NET 1.x. Felizmente, porém, o controle ReportViewer que vem com o .NET 2.0 pode atender a algumas de suas necessidades básicas de relatórios. Mostrarei como usar esse controle neste artigo. O controle ReportViewer pode ser usado em programas da web e em programas do Windows. Aqui, apresentarei apenas como usá-lo em programas web.
Exemplo de relatório
Presumimos que queremos gerar uma lista de informações do cliente conforme mostrado abaixo:
O relatório acima é uma lista muito simples de informações de clientes agrupadas por país. Os dados do relatório são obtidos na tabela Clientes do banco de dados Northwind. Por padrão, ele exibe todas as informações do cliente. No entanto, você também pode exibir informações sobre clientes pertencentes a um país especificado.
O relatório é projetado usando o controle ReportViewer, que pode obter dados de um DataSet fortemente tipado ou de uma coleção de objetos personalizados. No desenvolvimento real de programas, geralmente usamos uma arquitetura de três camadas, e os dados obtidos geralmente são um DataSet ou uma coleção genérica obtida da camada de negócios. Aqui, pretendo usar uma coleção genérica como fonte de dados em vez de um DataSet fortemente tipado.
Criar biblioteca de classes
Primeiro, abra o Visual Studio e crie um projeto de biblioteca de classes chamado ReportViewerLib. Adicione uma classe chamada Cliente conforme mostrado abaixo:
usando o sistema; usando System.Data; usando System.Configuration; usando System.Data.SqlClient; usando System.Collections.Generic; namespace ReportViewerLib { classe públicaCliente { string pública strCustomerID; string pública strNomedaEmpresa; string pública strContactName; string pública strCountry;
string pública CustomerID { pegar { return strCustomerID; } definir { strCustomerID = valor; } }
string pública CompanyName { pegar { return strNomedaEmpresa; } definir { strNomeEmpresa= valor; } }
string pública ContactName { pegar { return strNomeContato; } definir { strNomeContato= valor; } }
string pública País { pegar { return strPaís; } definir { strPaís= valor; } }
Lista estática pública |
GetCustomersForCountry(string país) { SqlConnection cnn=new SqlConnection( ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString); SqlCommand cmd=new SqlCommand(); cmd.Conexão=cnn; cmd.CommandText = "selecionar ID do cliente, nome da empresa, nome do contato, país de clientes onde country=@country"; SqlParameter p = novo SqlParameter ("@país",país); cmd.Parâmetros.Add(p); cnn.Open(); Leitor SqlDataReader = cmd.ExecuteReader(); Lista |
(); enquanto (leitor.Read()) { Cliente c = novo Cliente(); c.CustomerID = leitor.GetString(0); c.NomedaEmpresa = leitor.GetString(1); c.ContactName = leitor.GetString(2); c.País = leitor.GetString(3); lista.Adicionar(c); } cnn.Fechar(); lista de retorno; }
Lista estática pública |
ObterTodosClientes() { SqlConnection cnn = new SqlConnection( ConfigurationManager.ConnectionStrings ["NorthwindConnectionString"].ConnectionString); SqlCommand cmd = new SqlCommand(); cmd.Conexão = cnn; cmd.CommandText = "selecione CustomerID,CompanyName,ContactName,País dos clientes"; cnn.Open(); Leitor SqlDataReader = cmd.ExecuteReader(); Lista |
(); enquanto (leitor.Read()) { Cliente c = novo Cliente(); c.CustomerID = leitor.GetString(0); c.NomedaEmpresa = leitor.GetString(1); c.ContactName = leitor.GetString(2); c.País = leitor.GetString(3); lista.Adicionar(c); } cnn.Fechar(); lista de retorno; }
} }
|
A classe Customer define quatro propriedades públicas, nomeadamente CustomerID, CompanyName, ContactName e Country. Depois disso, existem dois métodos estáticos contidos nesta classe – GetCustomersForContry() e GetAllCustomers(). Esses dois métodos são relativamente simples. Um retorna todas as informações dos clientes pertencentes a um determinado país e o outro retorna todas as informações dos clientes. Primeiro abra a conexão com o banco de dados Northwind e, em seguida, execute a consulta SELECT por meio do objeto SqlCommand. Depois disso, use o objeto SqlDataReader para obter os dados. Percorra esse objeto SqlDataReader, crie um objeto Cliente sempre que estiver dentro dele, defina suas diversas propriedades e, finalmente, adicione-o à coleção genérica de objetos Cliente. No final da classe, a coleção genérica de objetos Customer é retornada ao chamador.
Criar fonte de dados
Ao criar um relatório, você precisa especificar uma fonte de dados para ele em seu projeto. Para adicionar uma fonte de dados ao seu projeto, você pode fazer isso selecionando o menu Dados -> Adicionar Nova Fonte de Dados. Em seguida, a caixa de diálogo mostrada abaixo aparecerá:
Sua fonte de dados pode ser um banco de dados, um serviço web ou um objeto. Neste caso selecionamos Object. Em seguida, clique no botão "Avançar" e uma interface para selecionarmos uma fonte de dados aparecerá. Escolhemos a classe Cliente (conforme figura abaixo).
Clique no botão “Concluir” para concluir o assistente de configuração da fonte de dados. Dessa forma, você adicionou uma nova fonte de dados à sua biblioteca de classes. Se quiser visualizar a fonte de dados, você pode fazer isso selecionando o menu "Dados" -> Mostrar fonte de dados, e a interface mostrada abaixo aparecerá:
Relatórios de design
Em seguida, adicione um relatório. Clique com o botão direito no projeto e selecione "Adicionar Novo Item". Selecione "Relatório" na caixa de diálogo e clique no botão "Adicionar" (conforme mostrado na figura abaixo). Desta forma, adicionamos um arquivo denominado "Report1.rdlc". O arquivo .rdlc é um arquivo de relatório que salva o layout do relatório e o mapeamento de dados.
Depois de abrir o arquivo Report1.rdlc, um conjunto de controles relacionados ao relatório será exibido na caixa de ferramentas do Visual Studio (conforme mostrado abaixo).
Dentre esses controles, o controle "Caixa de Texto" e o controle "Tabela" são muito utilizados. O controle "Caixa de Texto" é usado para exibir um trecho de texto estático ou uma expressão. O controle “Tabela” é utilizado para exibir dados tabulares, e os resultados gerados por ele serão exibidos no “corpo” do seu relatório.
O relatório elaborado é mostrado abaixo:
No topo da seção “Cabeçalho” do relatório, há uma caixa de texto cuja propriedade Valor é “Listagem de Clientes”. Há outra caixa de texto abaixo desta caixa de texto e o valor de sua propriedade Value é "=Parameters!SubTitle.Value". O que significa é que o valor da caixa de texto vem do parâmetro denominado SubTitle. Como definimos parâmetros? Isso requer a adição de parâmetros na propriedade ReportParameters do relatório. A caixa de diálogo de parâmetros de relatório aberta é mostrada na figura abaixo:
Observação: a configuração dos parâmetros é feita em nosso código .NET.
Se você deseja exibir a data no relatório, basta definir a propriedade Value da caixa de texto relevante para "=FormatDateTime(ToDay(),DateFormat.ShortDate)". Uma das grandes vantagens dos relatórios é que eles possuem muitas funções integradas, como ToDay() e FormatDateTime. Neste exemplo, usamos a função FormatDateTime() para exibir a data atual (ToDay()) no formato ShortDate.
Agora, arraste um controle "Tabela" da caixa de ferramentas para o seu relatório. Por padrão, o controle "Tabela" possui 3 linhas e 3 colunas. As 3 linhas são: cabeçalho da tabela, informações detalhadas e rodapé da tabela. Claro, você também pode adicionar linhas e colunas ao controle Tabela. Arraste as propriedades CustomerID, CompanyName, ContactName e Country da janela da fonte de dados para a linha de detalhes do seu controle Tabela. Desta forma, o sistema adicionará automaticamente uma caixa de texto e definirá suas propriedades como =Fields!CustomerID.Value, =Fields!CompanyName.Value e assim por diante. Neste ponto, os cabeçalhos das colunas também serão adicionados automaticamente. Claro, você também pode fazer as modificações necessárias de acordo com suas necessidades.
A seguir, queremos agrupar os registros pelo país ao qual pertence o cliente. Clique com o botão direito na borda da linha de detalhes e selecione Inserir Grupo (conforme mostrado na imagem abaixo).
Em seguida, a caixa de diálogo mostrada abaixo aparecerá:
Na guia "Classificar", selecione "=Fields!Country.Value" como expressão e "Crescente" como direção de classificação.
Essas são as coisas, muito simples. Desta forma, concluímos a concepção do relatório.
Mostrar relatório
Crie um novo site chamado "ReportViewerDemo". Adicione uma referência ao assembly ReportViewerLib para que o assembly seja copiado para o diretório BIN do seu site. Depois disso, adicione o arquivo Report1.rdlc ao seu site. Arraste um controle ReportViewer na guia "Dados" da caixa de ferramentas para sua página Default.aspx, abra o painel de tags inteligentes do controle ReportViewer e selecione Report1.rdlc na caixa suspensa "Selecionar relatório", conforme mostrado na caixa figura abaixo:
Após selecionar o arquivo de relatório, o sistema adicionará automaticamente um controle de fonte de dados de objeto com a propriedade TypeName como Cliente. Você pode verificar isso no assistente de configuração do controle de fonte de dados do objeto.
Em seguida, arraste um controle DropDownList para o cabeçalho da página e defina quatro opções para ele – Todos, EUA, Reino Unido e Brasil. Defina também sua propriedade AutoPostBack como True. Em seguida, abra o assistente de configuração do controle de fonte de dados e defina a operação "SELECT" para o método SelectCustomersForCountry().
Defina o parâmetro country do método SelectCustomersForCountry() como SelectedValue de DropDownList1.
Por padrão, todas as informações do cliente são exibidas no relatório. Ao selecionar um país no DropDownList, as informações do cliente pertencentes ao país selecionado serão exibidas no relatório. Para completar tal função, precisamos apenas manipular o evento SelectedIndexChanged de DropDownList.
vazio protegido DropDownList1_SelectedIndexChanged (remetente do objeto, EventArgs e) { if (DropDownList1.SelectedValue == "Todos") { ObjectDataSource1.SelectMethod = "GetAllCustomers"; ObjectDataSource1.SelectParameters.Clear(); Parâmetro ReportParameter = novo ReportParameter ("SubTítulo", "Lista de todos os clientes"); ReportParameter[] p ={ parâmetro }; ReportViewer1.LocalReport.SetParameters(p); } outro { ObjectDataSource1.SelectMethod = "GetCustomersForCountry"; ObjectDataSource1.SelectParameters[0].DefaultValue = DropDownList1.SelectedValue;
Parâmetro ReportParameter = novo ReportParameter ("SubTítulo", "Lista de clientes de um país"); ReportParameter[] p ={ parâmetro }; ReportViewer1.LocalReport.SetParameters(p); } } |
Este código primeiro verifica a propriedade SelectedValue do controle DropDownList. Se for "All", defina a propriedade SelectMethod do controle de fonte de dados como GetAllCustomers. Além disso, também precisamos limpar a coleção SelectParameters porque o método GetAllCustomers() não requer nenhum parâmetro. A seguir, criamos uma instância da classe ReportParameter e definimos o nome e o valor do parâmetro do relatório em seu construtor. Lembre-se dos parâmetros que definimos ao projetar o relatório. Em seguida, crie uma matriz ReportParameter. Chame o método SetParameters() com este array como parâmetro. O bloco de código “else” também é muito simples, ou seja, o método utilizado passa a ser GetCustomersForCountry().
Essas são as coisas, muito simples. O relatório foi concluído. Você pode executar a página Default.aspx para ver o efeito. Observe que o controle ReportViewer possui recursos de exportação integrados, que permitem exportar relatórios para o formato Excel ou PDF. O controle ReportViewer também possui muitas propriedades, você mesmo pode explorá-las.
Resumir
O controle ReportViewer do ASP.NET fornece muitas funções básicas de relatórios. Neste artigo, usamos o controle de fonte de dados de objeto para desenvolver um relatório. Criamos uma biblioteca de classes e uma fonte de dados. Finalmente, use o controle ReportViewer para exibir o relatório.