André Alves de Lima

Talking about Software Development and more…

Trabalhando com o Report Viewer no WPF

Uma das perguntas relacionadas ao Report Viewer que eu já recebi múltiplas vezes é: “André, como é que eu faço para utilizar o Report Viewer no WPF?“. A resposta não é complicada e eu normalmente encaminho os(as) leitores(as) para algum artigo em inglês que mostre essa implementação. Mas, e se a pessoa não consegue entender esse artigo? Ou, pior ainda, e se a pessoa não domina muito bem o inglês?

Foi pensando nisso que eu resolvi escrever esse tutorial para mostrar para todos vocês, de uma vez por todas, como podemos utilizar o Report Viewer no WPF.

Criando o relatório

Antes de tudo, a primeira coisa que temos que fazer é criarmos um novo relatório. Uma vez que o foco desse artigo não é o relatório em si, mas sim, a sua exibição no WPF, criaremos um relatório muito simples, que fará apenas a listagem de funcionários. Vamos começar criando um novo projeto do tipo “WPF Application” e, dentro desse projeto, vamos adicionar uma classe chamada “DadosRelatorioFuncionario“:

    // C#
    public class DadosRelatorioFuncionario
    {
        public string Nome { get; set; }
        public string Sobrenome { get; set; }
        public string Cargo { get; set; }
    }
' VB.NET
Public Class DadosRelatorioFuncionario
    Public Property Nome As String
    Public Property Sobrenome As String
    Public Property Cargo As String
End Class

Feito isso, compile o projeto. Caso não compilemos o projeto nesse ponto, o Report Viewer não detectará a existência dessa nova classe e não conseguiremos utiliza-la no nosso relatório.

Compilado o projeto, vamos adicionar um novo item do tipo “Report“, disponível dentro da categoria “Reporting“. Dê o nome de “RelatorioFuncionario” para esse novo item:

Dentro do relatório, vamos agora até a janela “Report Data” para criarmos um novo DataSet, clicando com o botão direito sobre “Datasets” e escolhendo a opção “Add Dataset“:

Na janela de escolha do tipo de fonte de dados, escolha o tipo “Object“, uma vez que iremos utilizar a classe “DadosRelatorioFuncionario” para alimentar o nosso relatório:

Na próxima janela, encontre a classe “DadosRelatorioFuncionario“, marque o CheckBox correspondente e finalize o assistente:

Por fim, escolha o nome “DataSetRelatorio” para o DataSet e clique em “OK“. Guarde esse nome, pois ele é muito importante, uma vez que precisaremos dele quando estivermos exibindo o relatório:

Agora que já temos o DataSet no relatório, vamos adicionar uma tabela para listarmos os funcionários. Arraste os campos do DataSet para dentro dessa tabela e ajuste o layout de forma que o relatório fique parecido com a imagem abaixo:

Exibindo o relatório no WPF

Com o relatório criado, chegou a hora de exibirmos esse relatório na nossa Window do WPF. Primeiramente, temos que adicionar a referência ao Report Viewer do Windows Forms, já que o WPF não possui suporte nativo ao Report Viewer e só é possível exibi-lo dentro de um WindowsFormsHost:

Feito isso, vamos até a nossa Window e, no seu “cabeçalho“, vamos adicionar uma referência ao namespace do Report Viewer:

xmlns:rv="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"

Em seguida, vá até a caixa de ferramentas e arraste um controle do tipo WindowsFormsHost para dentro do Grid e, dentro desse WindowsFormsHost, adicione um controle do ReportViewer, dando o nome de “ReportViewer” e já declarando um handler para o evento “Load“, onde faremos o carregamento do relatório:

    <Grid>
        <WindowsFormsHost>
            <rv:ReportViewer x:Name="ReportViewer" Load="ReportViewer_Load"/>
        </WindowsFormsHost>
    </Grid>

