Implementando a interface IRenderingExtension

Como descrito anteriormente nesta seção, a extensão de renderização é responsável por obter os resultados de uma definição de relatório combinada com os dados reais e pela renderização dos dados resultantes para um formato que seja utilizável. A transformação dos dados combinados e a formatação são feitas por meio de uma classe CLR (common language runtime) que implementa IRenderingExtension, que transforma o modelo de objeto em um formato de saída consumível por um visualizador, por uma impressora ou por outro destino de saída.

O IRenderingExtension tem três métodos que devem ser codificados. São eles:

  • Render - renderiza o relatório.

  • RenderStream - renderiza um fluxo específico de um relatório.

  • GetRenderingResource - obtém informações adicionais, como ícones, necessárias para o relatório.

As seções a seguir discutem esses métodos em mais detalhes.

Método Render

O método Render contém argumentos que representam os seguintes objetos:

  • O próprio report que você deseja renderizar. Esse objeto contém propriedades, dados e informações de layout para o relatório. O relatório é a raiz da árvore de modelo de objeto de relatório.

  • O reportServerParameters, que contém o objeto de dicionário de cadeia de caracteres, com os parâmetros para o servidor de relatório, se houver.

  • Os parâmetros deviceInfo que contêm as configurações do dispositivo. Para obter mais informações sobre as configurações do dispositivo, consulte Configurações de informações do dispositivo do Reporting Services.

  • O parâmetro clientCapabilities, que contém um objeto de dicionário NameValueCollection que possui informações sobre o cliente para o qual você está renderizando.

  • O RenderProperties contendo informações sobre o resultado da renderização.

  • O createAndRegisterStream é uma função de delegação a ser chamada para a obtenção de um fluxo onde será feita a renderização.

Parâmetro deviceInfo

O deviceInfo contém parâmetros de renderização, e não parâmetros de relatório. Esses parâmetros de renderização são passados para a extensão de renderização. Os valores deviceInfo são convertidos em um objeto NameValueCollection pelo servidor de relatório. Os itens do parâmetro deviceInfo são tratados como valores sem diferenciação de maiúsculas e minúsculas. Se a solicitação de renderização aconteceu como resultado do acesso à URL, os parâmetros de URL com formato rc:key=value serão convertidos em pares de chave/valor no objeto de dicionário deviceInfo. O código de detecção do navegador também fornece os itens a seguir no dicionário clientCapabilities: EcmaScriptVersion, JavaScript, MajorVersion, MinorVersion, Win32, Type e AcceptLanguage. Qualquer par de nome/valor de deviceInfo que não for compreendido pela extensão de renderização será ignorado. O exemplo de código a seguir mostra um método GetRenderingResource de exemplo que recupera ícones.

public void GetRenderingResource (CreateStream createStreamCallback, NameValueCollection deviceInfo)
{
    string[] iconTagValues = deviceInfo.GetValues("Icon");
    if ((iconTagValues != null) && (iconTagValues.Length > 0) )
    {
        // Create a stream to output to.
        Stream outputStream = createStreamCallback(m_iconResourceName, "gif", null, "image/gif", false);
        // Get the GIF image for one of the buttons on the toolbar
        Image requiredImage = (Image) m_resourcemanager.GetObject(m_iconResourceName
        // Write the image to the output stream
        requiredImage.Save(outputStream, requiredImage.RawFormat);
    }
    return;
}

Método RenderStream

O método RenderStream processa um fluxo específico do relatório. Todos os fluxos são criados durante a chamada Render inicial, mas os fluxos não são retornados ao cliente inicialmente. Esse método é usado para fluxos secundários (como imagens em renderização HTML) ou páginas adicionais de uma extensão de renderização de várias páginas (como Imagem/EMF).

Método GetRenderingResource

Existem ocasiões em que o relatório necessita de informações que não exigem que o próprio relatório seja renderizado. Por exemplo, se você precisar do ícone associado à extensão de renderização, use o parâmetro deviceInfo que contém a marca única <Icon>. Nesses casos, você pode usar o método GetRenderingResource. Esse método recupera as informações sem executar a renderização completa do relatório.