Easiest way to add a Header and Footer to a Printing.PrintDocument (.Net 2.0)?
-
09-06-2019 - |
Question
What's the easiest way to add a header and footer to a .Net PrintDocument object, either pragmatically or at design-time?
Specifically I'm trying to print a 3rd party grid control (Infragistics GridEx v4.3), which takes a PrintDocument object and draws itself into it.
The resulting page just contains the grid and it's contents - however I would like to add a header or title to identify the printed report, and possibly a footer to show who printed it, when, and ideally a page number and total pages.
I'm using VB.Net 2.0.
Thanks for your help!
Solution
The printdocument object fires the printpage event for each page to be printed. You can draw text/lines/etc into the print queue using the printpageeventargs event parameter:
http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx
Dim it WithEvents when you pass it to the grid, so you can handle the event.
OTHER TIPS
Following booji-boy's answer, here's what I came up with (which I've simplified for example purposes):
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
Dim oDoc As New Printing.PrintDocument
oDoc.DefaultPageSettings.Landscape = True
AddHandler oDoc.PrintPage, AddressOf PrintPage
oDoc.DocumentName = "Printout"
InfragisticsWinGrid.PrintPreview(InfragisticsWinGrid.DisplayLayout, oDoc)
End If
End Sub
Private Sub PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
' Draw title
e.Graphics.DrawString("Report Title"), New Font("Arial", 16), Brushes.Black, 95, 70)
' Draw footer
e.Graphics.DrawImage(DirectCast(mResources.GetObject("footer_logo"), Drawing.Bitmap), 95, e.PageBounds.Height - 87)
Dim drawFont As New Font("Arial", 8.75)
e.Graphics.DrawString("Report Title", drawFont, Brushes.Gray, 190, e.PageBounds.Height - 90)
e.Graphics.DrawString("Printed", drawFont, Brushes.Gray, 190, e.PageBounds.Height - 76)
e.Graphics.DrawString("Printed By", drawFont, Brushes.Gray, 190, e.PageBounds.Height - 62)
' Draw some grid lines to add structure to the footer information
e.Graphics.DrawLine(Pens.Gray, 246, e.PageBounds.Height - 90, 246, e.PageBounds.Height - 48)
e.Graphics.DrawLine(Pens.Gray, 188, e.PageBounds.Height - 75, 550, e.PageBounds.Height - 75)
e.Graphics.DrawLine(Pens.Gray, 188, e.PageBounds.Height - 61, 550, e.PageBounds.Height - 61)
e.Graphics.DrawString("Report", drawFont, Brushes.Black, 250, e.PageBounds.Height - 90)
e.Graphics.DrawString(Date.Now.ToShortDateString & " " & Date.Now.ToShortTimeString, drawFont, Brushes.Black, 250, e.PageBounds.Height - 76)
e.Graphics.DrawString("Andrew", drawFont, Brushes.Black, 250, e.PageBounds.Height - 62)
End Sub
I had to play with the values of e.PageBounds.Height - x
to get the drawn items to line up.
Thanks again Booji Boy for the pointer - getting at the ReportPage.Graphics() was exactly what I was after :o)