Agora a única coisa que está faltando é fazer o carregamento do relatório no code-behind da nossa Window. No método “ReportViewer_Load“, primeiramente criaremos uma lista de “DadosRelatorioFuncionario” contendo alguns dados de exemplo. Logo em seguida, criamos um “ReportDataSource“, adicionamos essa fonte de dados no relatório, configuramos o caminho do embedded resource rdlc e chamamos um “RefreshReport” para carregarmos o relatório:

        // C#
        private void ReportViewer_Load(object sender, EventArgs e)
        {
            var dadosRelatorio = new List<DadosRelatorioFuncionario>();
            dadosRelatorio.Add(new DadosRelatorioFuncionario() { Nome = "André", Sobrenome = "Alves de Lima", Cargo = "Programador" });
            dadosRelatorio.Add(new DadosRelatorioFuncionario() { Nome = "Fulano", Sobrenome = "da Silva", Cargo = "Gerente" });
            dadosRelatorio.Add(new DadosRelatorioFuncionario() { Nome = "José", Sobrenome = "da Esquina", Cargo = "Analista" });
            dadosRelatorio.Add(new DadosRelatorioFuncionario() { Nome = "Maria", Sobrenome = "Souza", Cargo = "Analista" });

            var dataSource = new Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", dadosRelatorio);
            ReportViewer.LocalReport.DataSources.Add(dataSource);
            ReportViewer.LocalReport.ReportEmbeddedResource = "ReportViewerWPF.RelatorioFuncionario.rdlc";

            ReportViewer.RefreshReport();
        }
    ' VB.NET
    Private Sub ReportViewer_Load(sender As Object, e As EventArgs)
        Dim DadosRelatorio As New List(Of DadosRelatorioFuncionario)
        DadosRelatorio.Add(New DadosRelatorioFuncionario() With {.Nome = "André", .Sobrenome = "Alves de Lima", .Cargo = "Programador"})
        DadosRelatorio.Add(New DadosRelatorioFuncionario() With {.Nome = "Fulano", .Sobrenome = "da Silva", .Cargo = "Gerente"})
        DadosRelatorio.Add(New DadosRelatorioFuncionario() With {.Nome = "José", .Sobrenome = "da Esquina", .Cargo = "Analista"})
        DadosRelatorio.Add(New DadosRelatorioFuncionario() With {.Nome = "Maria", .Sobrenome = "Souza", .Cargo = "Analista"})

        Dim DataSource As New Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", DadosRelatorio)
        ReportViewer.LocalReport.DataSources.Add(DataSource)
        ReportViewer.LocalReport.ReportEmbeddedResource = "ReportViewerWPF.RelatorioFuncionario.rdlc"

        ReportViewer.RefreshReport()
    End Sub

Pronto! Execute o projeto e veja o relatório sendo carregado com sucesso dentro do WindowsFormsHost:

Concluindo

Apesar de não termos um controle específico do Report Viewer para WPF, conseguimos utilizar o controle do Windows Forms sem problema algum. Para isso, basta adicionarmos um WindowsFormsHost na nossa Window do WPF e, dentro dele, adicionamos o controle do Report Viewer do Windows Forms. Neste artigo, você conferiu quais são os passos que você deve seguir para exibir os seus relatórios do Report Viewer no WPF.

Agora conte para gente nos comentários: você trabalha com o WPF ou com o Windows Forms na sua aplicação de negócios? Caso você utilize o WPF, você já tinha pensado em exibir relatórios do Report Viewer na sua aplicação? Achou que era impossível por não existir um controle nativo do WPF? Estou curioso para saber essas informações!

Por fim, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário logo abaixo.

Até a próxima!

André Lima

Image by Pixabay used under Creative Commons
https://pixabay.com/en/document-agreement-documents-sign-428331/

Newsletter do André Lima

* indicates required



Powered by MailChimp

One thought on “Trabalhando com o Report Viewer no WPF

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *