Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASS POUR IMPRIMER UNE DATAGRIDVIEW


Information sur la source

Catégorie :Imprimante Source .NET ( DotNet ) Classé sous : imprimer, datagridview, datagridviewprinter Niveau : Expert Date de création : 13/07/2007 Date de mise à jour : 28/10/2008 20:14:30 Vu / téléchargé: 13 867 / 2 333

Note :
9,6 / 10 - par 10 personnes
9,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (36)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Bonjour,
C'est la conversion d'une classe C# DataGridViewPrinter, voir http://www.codeproject.com/csharp/datagridviewprinter.asp
En VB .NET, il ya un pb de gestion de l'impression d'une datagridview. La seule DLL disponible étant de rustemsoft étant payante.

DataGridViewPrinter : est une classe pour imprimer les datagridview. Un example est fourni avec.
Bonne programmation à tous,
Riadh.
 

Source

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

28 octobre 2008 20:14:30 :
mise à jour

Commentaires et avis

signaler à un administrateur
Commentaire de ManuAntibes le 16/07/2007 08:24:07

Salut
Félicitation pour ton travail.
Je te mets un 10/10, et ne maquerais pas de mettre un lien lien vers ton post sur mon post Imprimer un DataGridView, http://www.vbfrance.com/codes/IMPRIMER-DATAGRIDVIEW_41261.aspx.

Encore merci pour avoir pris la penne de mettre ton code à la disposition de tous, contrairement à d'autre qui on su developper une dll pour imprimer un datagridview, et qui ne partage pas.

Bonne continuation
ManuAntibes

signaler à un administrateur
Commentaire de Dnx le 16/07/2007 09:57:13

Génial la source, merci pour le partage, bravo!

je mets un 10 aussi!

signaler à un administrateur
Commentaire de ManuAntibes le 20/07/2007 08:17:50

J'aimerais changer l'orientation d'impression de portrait en paysage.

Comment faire ???

Merci

signaler à un administrateur
Commentaire de riadhh05 le 20/07/2007 12:19:18

Bonjour,
pour orienter l'impression de portrait en paysage, il suffit dans les paramètres de l'imprimante de selectionner paysage. J'ai essayé ça marche,
Riadh.

signaler à un administrateur
Commentaire de manulegosny le 27/07/2007 15:42:24

Excellent code que je viens d'utiliser avec succès.. bravo !!
10/10

Juste un chti bémol, la numérotation des pages n'est pas tout à fait correcte : si le datagridview prend 2 pages, le printpreviewdialog affiche bien "page 1" et "page 2" mais à l'impression c'est "page  3" et "page 4" !!?

signaler à un administrateur
Commentaire de filou le 21/08/2007 05:03:44

Bonjour,
Super ce code !!!
J'aimerai supprimer lors de l'impression le redimensionnement/ajustemnt des largeurs de colonnes afin de preserver les largeurs définie par code (.Columns(1).Width = 200).
Comment ajouter le contrôle MyPrintDocument dans une nouvelle form.

signaler à un administrateur
Commentaire de filou le 21/08/2007 07:00:15

Pour le controle PrintDocument je devais pas avoir les yeux en face des trou.

signaler à un administrateur
Commentaire de rasta_raf le 05/12/2007 11:34:56

Bravo pour le code !
Juste un ptit bug comme l'a souligné manulegosny : la numérotation des pages est incorrecte : pour une seule page ça met Page 2, Pour deux pages ça met Page 3 et PAge 4 ... où peut se trouver le problème ?
Thanks.

signaler à un administrateur
Commentaire de manulegosny le 10/12/2007 12:49:50

J'ai plus ou moins identifié le problème : quand on charge l'aperçu (printpreviewdialog), la classe voit cet évenement comme une impression. Si on décide d'imprimer à partir de l'aperçu,  l'impression est rajoutée... d'où les numéros de pages qui ne correspondent plus.
Du coup, lors de l'appel à la classe, je demande à l'utilisateur de prévisualiser OU imprimer direct en ayant fermé la preview au préalable.

signaler à un administrateur
Commentaire de laurent colas le 09/03/2008 18:26:30

Apres avoir cherché pas mal de temps, je suis enfin tomber sur un petit bijou:

http://www.completit.com/Products/DGVE/Downloads.aspx

il s'agit d'un outil à integrer en important les librairies

