Implementando a interface IRenderingExtension

A extensão de renderização obtém os resultados de uma definição de relatório combinada com os dados reais e renderiza os dados resultantes para um formato que seja utilizável. A transformação dos dados combinados e a formatação são feitas usando uma classe CLR (Common Language Runtime) que implementa IRenderingExtension. Isto transforma o modelo de objeto em um formato de saída que é consumível por um visualizador, impressora ou outro destino de saída.

O IRenderingExtension tem três métodos que devem ser codificados:

  • Render - renderiza o relatório.

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

  • GetRenderingResource- obtém informações adicionais, como ícones, isso é obrigatório 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 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 do árvore de modelo de objeto de relatório.

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

  • O parâmetro deviceInfo que contém as configurações do dispositivo. Para obter mais informações, 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 que contém 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 parâmetro 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

O método GetRenderingResource recupera as informações sem executar toda renderização do relatório. 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.