In this article I will explain how to print the contents of Form in Windows Forms (WinForms) Application using C# and VB.Net.
The Form contents will be printed without the Form Header and Form borders.
Form Controls
In the below Form, there’s a DataGridView, a Print Button, a PrintPreviewDialog and a PrintDocument controls.
Populating DataGridView
In order to populate the DataGridView, I have created a dynamic DataTable with some sample data.
C#
private void Form1_Load(object sender, EventArgs e)
{
this.BindDataGridView();
}
private void BindDataGridView()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)),
new DataColumn("Name", typeof(string)),
new DataColumn("Country",typeof(string)) });
dt.Rows.Add(1, "John Hammond", "United States");
dt.Rows.Add(2, "Mudassar Khan", "India");
dt.Rows.Add(3, "Suzanne Mathews", "France");
dt.Rows.Add(4, "Robert Schidner", "Russia");
this.dataGridView1.DataSource = dt;
}
VB.Net
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
BindDataGridView()
End Sub
Private Sub BindDataGridView()
Dim dt As New DataTable()
dt.Columns.AddRange(New DataColumn(2) {New DataColumn("Id", GetType(Integer)), New DataColumn("Name", GetType(String)), New DataColumn("Country", GetType(String))})
dt.Rows.Add(1, "John Hammond", "United States")
dt.Rows.Add(2, "Mudassar Khan", "India")
dt.Rows.Add(3, "Suzanne Mathews", "France")
dt.Rows.Add(4, "Robert Schidner", "Russia")
Me.dataGridView1.DataSource = dt
End Sub
Printing the contents of Form
When the Print Button is clicked, first a Panel control is added to the Form. Then an object of the Graphic class is created from the Panel and its Height and Width is set to that of the Height and Width of the Form after excluding its Header and Borders.
Using the Graphics object, Bitmap object is created from the Panel and the Form area covered by the Panel is captured within it.
Finally the PrintPreviewDialog is shown and the Bitmap object is printed.
C#
Bitmap bitmap;
private void btnPrint_Click(object sender, EventArgs e)
{
//Add a Panel control.
Panel panel = new Panel();
this.Controls.Add(panel);
//Create a Bitmap of size same as that of the Form.
Graphics grp = panel.CreateGraphics();
Size formSize = this.ClientSize;
bitmap = new Bitmap(formSize.Width, formSize.Height, grp);
grp = Graphics.FromImage(bitmap);
//Copy screen area that that the Panel covers.
Point panelLocation = PointToScreen(panel.Location);
grp.CopyFromScreen(panelLocation.X, panelLocation.Y, 0, 0, formSize);
//Show the Print Preview Dialog.
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.PrintPreviewControl.Zoom = 1;
printPreviewDialog1.ShowDialog();
}
private void PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//Print the contents.
e.Graphics.DrawImage(bitmap, 0, 0);
}
VB.Net
Private bitmap As Bitmap
Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click
'Add a Panel control.
Dim panel As New Panel()
Me.Controls.Add(panel)
'Create a Bitmap of size same as that of the Form.
Dim grp As Graphics = panel.CreateGraphics()
Dim formSize As Size = Me.ClientSize
bitmap = New Bitmap(formSize.Width, formSize.Height, grp)
grp = Graphics.FromImage(bitmap)
'Copy screen area that that the Panel covers.
Dim panelLocation As Point = PointToScreen(panel.Location)
grp.CopyFromScreen(panelLocation.X, panelLocation.Y, 0, 0, formSize)
'Show the Print Preview Dialog.
printPreviewDialog1.Document = printDocument1
printPreviewDialog1.PrintPreviewControl.Zoom = 1
printPreviewDialog1.ShowDialog()
End Sub
Private Sub PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles printDocument1.PrintPage
'Print the contents.
e.Graphics.DrawImage(bitmap, 0, 0)
End Sub
Screenshots
Print Preview Dialog displaying the contents of the Form
Printed contents of Form
Downloads
Download Code