Compartilhar via


Incluir imagem no Report Viewer com caminho gravado no Banco (pt-BR)

 

1. Introdução

Neste artigo vou apresentar a solução para um problema comum quando temos a intenção de incluir uma imagem em um ReportViewer.

Como exemplo, para um software multiempresa, podemos ter uma funcionalidade para incluir o logo desta empresa (para apresentação em relatórios). Suponhamos que a aplicação salve a imagem no servidor e grave no banco o caminho, por exemplo, "~/img/cliente/logoCliente1.png".

A ideia seria o report incluir a imagem de acordo com o caminho que será recuperado do banco.

Nos itens abaixo será apresentado como fazer esta configuração.

** 2. Criando o parâmetro que irá receber o caminho da imagem**

Primeiramente vamos adicionar um parâmetro em nosso ReportViewer:

1)       No VS, com o report aberto, acesse a opção “View->ReportData”;

2)      No item “Parameter”, clique com o botão direito e escolha a opção “Add Parameter”;

3)      Preencha o nome do parâmetro com o valor “Path”, e escolha o Data type como “Text”.

4)      Insira um campo do tipo Imagem no Report.

 

3. Recuperando o caminho da imagem e adicionando ao parâmetro

Bom, agora que já temos nosso parâmetro “Path” criado, vamos para a parte do C#:

a) No evento Page_Load da página aspx que irá apresentar o relatórios, precisamos habilitar o report para aceitar imagens externas. Para isso, insira o seguinte trecho:

this.rptMeuReport.LocalReport.EnableExternalImages = true;

 

b) Ainda no evento Page_Load, efetuamso a verificação de PostBack e incluímos o trecho abaixo para recuperar o caminho da imagem e adicionar este valor ao parâmetro “Path” no  relatório:

            if (!IsPostBack) {

                    string imagepath = "file:///" + Server.MapPath("~/img/cliente/logoCliente1.png”);

                    ReportParameter[] param = new ReportParameter[1];

                    param[0] = new ReportParameter("Path", imagepath);

            }

Obs.: Vale lembrar que a verificação de PostBack é necessária pois podemos usar o ASP.NET postbacks para renderizar o relatório. A sequência de comunicação é:

  • Navegador faz uma solicitação GET para a página ASPX para obter o conteúdo da página e um indicador de carregamento para o relatório;
  • Navegador faz uma solicitação POST para a página ASPX para obter o HTML para o relatório (este conteúdo está em um UpdatePanel).
  • Navegador faz solicitações GET para o manipulador de HTTP para obter todas as imagens no relatório

** **

Como estamos alterando os valores de parâmetro, o ReportViewer é avisado que tem de reiniciar o processamento do relatório. Efetivamente, ele informa ao visualizador para retornar à etapa 1 (colocar o indicador “Loading” no navegador e reiniciar o processamento do relatório). Se o relatório fizer isso durante cada postback, o Report  nunca chegará à etapa 2. Ele só vai ficar em um loop infinito.

 

Bom, feito isso, temos nosso Report com a imagem externa carregando através de um caminho disponível no banco.

** **

4. Referências

Brian Hartman - MSFT. Relatórios nunca param de carregar com o VS 2010. Disponível em:

<http://blogs.msdn.com/b/brianhartman/archive/2010/03/21/reports-never-stop-loading-with-vs-2010.aspx > Acesso em: 05 mar. 2012.