Ensuite en tres peut de ligne de code avec l'aide (en anglais)on parvient a avoir l'impression, l'export excel (pas reussi en pdf et html)et ce avec un sacré paquet d'options.

je ne suis pas un expert et ca ma couté 2h de boulot a intégrer

signaler à un administrateur
Commentaire de riadhh05 le 09/03/2008 20:27:56

Réponse à Laurent,
J'ai visité l'outil proposé dans le site. ça reste tjrs un outil commercial! même la version gratuite inclue le logo de CompletIT dans l'export/impression des données.
Même si ça pourrait résoudre l'affaire de quelques developpeurs, ceci ne s'applique sur la majorité!
Développer une application pour un nombre important d'utilisateurs necessite que: soit vous avez le code source/ ou qu'il n'y est pas de publicité pour la société qui a developpé l'API/outil.
Et ça reste tjrs un avis personnel.
Amitié

signaler à un administrateur
Commentaire de surfzoid le 25/03/2008 21:33:31 10/10

Ma foi, très bonne preuve du "spirit community", rien que ça, sans même lire la source, puisque de nombreux commentaire, ho joice, en témoigne, je te met un 10/10.
@++ et bonne prog.

Vive l'opensource!!

signaler à un administrateur
Commentaire de chafaqitaha le 03/04/2008 14:51:46 10/10

Excellent code 10/10

signaler à un administrateur
Commentaire de NHenry le 09/04/2008 11:10:45 9/10

Bonjour,

Super classe, mais j'ai apporter quelques modifications pour gérer les images (colonnes de type Byte() ) :

Dans la procédure :
DrawRows :
' Printing the cell text
g.DrawString(TheDataGridView.Rows(CurrentRow).Cells(CurrentCell).EditedFormattedValue.ToString(), RowFont, RowForeBrush, CellBounds, CellFormat)

remplacée par :
                    ' Printing the cell text
                    'Modification NH : gestion des images
                    If TypeOf TheDataGridView.Rows(CurrentRow).Cells(CurrentCell).Value Is Byte() Then
                        Dim lLocation As Point = New Point(CInt(CellBounds.Location.X), CInt(CellBounds.Location.Y))
                        g.DrawImageUnscaled(Bitmap.FromStream(ByteArrayToStream(DirectCast(TheDataGridView.Rows(CurrentRow).Cells(CurrentCell).Value, Byte()))), lLocation)
                    Else
                        g.DrawString(TheDataGridView.Rows(CurrentRow).Cells(CurrentCell).EditedFormattedValue.ToString(), RowFont, RowForeBrush, CellBounds, CellFormat)
                    End If


Note : code de la fonction ByteArrayToStream :
    ''' <summary>
    ''' Transforme un tableau d'octet en flux
    ''' </summary>
    ''' <param name="pBytes">Tableau à convertir</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ByteArrayToStream(ByRef pBytes As Byte()) As IO.Stream
        Dim lMem As New IO.MemoryStream
        lMem.Write(pBytes, 0, pBytes.Length)
        Return lMem
    End Function


Et dans Calculate :
tmpSize = g.MeasureString(TheDataGridView.Rows(j).Cells(i).EditedFormattedValue.ToString(), tmpFont)

remplacé par :

                    'Modification NH : gestion des images
                    If TypeOf TheDataGridView.Rows(j).Cells(i).Value Is Byte() Then
                        tmpSize = Bitmap.FromStream(ByteArrayToStream(DirectCast(TheDataGridView.Rows(j).Cells(i).Value, Byte()))).Size
                    Else
                        tmpSize = g.MeasureString(TheDataGridView.Rows(j).Cells(i).EditedFormattedValue.ToString(), tmpFont)
                    End If


Sinon, j'ai une question, que faut-il modifier pour forcer l'impression sur une seule page en largeur (comme dans Excel) ?

Je note rarement les sources, mais là je fais une exception (9/10, car ne gérait pas les images et pas trouvé la possibilité de mettre sur une seule page).

signaler à un administrateur
Commentaire de manulegosny le 09/04/2008 15:18:24

Hello
Dans mon cas ça ne fonctionne pas car les value dans mes cellules sont de type bitmap et non byte ... mais ça ne devrai pas être très différent ... en revanche un truc que j'ai remarqué c'est que l'impression des colonnes se fait dans l'ordre de création et non l'ordre réel  d'affichage ...

signaler à un administrateur
Commentaire de Yurf98 le 17/06/2008 16:41:14

