ManuAntibes
Messages postés491Date d'inscriptionmardi 24 octobre 2000StatutMembreDernière intervention18 novembre 2021
-
16 juil. 2007 à 08:24
abenji95
Messages postés5Date d'inscriptionmardi 19 avril 2011StatutMembreDernière intervention12 juin 2011
-
12 juin 2011 à 09:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
abenji95
Messages postés5Date d'inscriptionmardi 19 avril 2011StatutMembreDernière intervention12 juin 2011 12 juin 2011 à 09:29
BLQ peux tu m'expliquer ta solution avec plus de détail svp !
abenji95
Messages postés5Date d'inscriptionmardi 19 avril 2011StatutMembreDernière intervention12 juin 2011 11 juin 2011 à 12:23
quelqu'un a t il réussit à faire marcher les imprimantes ( car il prend toujours l'imprimante par défaut !!!)
cs_moutanabi
Messages postés4Date d'inscriptionlundi 25 avril 2011StatutMembreDernière intervention21 mai 2011 21 mai 2011 à 02:49
une autre question svp quand je click sur preview la fenetre de l'apercu ne s'affiche pas mais plutot la meme fenetre ke celle ki sort quand je click sut print merci pour l'aide
cs_moutanabi
Messages postés4Date d'inscriptionlundi 25 avril 2011StatutMembreDernière intervention21 mai 2011 21 mai 2011 à 02:40
slt je vous remercier pr votre générosité c 5/5 vs m'avez trop aidé j'ai un pti blem quand j'imprime un datagridview de 3colonnes les headerstext sont intitulé column1,column2,column3 comment ferai-je pour k'ils affichent expression,valeur,unitée
je vous remerci une otre fois
blq
Messages postés97Date d'inscriptionvendredi 22 octobre 1999StatutMembreDernière intervention13 juin 20161 16 mai 2011 à 16:11
en réponse à la seconde question de Robinwood01
Si l'imprimante choisie n'est pas la bonne au final, c'est que l'objet MyPrintDocument défini dans la la Form1 du code en exemple n'est pas correctement initialisé dans ton utilisation. Pour s'en rendre compte, il suffit de faire un Point d'Arrêt avant l'impression via l'appel MyPrintDocument.Print() et de vérifier la valeur MyPrinterDocument.PrinterSettings.PrinterName, si elle ne correspond pas à la sélection, c'est qu'il y a un souci en amont. Il ne reste donc qu'a remonté jusqu'à la perte ou la non initialisation du nom de l'imprimante, a priori après If MyPrintDialog.ShowDialog() <> DialogResult.OK Then dans le code de la fonction SetupThePrinting()
J'ai fait la même erreur en intégrant le code et en voulant le modifier pour lui ajouter du fonctionnel comme la non prise en compte des colonnes invisibles (à faire dans SetupThePrinting() dans la boucle de création de la liste des colonnes à cocher : If c.Visible = True Then AvailableColumns.Add(c.HeaderText) )
Bref, normalement c'est initialisé dans la fonction SetupThePrinting()
Personnellement, j'ai réutilisé le code en créant l'objet PrintDocument directement dans la fenêtre PrintOptions et en ajoutant la fenêtre comme un élément de la Classe. Je considère que la fenêtre fait partie du code utile (!...), ainsi j'initialise directement l'objet avec la fenêtre de dialogue système :
Donc pas de souci de ne pas pointer sur la mauvaise imprimante.
A noter que j'ai testé avec Visual Basic 2010 Express
sylvainhotte
Messages postés1Date d'inscriptionmardi 3 mai 2011StatutMembreDernière intervention10 mai 2011 10 mai 2011 à 17:09
Bonjour,
Merci pour le code. Vraiment super 10/10
Bonne journée
Sylvain
Robinwood01
Messages postés153Date d'inscriptionjeudi 25 avril 2002StatutMembreDernière intervention 3 juillet 2014 17 févr. 2011 à 12:58
Bonjour
Très bien ce code merci.
Je recontre cependant différent problème, quelqu'un aurrait il mis à jour la classe afin de corriger les problèmes :
1) Choix de l'orientation, même sélectionnant paysage dans les propriétés de l'imprimante.
2) Si je choisi une autre imprimante que celle par defaut cela imprime tout de même sur l'imprimante par defaut.
3) Les colonnes que l'on choisi dans la liste sont bien nommé par contre quand il imprime il prend le nom de l'objet colonne qui est moins jolie.
Merci d'avance
Edouard
blq
Messages postés97Date d'inscriptionvendredi 22 octobre 1999StatutMembreDernière intervention13 juin 20161 20 nov. 2010 à 20:34
Impeccable, cela fonctionne très bien avec la dernière version de Visual Basic
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 3 oct. 2009 à 10:05
Cela remonte a loin et ne vas peut etre pas t'aider, mais si je me souvien bien il y a une ligne en trop :-)
tchouny
Messages postés19Date d'inscriptionsamedi 25 février 2006StatutMembreDernière intervention 3 octobre 2013 2 oct. 2009 à 19:07
Salut à tous.
Perso j'utilise la première classe "Old version" qui me convient très bien. Merci pour cela. Le seul prob avec celle là c'est la numérotation des pages. Avez-vous une solution pour éviter que la numérotation continue à l'impression (ex: 1à 3 en preview et 4 à 6 en impression)
Merci
Kalimshar1
Messages postés2Date d'inscriptionmercredi 14 décembre 2005StatutMembreDernière intervention15 septembre 2009 15 sept. 2009 à 17:04
Merci pour ce super exemple.
Est ce que qq1 a réussi à résoudre les problèmes suivants? (je suis en vb.net)
- choix de l'imprimante par défaut malgré le choix de la boite de dialogue
- possibilité d'imprimer un checkbox - bouton
merci d'avance pour le travail
prepseb
Messages postés1Date d'inscriptionlundi 14 novembre 2005StatutMembreDernière intervention14 juillet 2009 14 juil. 2009 à 16:03
Wow bravo! Ça fonctionne superbement bien! 10/10
cs_othinakiway
Messages postés30Date d'inscriptionlundi 7 avril 2008StatutMembreDernière intervention10 juin 20092 9 juin 2009 à 20:58
oups ,j'ai utilisé the old version, mais avec la nouvelle ça a marché parfaitement, merci
manulegosny
Messages postés18Date d'inscriptionjeudi 30 mars 2006StatutMembreDernière intervention 4 janvier 2009 8 juin 2009 à 21:42
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 ?
cs_othinakiway
Messages postés30Date d'inscriptionlundi 7 avril 2008StatutMembreDernière intervention10 juin 20092 8 juin 2009 à 18:57
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....!
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 3 mars 2009 à 18:54
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()
Soncar59880
Messages postés1Date d'inscriptionlundi 10 novembre 2008StatutMembreDernière intervention 1 décembre 2008 1 déc. 2008 à 16:21
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 ^^
frnecct
Messages postés10Date d'inscriptionmercredi 25 juillet 2007StatutMembreDernière intervention24 novembre 2008 24 nov. 2008 à 11:15
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
rida_riad
Messages postés10Date d'inscriptionjeudi 1 février 2007StatutMembreDernière intervention 3 avril 2009 13 nov. 2008 à 11:44
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
rida_riad
Messages postés10Date d'inscriptionjeudi 1 février 2007StatutMembreDernière intervention 3 avril 2009 8 nov. 2008 à 12:46
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?
djguana
Messages postés5Date d'inscriptionlundi 11 juillet 2005StatutMembreDernière intervention 7 novembre 2008 7 nov. 2008 à 12:01
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.
cs_ha_montreal
Messages postés1Date d'inscriptionmardi 10 août 2004StatutMembreDernière intervention 4 novembre 2008 4 nov. 2008 à 10:38
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
cs_mabrouklepoux
Messages postés84Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention25 juillet 20081 29 oct. 2008 à 19:56
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.
riadhh05
Messages postés17Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention16 juin 2008 29 oct. 2008 à 17:27
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
cs_mabrouklepoux
Messages postés84Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention25 juillet 20081 29 oct. 2008 à 14:43
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 !
cs_mabrouklepoux
Messages postés84Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention25 juillet 20081 28 oct. 2008 à 11:58
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.
riadhh05
Messages postés17Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention16 juin 2008 28 oct. 2008 à 07:20
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
djguana
Messages postés5Date d'inscriptionlundi 11 juillet 2005StatutMembreDernière intervention 7 novembre 2008 23 oct. 2008 à 12:00
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 !
riadhh05
Messages postés17Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention16 juin 2008 11 sept. 2008 à 07:20
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
moogliber
Messages postés40Date d'inscriptionlundi 26 septembre 2005StatutMembreDernière intervention 5 janvier 2012 10 sept. 2008 à 18:46
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
Toumar
Messages postés7Date d'inscriptionjeudi 26 juillet 2007StatutMembreDernière intervention29 octobre 2008 28 juil. 2008 à 13:11
Et un petit 10 qui va bien :p
Toumar
Messages postés7Date d'inscriptionjeudi 26 juillet 2007StatutMembreDernière intervention29 octobre 2008 28 juil. 2008 à 13:10
Merci infiniment pour la source !
Yurf98
Messages postés10Date d'inscriptionsamedi 9 décembre 2000StatutMembreDernière intervention10 juillet 2008 17 juin 2008 à 16:41
Magnifique classe, qui fais economiser pas mal d heure...
Ssns parler du fait que tu l es diffuser au Grand Public!
10/10
manulegosny
Messages postés18Date d'inscriptionjeudi 30 mars 2006StatutMembreDernière intervention 4 janvier 2009 9 avril 2008 à 15:18
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 ...
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 9 avril 2008 à 11: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>
''' Tableau à convertir
''' <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).
chafaqitaha
Messages postés2Date d'inscriptiondimanche 20 novembre 2005StatutMembreDernière intervention 3 avril 2008 3 avril 2008 à 14:51
Excellent code 10/10
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 25 mars 2008 à 21:33
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!!
riadhh05
Messages postés17Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention16 juin 2008 9 mars 2008 à 20:27
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é
laurent colas
Messages postés3Date d'inscriptionmardi 28 mars 2006StatutMembreDernière intervention 9 mars 2008 9 mars 2008 à 18:26
Apres avoir cherché pas mal de temps, je suis enfin tomber sur un petit bijou:
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
manulegosny
Messages postés18Date d'inscriptionjeudi 30 mars 2006StatutMembreDernière intervention 4 janvier 2009 10 déc. 2007 à 12:49
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.
rasta_raf
Messages postés20Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention 6 mai 2008 5 déc. 2007 à 11:34
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.
cs_filou
Messages postés98Date d'inscriptionmercredi 19 décembre 2001StatutMembreDernière intervention15 janvier 2008 21 août 2007 à 07:00
Pour le controle PrintDocument je devais pas avoir les yeux en face des trou.
cs_filou
Messages postés98Date d'inscriptionmercredi 19 décembre 2001StatutMembreDernière intervention15 janvier 2008 21 août 2007 à 05:03
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.
manulegosny
Messages postés18Date d'inscriptionjeudi 30 mars 2006StatutMembreDernière intervention 4 janvier 2009 27 juil. 2007 à 15:42
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" !!?
riadhh05
Messages postés17Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention16 juin 2008 20 juil. 2007 à 12:19
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.
ManuAntibes
Messages postés491Date d'inscriptionmardi 24 octobre 2000StatutMembreDernière intervention18 novembre 20215 20 juil. 2007 à 08:17
J'aimerais changer l'orientation d'impression de portrait en paysage.
Comment faire ???
Merci
cs_Dnx
Messages postés16Date d'inscriptionjeudi 9 octobre 2003StatutMembreDernière intervention16 juillet 2007 16 juil. 2007 à 09:57
Génial la source, merci pour le partage, bravo!
je mets un 10 aussi!
ManuAntibes
Messages postés491Date d'inscriptionmardi 24 octobre 2000StatutMembreDernière intervention18 novembre 20215 16 juil. 2007 à 08:24
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.
12 juin 2011 à 09:29
11 juin 2011 à 12:23
21 mai 2011 à 02:49
21 mai 2011 à 02:40
je vous remerci une otre fois
16 mai 2011 à 16:11
Si l'imprimante choisie n'est pas la bonne au final, c'est que l'objet MyPrintDocument défini dans la la Form1 du code en exemple n'est pas correctement initialisé dans ton utilisation. Pour s'en rendre compte, il suffit de faire un Point d'Arrêt avant l'impression via l'appel MyPrintDocument.Print() et de vérifier la valeur MyPrinterDocument.PrinterSettings.PrinterName, si elle ne correspond pas à la sélection, c'est qu'il y a un souci en amont. Il ne reste donc qu'a remonté jusqu'à la perte ou la non initialisation du nom de l'imprimante, a priori après If MyPrintDialog.ShowDialog() <> DialogResult.OK Then dans le code de la fonction SetupThePrinting()
J'ai fait la même erreur en intégrant le code et en voulant le modifier pour lui ajouter du fonctionnel comme la non prise en compte des colonnes invisibles (à faire dans SetupThePrinting() dans la boucle de création de la liste des colonnes à cocher : If c.Visible = True Then AvailableColumns.Add(c.HeaderText) )
Bref, normalement c'est initialisé dans la fonction SetupThePrinting()
Personnellement, j'ai réutilisé le code en créant l'objet PrintDocument directement dans la fenêtre PrintOptions et en ajoutant la fenêtre comme un élément de la Classe. Je considère que la fenêtre fait partie du code utile (!...), ainsi j'initialise directement l'objet avec la fenêtre de dialogue système :
PrintOptions.MyPrintDocument.PrinterSettings = MyPrintDialog.PrinterSettings
Donc pas de souci de ne pas pointer sur la mauvaise imprimante.
A noter que j'ai testé avec Visual Basic 2010 Express
10 mai 2011 à 17:09
Merci pour le code. Vraiment super 10/10
Bonne journée
Sylvain
17 févr. 2011 à 12:58
Très bien ce code merci.
Je recontre cependant différent problème, quelqu'un aurrait il mis à jour la classe afin de corriger les problèmes :
1) Choix de l'orientation, même sélectionnant paysage dans les propriétés de l'imprimante.
2) Si je choisi une autre imprimante que celle par defaut cela imprime tout de même sur l'imprimante par defaut.
3) Les colonnes que l'on choisi dans la liste sont bien nommé par contre quand il imprime il prend le nom de l'objet colonne qui est moins jolie.
Merci d'avance
Edouard
20 nov. 2010 à 20:34
3 oct. 2009 à 10:05
2 oct. 2009 à 19:07
Perso j'utilise la première classe "Old version" qui me convient très bien. Merci pour cela. Le seul prob avec celle là c'est la numérotation des pages. Avez-vous une solution pour éviter que la numérotation continue à l'impression (ex: 1à 3 en preview et 4 à 6 en impression)
Merci
15 sept. 2009 à 17:04
Est ce que qq1 a réussi à résoudre les problèmes suivants? (je suis en vb.net)
- choix de l'imprimante par défaut malgré le choix de la boite de dialogue
- possibilité d'imprimer un checkbox - bouton
merci d'avance pour le travail
14 juil. 2009 à 16:03
9 juin 2009 à 20:58
8 juin 2009 à 21:42
Quelle version de ce code utilises-tu ?
8 juin 2009 à 18:57
3 mars 2009 à 18:54
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()
1 déc. 2008 à 16:21
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 ^^
24 nov. 2008 à 11:15
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
13 nov. 2008 à 11:44
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
8 nov. 2008 à 12:46
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?
7 nov. 2008 à 12:01
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.
4 nov. 2008 à 10:38
-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
29 oct. 2008 à 19:56
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.
29 oct. 2008 à 17:27
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
29 oct. 2008 à 14:43
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 !
28 oct. 2008 à 11:58
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.
28 oct. 2008 à 07:20
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
23 oct. 2008 à 12:00
la version dans le zip ne contient pas ce correctif.
Merci pour la source, c'est magnifique !
11 sept. 2008 à 07:20
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
10 sept. 2008 à 18:46
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
28 juil. 2008 à 13:11
28 juil. 2008 à 13:10
17 juin 2008 à 16:41
Ssns parler du fait que tu l es diffuser au Grand Public!
10/10
9 avril 2008 à 15:18
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 ...
9 avril 2008 à 11:10
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>
''' Tableau à convertir
''' <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).
3 avril 2008 à 14:51
25 mars 2008 à 21:33
@++ et bonne prog.
Vive l'opensource!!
9 mars 2008 à 20:27
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é
9 mars 2008 à 18:26
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
10 déc. 2007 à 12:49
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.
5 déc. 2007 à 11:34
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.
21 août 2007 à 07:00
21 août 2007 à 05:03
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.
27 juil. 2007 à 15:42
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" !!?
20 juil. 2007 à 12:19
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.
20 juil. 2007 à 08:17
Comment faire ???
Merci
16 juil. 2007 à 09:57
je mets un 10 aussi!
16 juil. 2007 à 08:24
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