Tutorial C# – Imprimir Conteúdo da DataGridView

60 Comentários

Este tutorial vem da necessidade que eu tive em imprimir o conteúdo de uma DataGridView num programa que desenvolvi. Após muitas horas, alguns dias, muitos exemplos (que não funcionaram e muito complicados), encontrei uma solução que funciona muito bem, pelo menos resolveu o meu “problema”. Como penso que devemos partilhar conhecimentos, decidi elaborar este tutorial.

Objectivo: Apresentar dados numa DataGridView obtidos através de dados gravados numa base de dados.
1º – Crie um novo projecto

csharp001

2º – Adicione um botão (botão imprimir) e uma dataGridView

csharp002

Nota: é necessário indicar que vai usar uma base de dados OleDb (Access), para isso tem de adicionar o seguinte código que está em destaque.

csharp003

3º – No Form Load vamos introduzir o código que irá trazer a informação dos dados na base de dados.

csharp004

Podem verificar que foi introduzido o “try” e “catch”.
Para quem não está familiarizado com este código, uma pequena explicação que posso dar é que serve para verificar se existe algum erro na ligação (try), e se encontrar, mostra esse erro numa MessageBox (catch).
Nesta altura já podem verificar que ao iniciar o programa, já aparecem dados na DataGridView.

csharp005

4º – No botão imprimir irá introduzir o seguinte código

csharp010

Como podem verificar, existe uma parte do código sublinhada, essa parte refere-se a uma classe que vamos criar mais à frente. Certamente este código seria somente introduzido quando essa mesma classe estivesse criada, mas assim evitamos andar a “saltar” de form para form.
5º – Agora vamos criar um novo Form que será das “opções de impressão”.

csharp006

Este novo Form vai permitir que possamos escolher quais os campos que queremos imprimir, como também escrever qual o título da impressão.
É necessário inserir os seguintes Items:

– 2 Botões
– 1 CheckedListBox
– 1 TextBox

csharp007

6º – Os botões “OK” e “Cancel” servem exclusivamente para abrir “caixas de diálogo”

csharp008

O restante código da form “printOptions” é o seguinte:

csharp009

7º – Agora vamos criar uma nova classe e atribuir o nome printDGV.

csharp011

csharp012

Como o código da classe é extenso, colocarei o mesmo aqui, e os comentários estão no próprio código.

csharp013

csharp014

csharp015

csharp016

Continua na próxima página….

Partilhar:
Tags:

Comentários