Magnifique classe, qui fais economiser pas mal d heure...

Ssns parler du fait que tu l es diffuser au Grand Public!

10/10

signaler à un administrateur
Commentaire de Toumar le 28/07/2008 13:10:52

Merci infiniment pour la source !

signaler à un administrateur
Commentaire de Toumar le 28/07/2008 13:11:17 10/10

Et un petit 10 qui va bien :p

signaler à un administrateur
Commentaire de moogliber le 10/09/2008 18:46:11

Bravo pour cette source, vraiment très utile ! elle mérite 10/10
Une amélioration très pratique serait de pouvoir imprimer les colonnes dans l'ordre ou elles apparaissent dans le DatagridWiew. En effet l'utilisateur peut très bien modifier l'ordre des colonnes (par drag drop) mais ce changement d'ordre n'est pas répercuté dans l'impression.

J'ai essayé de faire la modif, cela ne marche qu'à moitié, car l'affichage ne se fait pas correctement.
Quelqu'un pourrait-il m'aider à compléter/ou corriger le code ?

Ma modif consiste à remplacer tout les
TheDataGridView.Columns(i)
par
TheDataGridView.Columns(ColonneDansOrdre(i))

dans laquelle Colonne ColonneDansOrdre(i) est une fonction qui permet de savoir l'ordre dans laquelle apparaissent les colonnes :


Public Function  ColonneDansOrdre(ByVal numColonne As Integer) As Integer

         ColonneDansOrdre= 0
        For i As Integer = 1 To MaDataGridView.ColumnCount - 1
            If MaDataGridView.Columns(i).DisplayIndex = numColonne Then
                ColonneDansOrdre= i
                Exit Function
            End If
        Next
    End Function

signaler à un administrateur
Commentaire de riadhh05 le 11/09/2008 07:20:15

Merci pour vos encouragements et commentaires sympatiques,
Je vous invite, dans le cas où vous avez des corrections à contribuer à l'améliorations de cette source.
Dans ce cas, veuillez m'envoyer un courriel avec la modification effectuée, et je la testerais et mettrais à jour la classe (tout en mentionnant, la correction et l'auteur).
Bonne programmation à tous,
Riadh

signaler à un administrateur
Commentaire de djguana le 23/10/2008 12:00:32

Est ce que le probleme de numero de page a t-il ete corrigé ?
la version dans le zip ne contient pas ce correctif.

Merci pour la source, c'est magnifique !

signaler à un administrateur
Commentaire de riadhh05 le 28/10/2008 07:20:44

Salut DJGUANA,
Désolé j'ai pas eu le temps pour corriger ce pb. Je vais poster bientôt une version améliorée. Par contre j'attends tjrs vos améliorations.
Amicalement,
Riadh

signaler à un administrateur
Commentaire de mabrouklepoux le 28/10/2008 11:58:08 10/10

