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.
Criando o parâmetro que irá receber o caminho da imagem:
Primeiramente vamos adicionar um parâmetro em nosso ReportViewer:
a. No VS, com o report aberto, acesse a opção “View->ReportData”;
b. No item “Parameter”, clique com o botão direito e escolha a opção “Add Parameter”;
c. Preencha o nome do parâmetro com o valor “Path”, e escolha o Data type como “Text”.
d. Insira um campo do tipo Imagem no Report.
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 é:
a. 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;
b. 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).
c. 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 “a”(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 “b”. 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.
Referências:
Brian Hartman - MSFT. Relatórios nunca param de carregar com o VS 2010.
😕 Poxa, o que podemos melhorar?
😃 Boa, seu feedback foi enviado!
✋ Você já nos enviou um feedback para este texto.