60

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Shogun
    Shogun

    Boas, finalmente voltaram os tutoriais de C# 🙂

    Em relação a este tutorial, queria deixar-te uma sugestão que pretendo que seja construtiva.Em vez de continuares a usar o tradicional windows forms, penso que poderias começar a usar WPF (Windows Presentation Foundation) onde algumas tarefas como a impressão se encontram actualmente facilitadas.Aproveito para deixar um link para uns videos, caso alguem queira aprender.

    http://windowsclient.net/learn/videos_wpf.aspx

    Um abraço

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Vou levar em conta a tua sugestão 😉

      Obrigado pelo teu comentário.

      Abraços

    2. Avatar de paulo ricardo
      paulo ricardo

      Eu já programo em C# desde a .NET 1.0 mas nunca usei o WPF tenho uma dúvida quando se desenvolve uma aplicação com WPF aquilo compila o código?

      1. Avatar de Cipriano Oliveira

        Sim, compila, tal como numa aplicação em windows forms.

        1. Avatar de Hélio Moreira
          Hélio Moreira

          O próximo tutorial será sobre WPF…

          Hélio

          1. Avatar de Filipe Lourenço
            Filipe Lourenço

            Porreiro, o WPF parece ser o caminho a seguir pela MS no futuro. Vou estar atento. Abraço

  2. Avatar de Paulo Silva
    Paulo Silva

    Bom Post, numa linguagem de programação que diariamente encontro durante o horário de trabalho no meu PC …

    Pessoalmente, não costumo usar o DataGridView …. até agora … mas como nunca se sabe o futuro …. pode vir a ser util …
    Encontro-me mais virado para o Spread ou controlos da Infragistics. Mas que são ambos componentes pagos …

    Obrigado!

    Abraço,
    Paulo Silva

  3. Avatar de Pedro

    Bom topico para quem esta iniciar c#

  4. Avatar de Marco Almleida
    Marco Almleida

    Muito bom post. Ainda bem que voltaram aos tutoriais de C#. 🙂 Fico à espera do tutorial sobre WPF.

    Abraço
    MA

  5. Avatar de leitorassiduo
    leitorassiduo

    Finally!!! Os tutoriais de programação. Mesmo que sejam dicas que eu já conheça leio todos do principio ao fim 😀

    Muito obrigado.

    SUGESTÃO: e posts de Java não? Desde o básico, passando pelos Web-services, criptografia, geração e manuseamento pdf’s e outros files, IDE’s (por exemplo o Eclipse e o Netbeans), Web-apps, hibernate e outros tipos de acesso e edição de BD’s, etc.. só uma sugestão 😀

    1. Avatar de Nuno
      Nuno

      Também concordo contigo acho que devia de haver também tutoriais de Java, senão qualquer dia começo a pensar que isto é so Micro$oft 😛

      1. Avatar de Vítor M.

        Alguém se oferece para semanalmente fazer tutoriais em java?

        1. Avatar de leitorassiduo
          leitorassiduo

          Pah.. semanalmente não digo, mas ocasionalmente, poderei fazer qualquer coisa apesar da minha experiencia nula a escrever artigos de qualquer especie. Eu so sei escrever mails 😀 esses sao as dezenas todos os dias 😀

          1. Avatar de Hélio Moreira
            Hélio Moreira

            Não há problema, se for preciso depois dá-se uns retoques… Podes então fazer um de java?

          2. Avatar de leitorassiduo
            leitorassiduo

            Então mas onde costumam elaborar os tutoriais (editor ou ide)? Fazem em html? Caso ponha imagens têm preferencia pelo local onde as alojo?

            Para começar uma introdução ao Java serve não? Quem contacto quando tiver a “coisa” pronta? 🙂

          3. Avatar de Hélio Moreira
            Hélio Moreira

            Podes enviar para mim…Claro que ficarás com os Créditos 🙂

            Abraço

          4. Avatar de leitorassiduo
            leitorassiduo

            Responde às minhas outras questões please. E já agora, onde posso mais tarde ver o teu contacto para te enviar depois de feito?

        2. Avatar de Sod

          Eu estou a aprender java e já tenho um amplo conhecimento com C/C++. Posso escrever alguns tutos já que tenho algum tempo livre. Não tenho problema em me juntar com mais pessoal e dividir o trabalho. Se necessário enviem mail.

  6. Avatar de José Dias
    José Dias

    Boas, bom tutorial, a impressão em C# é algo que em tempos também já me custou muitas horas de pesquisa e algumas dores de cabeça.

    Aproveito para deixar por aqui uma questão que talvez me possam ajudar a resolver.

    Há pouco tempo desenvolvi uma pequena aplicação em C# + MSSQL no VS2008, um gestor de despesas. Essa aplicação encontra-se instalada no meu Portátil e sempre que tanto eu como a minha namorada queremos adicionar uma despesa temos de utilizar o meu PC. Recentemente a minha namorada adquiriu também um portátil e perguntou-me se seria possível instalar a aplicação no portátil dela para não ter utilizar o meu sempre que quisesse adicionar uma despesa. Eu expliquei-lhe que isso traria o problema de as despesas que fossem adicionadas no meu PC não apareceriam no dela e vice-versa dado as bases de dados estarem separadas. E que caso se usassem bases de dados separadas algumas funcionalidades que implementei perderiam o objectivo (Gráficos Mensais e Anuais, Estatísticas, etc).

    O que me traz a questão:

    Existe alguma hipótese de sincronizar a informação entre as bases de dados, (respeitando índices), entre os PCs?

    Agradeço desde já qualquer sugestão.

    Sem mais,

    José Dias

    1. Avatar de João Lopes
      João Lopes

      Podes fazer assim:
      Tinhas no servidor o Sqlserver Express e na aplicação em vez de te ligares directamente ao SQL usavas uma base de dados de tipo ficheiro, neste caso SQLCE, que te permite usufruir da Microsoft Sync Framework. Assim podes sincronizar facilmente os clientes com o servidor e até funcionar no modo “desconectado”. Podiam usar os portáteis durante o dia e á noite faziam o sincronismo.

      abraço

      1. Avatar de QualquerUm
        QualquerUm

        Sincronizar com a namorada à noite? Boa!!

  7. Avatar de João Lopes
    João Lopes

    Boas.
    Está muito boa esta dica, apesar do código gigante, principalmente
    gostei de ver de volta os tutoriais da minha linguagem preferida.

    Uma questão, o que aconteceu aos tutoriais de ASP.NET? Estavam bastante bons e ia mostrar como fazer um clube de video. Não vão voltar?

    Abraço.

  8. Avatar de João Rocha
    João Rocha

    Boa tarde.

    Gostaria de sugerir, porque acho uma ferramenta muito importante para quem trabalha em c sharp, a utilização do LINQ.

    O LINK está disponivel apartir da versão 3.5 da framework e é uma excelente ferramenta para quem trabalha com c sharp.

    Façam um artigo sobre LINK, se precisarem da minha ajuda estou ao dispor

  9. Avatar de João Rocha
    João Rocha

    Faço uma correcção quando disse LINK queria dizer LINQ

  10. Avatar de Carlos Carvalho
    Carlos Carvalho

    Boas,
    Antes de mais gostava de dar os parabens pelo vosso trabalho.

    Eu estava a desenvolver uma pequena aplicação para gestao de umas coisas, e seguindo um pouco as vossas ideias estou a desenvolver da msm forma atraves de datagrids. Mas o problema esta em imprimir. nao estou a conseguir por a funcionar este codigo, da me erro.. servidor rpc nao esta disponivel.. será que algem me pode ajudar..

    Desde já agradeço as vossas respostas..

  11. Avatar de Renas
    Renas

    Boas,
    Estou a fazer uma aplicação em c# com SQL e este tutorial deu bastante jeito.
    So tenho um pequeno problema!
    E que a altura das linhas da datagridview para mim so pequenas tinha de aumentar! como faço isso????

    Abraço Renas

  12. Avatar de David
    David

    Diversos exemplos e documentação sobre como enviar e-mails em .NET no website: http://www.systemnetmail.com/

  13. Avatar de RUBERVAL
    RUBERVAL

    Boa tarde,
    Sou iniciante em C#, gostei muinto de sua materia, mas estou com uma duvida, onde no codigo do printDGV esta buscando a tabela que contem os dados para preencher a list que colocamos, pois ja tem uma grid que tem os dados ai quero passar estes dados para o seu conteudo e nao to conseguindo, nao da erro nenhum no codigo mas nao vejo as opcoes para imprimir.

    atenciosamente

    Ruberval F. Lucas

  14. Avatar de RUBERVAL
    RUBERVAL

    Boa tarde, sou eu novamente, eu consegui descobrir onde eu estava errando e ja esta imprimindo, so uma coisa, eu tenho um campo que formatei dentro da grid como moeda e no relatorio nao saiu como moeda, ok. como faria isso?

  15. Avatar de David Magalhães
    David Magalhães

    Boa tarde, eu estou a seguir este exemplo, mas tenho um problema ao passar os campos para a listcheckbox porque eu uso SQL Server, e não estou a conseguir ir buscar o nome dos campos, alguem pode dar uma ajuda ?

  16. Avatar de João Antônio Cabral
    João Antônio Cabral

    Gostaria de saber se há uma maneira de imprimir o conteúdo de duas dataGridView em um mesmo documento. Uma após a outra.

    Agradeço desde já.

  17. Avatar de Eduardo França
    Eduardo França

    Olá gostei muito deste exemplo agradeço pela ajuda deste conteudo me ajudou muito.Sou iniciante em .Net obrigado.

  18. Avatar de Nogueira
    Nogueira

    Boa noite
    Este tutoriais são muito bons e ajudam bastante.
    Tenho uma pequena questão a colocar, por exemplo, se a tabela tiver um maior numero de campos o conteúdo das células poderá não caber. Neste caso penso que a melhor solução seria fazer uma rotação da pagina onde o tabela será impressa. Como é que poderia fazer isto?

    Cumps

    1. Avatar de Rogerio Júnior
      Rogerio Júnior

      Para imprimir na Horizontal, você pode seguir o seguinte passo:
      – Vai lá dentro da classe printDGV.cs
      – Lá dentro terão diversos métodos, um deles é o PrintDoc_BeginPrint, dentro dele você coloca o seguinte código: printDoc.DefaultPageSetting.Landscape = true;

      Dessa forma o sistema vai imprimir na horizontal e ajustar o tamanho das colunas.

  19. Avatar de Ary F. Silveira
    Ary F. Silveira

    Exemplo excelente para aprendizado muito bom mesmo. Esta de parabéns.
    Muito grato.

  20. Avatar de Helder Iarossi
    Helder Iarossi

    Muito bom! era o que estava precisando. Porém preciso que o valor gerado no relatório seja o conteudo filtrado no Grind. Onde consigo alterar no código para que ele faça isto? O grind meu já possui um filtro mas atualmente esta gerando o relatório com a tabela toda sem filtrar.

    1. Avatar de Rogerio Júnior
      Rogerio Júnior

      Toda vez que você aplica o filtro na DataGridView, os valores filtrados ficam registrados lá. É só mandar imprimir quando o filtro já estiver aplicado.
      Exemplo: colocar dois botões, um para aplicar o filtro e outro para imprimir. Dentro do botão de imprimir, você chama o método printDGV.PrintDataGridView(suaDataGridView);
      Desse jeito o método imprimir sempre vai pegar a DataGridView no estado atual.

      Abraço

  21. Avatar de marcos
    marcos

    ola.
    ja li tds os comentarios e nao consegui ver nenhuma resposta sobre estas duvida.
    na hr de imprimir nao aparece td o conteudo na celula pq tem mts caracteres e tb n vejo se é possivel mudar a pagina (retrato ou paisagem).
    agradeço se puderem me esclarecer.

    1. Avatar de Rogerio Júnior
      Rogerio Júnior

      Para imprimir na Horizontal, você pode seguir o seguinte passo:
      – Vai lá dentro da classe printDGV.cs
      – Lá dentro terão diversos métodos, um deles é o PrintDoc_BeginPrint, dentro dele você coloca o seguinte código: printDoc.DefaultPageSetting.Landscape = true;

      Dessa forma o sistema vai imprimir na horizontal e ajustar o tamanho das colunas.

  22. Avatar de brenno
    brenno

    Fala kra blz? Vlw por disponibilizar. Mas estou com um problema, as celulas na hora da impressao ficam com uma quebra de linha tanto na parte superior quanto na inferior, o da superior eu arrumei aqui :”StrFormat.LineAlignment = StringAlignment.Near;” a celula fica com umas 3,4 quebras de linha, assim ocupando espaço. Vc sabe como arrumar? Onde eu altero?
    Vlw

    1. Avatar de marcos
      marcos

      ola breno.
      vc conseguiu resolver?
      estou com o mesmo problema.
      o conteudo é maior que a linha, ou seja, nao aparece toda escreita.
      se vc conseguiu resolver, coloca a soluçao ai.
      abraço

  23. Avatar de Graciano Angelo Rezzadori

    Ola…Uso esta sua class no sistema que eu uso aqui em casa…
    Só apenas gostaria de ter as opções de impressão antes de imprimir, pra mim poder imprimir em rascunho, porque quando clica pra imprimir ele imprime direto.
    Obrigado pela atenção;
    Abraço.

  24. Avatar de Gabriel da Cruz Moreira Falieri
    Gabriel da Cruz Moreira Falieri

    Caraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    salvou minha vida, na verdade usei MySql mais foi facil adaptar, estou desde 15 hrs da tarde de ontem, procurando isso, o seu acho que vai funcionar, muito obrigado mesmo

  25. Avatar de Anacleto Bunga
    Anacleto Bunga

    gostei do artigo, mas eu queria consulta não com access, mas sim com sql server, podias fazer uma materia desta?

  26. Avatar de Danyal Ahmed Chaudhry
    Danyal Ahmed Chaudhry

    eu precisava duma coisa perecida mas já não há problema com este tutorial.
    preciso da tua ajuda para saber que se alguem está a trabalhar com os campos que contêm datas, no print vão sair esses dados = (01-04-2013 0:00:00) os zeros eu entendo, mas problema é se eu quiser imprimir só datas e não horas, na minha base dados eu tenho o campo com dados automaticos mas estou a usar o função date() que só me torna 01-04-2013.
    e depois faço um querry para juntar mais dados das outras tabelas e no c# só faço select * from querry.
    ajude por favor e mais rápido possível.

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Caro Danyal,

      Enviei-lhe um email.

      De qualquer forma, a função toShortDateString() retornará apenas a data.

      Cumprimentos,
      Hélio Moreira

      1. Avatar de Danyal Ahmed Chaudhry
        Danyal Ahmed Chaudhry

        tem razão mas eu não sei fazer alterações no datagrid:
        tenho o código que tirei do tutorial assim:

        // Para a coluna da TextBox
        if (((Type) ColumnTypes[i]).Name == “DataGridViewTextBoxColumn” || ((Type) ColumnTypes[i]).Name == “DataGridViewLinkColumn”)
        { e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, new SolidBrush(Cel.InheritedStyle.ForeColor),new RectangleF((int)ColumnLefts[i], (float)tmpTop,
        (int)ColumnWidths[i], (float)CellHeight), StrFormat);
        }
        isto é para saber os tipos e criar o novo certo!
        agora tenho o datagridviewtextboxcolumn com tipo datetime, não estou a entender como altero o tipo da coluna via código.
        porque
        (((Type) ColumnTypes[i]).Type não existe sendo assim não sei donde altero o tipo e como.

  27. Avatar de Tonsmit
    Tonsmit

    Olá bom dia!
    Pelo post e tá me ajudando bastante, porém como faria para fazer em um unico form com chklistbox e datagridbo.
    To tentando aki e tá dificil para adaptar.
    Poderia me ajudar nisso?

  28. Avatar de Mario Jorge
    Mario Jorge

    Bom dia, tenho um pequeno grande problema em relação ao relatório. Tenho um campo data que imprime “12/02/2014 00:00:00” e além disso meu data grid é bastante largo e eu precisava imprimir em paisagem. Isso seria possível?

  29. Avatar de Rhael
    Rhael

    Amigo so tou com um problema eu não consigo alia a impressão para começa no comarço da folha pq ela ta tipo centralizada se poder mi ajudar agradeço!

  30. Avatar de Marcio Augusto
    Marcio Augusto

    Excelente tutorial, mas estou com o mesmo problema na data, não quero imprimir a hora, somente a data.

  31. Avatar de edras cremasco
    edras cremasco

    utilizei o codigo disponivel funciona muito bem e é muito facil de adicionar a sua aplicação

  32. Avatar de Douglas Larena Oliveira
    Douglas Larena Oliveira

    Caro Helio, a proliferação do conhecimento é algo fantastico. Seu post foi realizado em Dezembro 2009…. após quase 6 anos, hoje estou de frente a mesma dificuldade. Estou tentando desenvolver um software para facilitar a rotina da minha pequenininha empresa e não estou conseguindo imprimir o conteudo do datagridview em um relatorio report ou renderiza-lo para uma planilha do excel. Vou tentar adaptar seu código a meu programa. Caso eu não consiga, vc conseguiria me ajudar?
    Obrigado
    Douglas Larena Oliveira

  33. Avatar de Ricardo
    Ricardo

    Boas. Usei este tuturial numa aplicação, mas fiquei com uma duvida que não sei se dá para fazer ou não. Queria saber como poderia colocar uma opção para imprimir a página na horizontal ou vertical, porque em alguns forms dava jeito ser na horizontal que ficasse a impressão.

    1. Avatar de Tiago Azevedo
      Tiago Azevedo

      Exatamente o que eu procuro saber. Alguma dica por aqui?

  34. Avatar de Juininho
    Juininho

    Opa,Tudo Bém ,, como faço pra qui imprima isso aeew em 80mm???

  35. Avatar de Felipe
    Felipe

    Parabéns pelo tutorial, funcionou perfeitamente.

    Grato!

  36. Avatar de michel
    michel

    obrigado funcionou perfeitamente, apenas uma duvida, como colocar a data e hora no rodapé.

  37. Avatar de Jackson Neves
    Jackson Neves

    Muito obrigado, funcionou perfeitamente!!! Vale apena seguir o passo a passo!!

  38. Avatar de Eliter Lopes
    Eliter Lopes

    Amei este tutorial, só queria saber como por os dado na horizontal porque quando a tabela tem muitos dados fica uma tremenda confusão… Agradeceria a ajuda…

    Eliter Lopes Programador Clean

    Domino as seguinte linguagem:

    C#
    C++
    Unity
    HTML
    HTML 5
    Css
    PHP
    SQL
    MYSQL
    TSQL
    ACCESS
    E uma linguagem adaptada por mim que se chama” técnica de conexão em rede em c#”

    Qualquer dúvida pessoal podem me contacte porque conhecimento é para partilhar..

    Facebook—–> Eliter Lopes
    Email:———-> eliterlopes17@gmail.com