bonjour,
très bonne source, très utile dans mon cas.
j'ai juste du bidouiller car je voulais que les couleurs affichées de la grille s'impriment.
j'ai donc ajouter une jambe de bois:
dans la fonction drawrows:
j'ai ajouté juste après les définitions de variables:

        Dim PrintRowColors As Boolean
        If MsgBox("Imprimer les couleurs affichées de la grille ?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
            PrintRowColors = True
        Else
            PrintRowColors = False
        End If

j'ai remplacé
                ' Filling the back of the CurrentRow
                    If CurrentRow Mod 2 = 0 Then
                        g.FillRectangle(RowBackBrush, RowBounds)
                    Else
                        g.FillRectangle(RowAlternatingBackBrush, RowBounds)
                    End If

par

                ' Filling the back of the CurrentRow
                If PrintRowColors = False Then
                    If CurrentRow Mod 2 = 0 Then
                        g.FillRectangle(RowBackBrush, RowBounds)
                    Else
                        g.FillRectangle(RowAlternatingBackBrush, RowBounds)
                    End If
                End If


et enfin j'ai remplacé:

                    ColumnWidth = ColumnsWidth(CurrentCell)
                    Dim CellBounds As New RectangleF(CurrentX, CurrentY, ColumnWidth, RowsHeight(CurrentRow))
                    ' Printing the cell text

par

                    ColumnWidth = ColumnsWidth(CurrentCell)
                    Dim CellBounds As New RectangleF(CurrentX, CurrentY, ColumnWidth, RowsHeight(CurrentRow))
                    If PrintRowColors = True Then
                        ' printing the cell backcolor
                        g.FillRectangle(New SolidBrush(TheDataGridView.Rows(CurrentRow).Cells(CurrentCell).Style.BackColor), CellBounds)
                    End If
                    ' Printing the cell text


ainsi, le prg va vous demander si vous voulez imprimer les couleurs de lignes alternées, ou les couleurs par cellules que vous auriez définies par programmation.

signaler à un administrateur
Commentaire de mabrouklepoux le 29/10/2008 14:43:31

J'ai une toute pitite question ...
Comment faire pour imprimer non pas un, mais deux datagrids sur la même page ?
j'ai un peu regardé, j'ai pas trouvé de moyen simple.
Si vous aviez une piste sans réécrire toute la classe ca m'intéresse !

signaler à un administrateur
Commentaire de riadhh05 le 29/10/2008 17:27:54

Salut mabrouklepoux,
J'ai pas compris votre question?
La nouvelle version permet d'imprimer plusieurs datagridview, voir la fonction qui existe dans l'exemple (SetupThePrinter(mondatagridview)).
Par contre d'après ce que j'ai compris tu veux imprimer deux tableaux dans la même page, pkoi ne pas les assembler dans une nouvelle datagridview avant de les imprimer, ca sera plus simple et plus efficace, nn?
bonne programmation,
Riadh

signaler à un administrateur
Commentaire de mabrouklepoux le 29/10/2008 19:56:13

Merci de ta réponse, cependant, mes deux datagrid ont des colonnes différentes.
j'y suis plus ou moins parvenu sans trop d'efforts, mais quand il va s'agir de multi pages, là ca va devenir compliqué, donc j'ai un peu laissé tomber.

signaler à un administrateur
Commentaire de ha_montreal le 04/11/2008 10:38:02

j 'arrive a imprimer, mais jamais comme affiché sur le datagrid..2 principaux problemes:
-j ai une colonne multiligne qui ne s'imprime qu'en une seule ligne, contrairement au datagrid et a la bdd.
-j'ai 2 colonnes date qui a l'impression s'impriment en ajoutant des 00:00:00 (genre 27-03-2008 00:00:00)
si quelqu'un a une idée ca serait tres apprecié.
un grand merci pour votre travail formidable

signaler à un administrateur
Commentaire de djguana le 07/11/2008 12:01:08

J'ai corrigé le problème du numero de page :
Pour cela il faut :
-Ajouter une variable
Private bPrintStart As Boolean

-Modifier la fonction MyPrintDocument_PrintPage

    Private Sub MyPrintDocument_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles MyPrintDocument.PrintPage
        If bPrintStart = True Then
            MyDataGridViewPrinter.ResetPageNumberCount()
            bPrintStart = False
        End If
        Dim more As Boolean = MyDataGridViewPrinter.DrawDataGridView(e.Graphics)
        If more = True Then
            e.HasMorePages = True
        Else
            bPrintStart = True
        End If
    End Sub

-Dans la classe DataGridViewPrinter: ajout de la fonction suivante :
Public Sub ResetPageNumberCount()
        PageNumberCount = 0
    End Sub

-Dans la classe DataGridViewPrinter: Modification de Private Sub DrawHeader
Il faut ajouter la ligne suivant juste apres PageNumber += 1

PageNumberCount += 1

Voila.

Il ne manque plus le fait que cela imprime la datagrid que sur une seul page (un peu comme Excel) et ca serait cool.



signaler à un administrateur
Commentaire de rida_riad le 08/11/2008 12:46:34

Très bonne source elle m'était très utile merci
Pourtant j'ai un problème lorsqu'une colonne contient un long texte les autres colonnes se décalent
et au lieu de les imprimer a coté elles sautent dans la 2 ème page ya t il un moyen pour fixer les colonnes
tel qu'elles sont dans le formulaire?

signaler à un administrateur
Commentaire de rida_riad le 13/11/2008 11:44:32

Bonjour tous,pour le problème des colonnes qui se décalent il fallait donner la largeur de la colonne au lieu de mesurer le texte
le plus long d'une cellule,
Maintenant le nouveau problème c'est quand une cellule contient deux lignes l'impression donne seulement une ligne
alors si vous avez une idée et Merci

signaler à un administrateur
Commentaire de frnecct le 24/11/2008 11:15:59 7/10

bonjours,

super code mais plusieurs buggs sont apparu avec la version du 28/10/2008
principalement du au fait de la création d'une datagridview intermédiaire pour faire la selection des lignes et colonnes.
liste:
format des dates pas respecté
impréssion de la clé et pas de la valeur affiché pour les champs combobox
N° de page pas correcte
affiche les colonnes cachées dans la fenetre de paramêtre.
imprime le nom des colonnes "Name" et pas le libélé (HeaderText)
Ne respecte pas les marges physique d'impression (pas corrigé)
etc...
Je les ais presque tous corrigés mais je ne sais pas comment mettre à disposition le nouveau code

signaler à un administrateur
Commentaire de Soncar59880 le 01/12/2008 16:21:15

vraiment très très bon ce code par contre dommage que la forme des cellules ne soit pas conservé

exemple une colonne avec des sommes monétaires devant s'afficher à droite de la colonne s'affiche actuellement sans forme et à gauche

du coup la note 10 x 10 n'est pas possible mais un bon 9 / 10 oui ^^

signaler à un administrateur
Commentaire de surfzoid le 03/03/2009 18:54:45

je pense que le probleme de la double impression suite a un "aperçu" viens de collection non nettoyé :
Fichier "DataGridViewPrinter.vb" :
Ajouter les deux clear comme suit :

        ' The function that calculate the height of each row (including the header row), the width of each column (according to the longest text in all its cells including the header cell), and the whole DataGridView width
        Private Sub Calculate(ByVal g As Graphics)
            If PageNumber = 0 Then
                ' Just calculate once
                Dim tmpSize As New SizeF()
                Dim tmpFont As Font
                Dim tmpWidth As Single
                mColumnPoints.Clear()
                mColumnPointsWidth.Clear()

signaler à un administrateur
Commentaire de othinakiway le 08/06/2009 18:57:40

très bon code , ms il ya un petit prob, c que l'impression ne se fait qu'avec l'imprimante par défaut, mm si qu'on choisi une imprimante dans la printdialog....!

signaler à un administrateur
Commentaire de manulegosny le 08/06/2009 21:42:47

Je n'ai pas ce problème .... j'imprime en pdf avec pdf creator ... et avec une imprimante réelle quand il le faut !
Quelle version de ce code utilises-tu ?

signaler à un administrateur
Commentaire de othinakiway le 09/06/2009 20:58:25

oups ,j'ai utilisé the old version, mais avec la nouvelle ça a marché parfaitement, merci

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

problème d'impression d'un datagridview [ par baltazar85 ] voilaje suis débutant je souhaiterais imprimer un datagridview en vb.net sur visual 2005.J'ai réussi un créer un code en m'aidant de source que j'ai t datagridview imprimer [ par mohamed222222 ] Bonjour,je souhaiterai imprimer le contenu de mon datagridview. pour cela j'utilise le code suivant :PrivateSub</font Imprimer un datagridview d'un formulaire [ par laloss ] Bonjour,J'ai deux formulaires, le premier, on peut trouver un bouton pour imprimer le deuxieme, on peut trouver un datagridview Voilà depuis le bouton imprimer le contenu d'un picturebox ? [ par neoabd ] j'ai  modifier un image bmp dans un picturebox et j'ai dessiner qlq polys mais quand je l'imprime je ne trouve que l'image originalesvp de m'aider  d' probleme avec datagridview [ par daloul ] j'ai probleme avec le remplissage de la datagridview je n'ai pas su comment faire ca j'ai telecharge la version express 2008 et en meme temps je trav Imprimer selection [ par akmer ] Bonjour, Je souhaiterai à l'aide d'un code Vba faire imprimer la sélection suivante : de la cellule A1 à la dernière cellule non vide de la colonn Ajouter un enregistrement à une nouvelle table à partir d'une selection sur un datagridview [ par invivus ] Bonjour,je travail sous Microsoft Visual Basic 2005 Express et j'aimerais à partir d'une sélection dans un datagridview créer une nouvelle table avec Imprimer un fichier .txt avec vb.net [ par dimitriusai ] Bonjour,je suis à la recherche d'un moyen d'imprimer un fichier .txt depuis un application vb.net.Je fonctionne avec un batch pour l'instant mais j'ai datagridview colonne [ par sylvain230 ] Comment selectionner le titre d'une colonne ?Savoir si on a cliqué dans une colonne précise ...Merci :)


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 5,288 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.