Another DataGridView Printer
Introduction
I went looking for a class to do printing from a DataGridView
, and none of them did all that I was looking for. I needed to print all pages, some pages, or the current selection; and I needed to not have objects, controls, or code from the printer object sprinkled through the rest of my code - i.e., it needed to be completely self-contained. Nothing I found met all those requirements, so I ended up writing my own.
Using the Code
To use the DGVPrinter
class, you have two options. First, you can simply add the DGVPrinter.cs source file to your project, or second, you can place the DLL in your "Bin" directory and add a reference to DGVPrinter.dll to your project's references. In either case, to use the DGVPrinter
, you will only need to add a "using DGVPrinter
" to your code file, and create an instance of the object.
//
// The using block statement
//
using DGVPrinterHelper;
//
// The using block statement
//
imports DGVPrinterHelper;
For example, if you wanted to print a DataGridView
when your user clicks a Print button on the toolbar, your code might look something like this:
//
// Printing the DataGridView Control
// in response to a toolbar button press
//
private void printToolStripButton_Click(object sender, EventArgs e)
{
DGVPrinter printer = new DGVPrinter();
printer.Title = "DataGridView Report";
printer.SubTitle = "An Easy to Use DataGridView Printing Object";
printer.SubTitleFormatFlags = StringFormatFlags.LineLimit |
StringFormatFlags.NoClip;
printer.PageNumbers = true;
printer.PageNumberInHeader = false;
printer.PorportionalColumns = true;
printer.HeaderCellAlignment = StringAlignment.Near;
printer.Footer = "Your Company Name Here";
printer.FooterSpacing = 15;
printer.PrintDataGridView(datagridviewControl);
}
//
// Printing the DataGridView Control
// in response to a toolbar button press
//
Public Class Form1
Private Sub btnPrintGridview_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnPrintGridView.Click
Dim Printer = New DGVPrinter
Printer.Title = "DataGridView Report"
Printer.SubTitle = "An Easy to Use DataGridView Printing Object"
Printer.SubTitleFormatFlags = _
StringFormatFlags.LineLimit Or StringFormatFlags.NoClip
Printer.PageNumbers = True
Printer.PageNumberInHeader = False
Printer.PorportionalColumns = True
Printer.HeaderCellAlignment = StringAlignment.Near
Printer.Footer = "Your Company Name Here"
Printer.FooterSpacing = 15
Printer.PrintDataGridView(Me.DataGridView1)
End Sub
The basic interface used here provides a neat, one-stop-shop for printing a DataGridView
. But, what if you want to have more control over the printing process? Say, you'd like to save your users' print preferences or provide a default printer? To help you with this, DGVPrinter
provides a more complex interface. Here's an example where the calling program provides overrides to the PrinterSettings
and the DefaultPageSettings
:
//
// Printing the DataGridView Control
// in response to a toolbar button press – the myprintsettings
// and mypagesettings objects are objects used by the local
// program to save printer and page settings
//
private void printToolStripButton_Click(object sender, EventArgs e)
{
DGVPrinter printer = new DGVPrinter();
printer.Title = "DataGridView Report";
printer.SubTitle = "An Easy to Use DataGridView Printing Object";
printer.SubTitleFormatFlags = StringFormatFlags.LineLimit |
StringFormatFlags.NoClip;
printer.PageNumbers = true;
printer.PageNumberInHeader = false;
printer.PorportionalColumns = true;
printer.HeaderCellAlignment = StringAlignment.Near;
printer.Footer = "Your Company Name Here";
printer.FooterSpacing = 15;
// use saved settings
if (null != myprintsettings)
printer.PrintDocument.PrinterSettings = myprintsettings;
if (null != mypagesettings)
printer.PrintDocument.DefaultPageSettings = mypagesettings;
if (DialogResult.OK == printer.DisplayPrintDialog())
// replace DisplayPrintDialog() with your own print dialog
{
// save users' settings
myprintsettings = printer.PrinterSettings;
mypagesettings = printer.PageSettings;
// print without displaying the printdialog
printer.PrintNoDisplay(datagridviewControl);
}
}
DGVPrinter
's various settings provide good control of all aspects of printing on the page. You can set the title and subtitles, add a footer, and control whether the page number prints in the header or footer. DGVPrinter
supports Right-to-Left printing for non-Western languages, and includes a drawing override for situations where a cell or column has onPaint
overridden in the source DataGridView
control. While the default styles for the printed DataGridView
are taken from the source DataGridView
control, DGVPrinter
also provides many attributes that allow you to control the styling of almost every aspect of the printout.
History
- Version 1.0 - Initial publication.
- Version 1.1 - Added footer handling, and allows the page number to print in the header or footer, and if it should print on the same line as the header or footer.
- Version 1.2 - Finally (I believe!), fixed the string/column alignment problems. Also prints cell background colors properly, respecting the alternating rows style.
- Version 1.3 - Added support for printing columns that contain images.
- Version 1.4 - Added support for printing directly to a provided
Graphics
object. - Version 2.0 - Added support for printing images on the page.
- Version 3.0 - Breaking changes! Please read!
- Added support for cells/rows that span more than one page of depth. If a cell would run off the bottom of the page, the "
KeepRowsTogether
" property determines if a partial row is printed or a new page is started. - Added support for setting the styles for row and column headers. The properties for setting header cell styles changed names, and the return type of "
PrintColumnHeaders
" changed. This can cause your program to not compile/run! - Added a default value so row headers will show up if they are supposed to be "visible".
- Added title and subtitle spacers. These will help give you control of the whitespace below the title and subtitle.
- Compiled version for VB and other language support.
- Version 3.1 - Fixed cell background color printing.
- Version 3.2 - Fixes for Embedded Print function.
- Version 3.3 - Unlikely but Possible Breaking Change
- Add a Delegate to allow "Owner Drawing" of cells, including row and column headers.
- Add better support for cell size, data size, or proportional scaling of columns. The identifier '
StringHeight
' has been changed to 'DataHeight
' since the size of an image is now properly accounted for. This may break your code if you depend on this feature. - Bug fixes.
- Version 3.4 - Added support for alternating rows when
ColumnStyle
s are overridden.
Gratitude, kudos, and acknowledgements to everyone who's suggested a feature or function. DGVPrinter
just wouldn't be the same without everyone's ideas and input!
发表评论
WZRIHG Microsoft has plans, especially in the realm of games, but I am not sure I ad want to bet on the future if this aspect is important to you. The iPod is a much better choice in that case.
TJc7Y6 I truly appreciate this post. I ave been looking everywhere for this! Thank God I found it on Bing. You ave made my day! Thank you again
Hey
You are invited for today, to this live webinar.
To claim your seat, for the Live webinar from Carol Bell & Michel de Bakker for today 11:00 AM in Eastern Time (US and Canada), sent us an email to confirmlivewebinarseat@gmail.com
Here's a quick Overview of what we're going to cover:
• 5 Expensive Marketing Mistakes many business owners make, that prevent them from getting the results they want and how to avoid them (we'll show you what's working now)
• How to know where to start and what to focus on
• How to put together a cohesive marketing plan and stop wasting time on tasks that have no value
• How to know if you are targeting the wrong keywords…
• How to know if you are missing one of the most important components of your marketing … Learning this can dramatically lead to more sales…
• And much MUCH more...
Yours truly
Michel de Bakker & Carol Bell
"Sent from my iPhone"I positively liked everything that was written.
I'd bent to abide by reading more and more.
I will be happy to learn as much as I can
I surely worship you for the sequel so gush done recognition you acutely much on the side of the time. Successfully!Uot4DZ Your style is so unique in comparison to other people I ave read stuff from. Many thanks for posting when you ave got the opportunity, Guess I will just bookmark this web site.