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.