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.