Practical
Learning: Introducing Printing
|
|
- Start Microsoft Visual Basic
- Create a new Windows Application named CollegeParkAutoRepair1
- In the Solution Explorer, right-click Form1.vb and click Rename
- Type CollegeParkAutoRepair.vb and press Enter
- From the Menus & Toolbars section of the Toolbox, click MenuStrip and
click the form
- Design the menu items as follows:
MenuItem |
DropDownItems |
Text |
Name |
Text |
Name |
Image |
Shortcut |
&File |
mnuFile |
&New Repair Order |
mnuFileNew |
new.ico |
Ctrl+N |
|
|
&Open Existing Order... |
mnuFileOpen |
open.ico |
Ctrl+O |
|
|
&Save Current Order |
mnuFileSave |
save.ico |
Ctrl+S |
|
|
Separator |
|
|
|
|
|
&Print |
mnuFilePrint |
printer.ico |
Ctrl+P |
|
|
Separator |
|
|
|
|
|
E&xit |
mnuFileExit |
|
|
- Design the form as follows:
|
Control |
Name |
Text |
Other Properties |
Group |
|
Order Identification |
|
Label |
|
Customer Name: |
|
TextBox |
txtCustomerName |
|
|
Label |
|
Address |
|
TextBox |
txtAddress |
|
|
Label |
|
City: |
|
TextBox |
txtCity |
|
|
Label |
|
State: |
|
TextBox |
txtState |
|
|
Label |
|
ZIP Code: |
|
TextBox |
txtZIPCode |
|
TextAlign: Right |
Label |
|
Make / Model: |
|
TextBox |
txtMake |
|
|
TextBox |
txtModel |
|
|
Label |
|
Year: |
|
TextBox |
txtCarYear |
|
TextAlign: Right |
Label |
|
Problem Description: |
|
TextBox |
txtProblem |
|
|
GroupBox |
|
Parts Used |
|
Label |
|
Part Name |
|
Label |
|
Unit Price |
|
Label |
|
Qty |
|
Label |
|
Sub Total |
|
TextBox |
txtPartName1 |
|
|
TextBox |
txtUnitPrice1 |
0.00 |
TextAlign: Right |
TextBox |
txtQuantity1 |
0 |
TextAlign: Right |
TextBox |
txtSubTotal1 |
0.00 |
TextAlign: Right
Enabled: False |
TextBox |
txtPartName2 |
|
|
TextBox |
txtUnitPrice2 |
0.00 |
TextAlign: Right |
TextBox |
txtQuantity2 |
0 |
TextAlign: Right |
TextBox |
txtSubTotal2 |
0.00 |
TextAlign: Right
Enabled: False |
TextBox |
txtPartName3 |
|
|
TextBox |
txtUnitPrice3 |
0.00 |
TextAlign: Right |
TextBox |
txtQuantity3 |
0 |
TextAlign: Right |
TextBox |
txtSubTotal3 |
0.00 |
TextAlign: Right
Enabled: False |
TextBox |
txtPartName4 |
|
|
TextBox |
txtUnitPrice4 |
0.00 |
TextAlign: Right |
TextBox |
txtQuantity4 |
0 |
TextAlign: Right |
TextBox |
txtSubTotal4 |
0.00 |
TextAlign: Right
Enabled: False |
TextBox |
txtPartName5 |
|
|
TextBox |
txtUnitPrice5 |
0.00 |
TextAlign: Right |
TextBox |
txtQuantity5 |
0 |
TextAlign: Right |
TextBox |
txtSubTotal5 |
0.00 |
TextAlign: Right
Enabled: False |
GroupBox |
|
Jobs Performed |
|
Label |
|
Price |
|
TextBox |
txtJobPerformed1 |
|
|
TextBox |
txtJobPrice1 |
0.00 |
TextAlign: Right |
TextBox |
txtJobPerformed2 |
|
|
TextBox |
txtJobPrice2 |
0.00 |
TextAlign: Right |
TextBox |
txtJobPerformed3 |
|
|
TextBox |
txtJobPrice3 |
0.00 |
TextAlign: Right |
TextBox |
txtJobPerformed4 |
|
|
TextBox |
txtJobPrice4 |
0.00 |
TextAlign: Right |
TextBox |
txtJobPerformed5 |
|
|
TextBox |
txtJobPrice5 |
0.00 |
TextAlign: Right |
GroupBox |
|
Order Summary |
|
Label |
|
Total Parts: |
|
TextBox |
txtTotalParts |
0.00 |
TextAlign: Right |
Label |
|
Total Labor: |
|
TextBox |
txtTotalLabor |
0.00 |
TextAlign: Right |
Label |
|
Tax Rate: |
|
TextBox |
txtTaxRate |
7.75 |
TextAlign: Right |
Label |
|
% |
|
Label |
|
Tax Amount: |
|
TextBox |
txtTaxAmount |
0.00 |
TextAlign: Right |
Label |
|
Total Order: |
|
TextBox |
txtTotalOrder |
0.00 |
TextAlign: Right |
Label |
|
Recommendations |
|
TextBox |
txtRecommendations |
|
Multiline: True
ScrollBars: Vertical |
|
- Right-click the form and click View Code
- Create a method named Calculate as follows:
Imports System.IO
Public Class CollegeParkAutoRepair
Private Sub Calculate()
Dim Part1UnitPrice As Double, Part2UnitPrice As Double
Dim Part3UnitPrice As Double, Part4UnitPrice As Double
Dim Part5UnitPrice As Double, Part1SubTotal As Double
Dim Part2SubTotal As Double, Part3SubTotal As Double
Dim Part4SubTotal As Double, Part5SubTotal As Double
Dim Part1Quantity As Integer, Part2Quantity As Integer
Dim Part3Quantity As Integer, Part4Quantity As Integer
Dim Part5Quantity As Integer
Dim Job1Price As Double, Job2Price As Double
Dim Job3Price As Double, Job4Price As Double
Dim Job5Price As Double
Dim TotalParts As Double, TotalLabor As Double
Dim TaxRate As Double, TaxAmount As Double
Dim TotalOrder As Double, TotalPartsAndLabor As Double
' Don't charge a part unless it is clearly identified
If txtPartName1.Text = "" Then
txtUnitPrice1.Text = "0.00"
txtQuantity1.Text = "0"
txtSubTotal1.Text = "0.00"
Part1UnitPrice = 0.0
Else
Try
Part1UnitPrice = CDbl(txtUnitPrice1.Text)
Catch ex As Exception
MsgBox("Invalid Unit Price")
txtUnitPrice1.Text = "0.00"
txtUnitPrice1.Focus()
End Try
Try
Part1Quantity = CInt(txtQuantity1.Text)
Catch ex As Exception
MsgBox("Invalid Quantity")
txtQuantity1.Text = ""
txtQuantity1.Focus()
End Try
End If
If txtPartName2.Text = "" Then
txtUnitPrice2.Text = "0.00"
txtQuantity2.Text = "0"
txtSubTotal2.Text = "0.00"
Part2UnitPrice = 0.0
Else
Try
Part2UnitPrice = CDbl(txtUnitPrice2.Text)
Catch ex As Exception
MsgBox("Invalid Unit Price")
txtUnitPrice2.Text = "0.00"
txtUnitPrice2.Focus()
End Try
Try
Part2Quantity = CInt(txtQuantity2.Text)
End
Catch ex As Exception
MsgBox("Invalid Quantity")
txtQuantity2.Text = "0"
txtQuantity2.Focus()
End Try
End If
If txtPartName3.Text = "" Then
txtUnitPrice3.Text = "0.00"
txtQuantity3.Text = "0"
txtSubTotal3.Text = "0.00"
Part3UnitPrice = 0.0
Else
Try
Part3UnitPrice = CDbl(txtUnitPrice3.Text)
Catch ex As Exception
MsgBox("Invalid Unit Price")
txtUnitPrice3.Text = "0.00"
txtUnitPrice3.Focus()
End Try
Try
Part3Quantity = CInt(txtQuantity3.Text)
Catch ex As Exception
MsgBox("Invalid Quantity")
txtQuantity3.Text = "0"
txtQuantity3.Focus()
End Try
End If
If txtPartName4.Text = "" Then
txtUnitPrice4.Text = "0.00"
txtQuantity4.Text = "0"
txtSubTotal4.Text = "0.00"
Part4UnitPrice = 0.0
Else
Try
Part4UnitPrice = CDbl(txtUnitPrice4.Text)
Catch ex As Exception
MsgBox("Invalid Unit Price")
txtUnitPrice4.Text = "0.00"
txtUnitPrice4.Focus()
End Try
Try
Part4Quantity = CInt(txtQuantity4.Text)
Catch ex As Exception
MsgBox("Invalid Quantity")
txtQuantity4.Text = "0"
txtQuantity4.Focus()
End Try
End If
If txtPartName5.Text = "" Then
txtUnitPrice5.Text = "0.00"
txtQuantity5.Text = "0"
txtSubTotal5.Text = "0.00"
Part5UnitPrice = 0.0
Else
Try
Part5UnitPrice = CDbl(txtUnitPrice5.Text)
Catch ex As Exception
MsgBox("Invalid Unit Price")
txtUnitPrice5.Text = "0.00"
txtUnitPrice5.Focus()
End Try
Try
Part5Quantity = CInt(txtQuantity5.Text)
Catch ex As Exception
MsgBox("Invalid Quantity")
txtQuantity5.Text = "0"
txtQuantity5.Focus()
End Try
End If
' Don't bill the customer for a job that is not specified
If txtJobDescription1.Text = "" Then
txtJobPrice1.Text = "0.00"
Job1Price = 0.0
Else
Try
Job1Price = CDbl(txtJobPrice1.Text)
Catch ex As Exception
MsgBox("Invalid Job Price")
txtJobPrice1.Text = "0.00"
txtJobPrice1.Focus()
End Try
End If
If txtJobDescription2.Text = "" Then
txtJobPrice2.Text = "0.00"
Job2Price = 0.0
Else
Try
Job2Price = CDbl(txtJobPrice2.Text)
Catch ex As Exception
MsgBox("Invalid Job Price")
txtJobPrice2.Text = "0.00"
txtJobPrice2.Focus()
End Try
End If
If txtJobDescription3.Text = "" Then
txtJobPrice3.Text = "0.00"
Job3Price = 0.0
Else
Try
Job3Price = CDbl(txtJobPrice3.Text)
Catch ex As Exception
MsgBox("Invalid Job Price")
txtJobPrice3.Text = "0.00"
txtJobPrice3.Focus()
End Try
End If
If txtJobDescription4.Text = "" Then
txtJobPrice4.Text = "0.00"
Job4Price = 0.0
Else
Try
Job4Price = CDbl(txtJobPrice4.Text)
Catch ex As Exception
MsgBox("Invalid Job Price")
txtJobPrice4.Text = "0.00"
txtJobPrice4.Focus()
End Try
End If
If txtJobDescription5.Text = "" Then
txtJobPrice5.Text = "0.00"
Job5Price = 0.0
Else
Try
Job5Price = CDbl(txtJobPrice5.Text)
Catch ex As Exception
MsgBox("Invalid Job Price")
txtJobPrice5.Text = "0.00"
txtJobPrice5.Focus()
End Try
End If
Part1SubTotal = Part1UnitPrice * Part1Quantity
Part2SubTotal = Part2UnitPrice * Part2Quantity
Part3SubTotal = Part3UnitPrice * Part3Quantity
Part4SubTotal = Part4UnitPrice * Part4Quantity
Part5SubTotal = Part5UnitPrice * Part5Quantity
txtSubTotal1.Text = FormatNumber(Part1SubTotal)
txtSubTotal2.Text = FormatNumber(Part2SubTotal)
txtSubTotal3.Text = FormatNumber(Part3SubTotal)
txtSubTotal4.Text = FormatNumber(Part4SubTotal)
txtSubTotal5.Text = FormatNumber(Part5SubTotal)
TotalParts = Part1SubTotal + Part2SubTotal + Part3SubTotal + _
Part4SubTotal + Part5SubTotal
TotalLabor = Job1Price + Job2Price + Job3Price + _
Job4Price + Job5Price
Try
TaxRate = CDbl(txtTaxRate.Text)
Catch ex As Exception
MsgBox("Invalid Tax Rate")
txtTaxRate.Text = "7.75"
txtTaxRate.Focus()
End Try
TotalPartsAndLabor = TotalParts + TotalLabor
TaxAmount = TotalPartsAndLabor * TaxRate / 100
TotalOrder = TotalPartsAndLabor + TaxAmount
txtTotalParts.Text = FormatNumber(TotalParts)
txtTotalLabor.Text = FormatNumber(TotalLabor)
txtTaxAmount.Text = FormatNumber(TaxAmount)
txtTotalOrder.Text = FormatNumber(TotalOrder)
End Sub
End Class
|
- In the Class Name combo box, select mnuFileNew
- In the Method Name combo box, select Click and implement the event as
follows:
Private Sub mnuFileNew_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles mnuFileNew.Click
txtCustomerName.Text = ""
txtAddress.Text = ""
txtCity.Text = ""
txtState.Text = ""
txtZIPCode.Text = ""
txtMake.Text = ""
txtModel.Text = ""
txtCarYear.Text = ""
txtProblem.Text = ""
txtPartName1.Text = ""
txtUnitPrice1.Text = "0.00"
txtQuantity1.Text = "0"
txtSubTotal1.Text = "0.00"
txtPartName2.Text = ""
txtUnitPrice2.Text = "0.00"
txtQuantity2.Text = "0"
txtSubTotal2.Text = "0.00"
txtPartName3.Text = ""
txtUnitPrice3.Text = "0.00"
txtQuantity3.Text = "0"
txtSubTotal3.Text = "0.00"
txtPartName4.Text = ""
txtUnitPrice4.Text = "0.00"
txtQuantity4.Text = "0"
txtSubTotal4.Text = "0.00"
txtPartName5.Text = ""
txtUnitPrice5.Text = "0.00"
txtQuantity5.Text = "0"
txtSubTotal5.Text = "0.00"
txtJobDescription1.Text = ""
txtJobPrice1.Text = "0.00"
txtJobDescription2.Text = ""
txtJobPrice2.Text = "0.00"
txtJobDescription3.Text = ""
txtJobPrice3.Text = "0.00"
txtJobDescription4.Text = ""
txtJobPrice4.Text = "0.00"
txtJobDescription5.Text = ""
txtJobPrice5.Text = "0.00"
txtTotalParts.Text = "0.00"
txtTotalLabor.Text = "0.00"
txtTaxRate.Text = "7.75"
txtTaxAmount.Text = "0.00"
txtTotalOrder.Text = "0.00"
txtRecommendations.Text = ""
txtCustomerName.Focus()
End Sub
|
- Under the above End Sub line, create the following common event:
Private Sub SetAndLeave(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles txtUnitPrice1.Leave, _
txtUnitPrice2.Leave, _
txtUnitPrice3.Leave, _
txtUnitPrice4.Leave, _
txtUnitPrice5.Leave, _
txtQuantity1.Leave, _
txtQuantity2.Leave, _
txtQuantity3.Leave, _
txtQuantity4.Leave, _
txtQuantity5.Leave, _
txtJobPrice1.Leave, _
txtJobPrice2.Leave, _
txtJobPrice3.Leave, _
txtJobPrice4.Leave, _
txtJobPrice5.Leave
Calculate()
End Sub
|
- Display the form
- From the Dialogs section of the Toolbox, click OpenFileDialog and click
the form
- Change its properties as follows:
Title: Open Existing Repair Order
DefaultExt: rpr
Filter: Repair Orders (*.rpr)|*.rpr|All Files|
Name: dlgOpen
- From the Dialogs section of the Toolbox, click SaveFileDialog and click
the form
- Change its properties as follows:
Title: Save Current Repair Order
DefaultExt: rpr
Filter: Repair Orders (*.rpr)|*.rpr|All Files|
Name: dlgSave
- On the form, click File and double-click Open Existing Order
- Implement the Click event as follows:
Private Sub mnuFileOpen_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles mnuFileOpen.Click
dlgOpen.InitialDirectory = "C:\College Park Auto Repair"
If dlgOpen.ShowDialog() = Windows.Forms.DialogResult.OK Then
Dim fleCPAR As FileStream = New FileStream(dlgOpen.FileName, _
FileMode.Open, FileAccess.Read, FileShare.Read)
Dim CPARReader As BinaryReader = New BinaryReader(fleCPAR)
Try
txtCustomerName.Text = CPARReader.ReadString()
txtAddress.Text = CPARReader.ReadString()
txtCity.Text = CPARReader.ReadString()
txtState.Text = CPARReader.ReadString()
txtZIPCode.Text = CPARReader.ReadString()
txtMake.Text = CPARReader.ReadString()
txtModel.Text = CPARReader.ReadString()
txtCarYear.Text = CPARReader.ReadString()
txtProblem.Text = CPARReader.ReadString()
txtPartName1.Text = CPARReader.ReadString()
txtUnitPrice1.Text = CPARReader.ReadString()
txtQuantity1.Text = CPARReader.ReadString()
txtSubTotal1.Text = CPARReader.ReadString()
txtPartName2.Text = CPARReader.ReadString()
txtUnitPrice2.Text = CPARReader.ReadString()
txtQuantity2.Text = CPARReader.ReadString()
txtSubTotal2.Text = CPARReader.ReadString()
txtPartName3.Text = CPARReader.ReadString()
txtUnitPrice3.Text = CPARReader.ReadString()
txtQuantity3.Text = CPARReader.ReadString()
txtSubTotal3.Text = CPARReader.ReadString()
txtPartName4.Text = CPARReader.ReadString()
txtUnitPrice4.Text = CPARReader.ReadString()
txtQuantity4.Text = CPARReader.ReadString()
txtSubTotal4.Text = CPARReader.ReadString()
txtPartName5.Text = CPARReader.ReadString()
txtUnitPrice5.Text = CPARReader.ReadString()
txtQuantity5.Text = CPARReader.ReadString()
txtSubTotal5.Text = CPARReader.ReadString()
txtJobDescription1.Text = CPARReader.ReadString()
txtJobPrice1.Text = CPARReader.ReadString()
txtJobDescription2.Text = CPARReader.ReadString()
txtJobPrice2.Text = CPARReader.ReadString()
txtJobDescription3.Text = CPARReader.ReadString()
txtJobPrice3.Text = CPARReader.ReadString()
txtJobDescription4.Text = CPARReader.ReadString()
txtJobPrice4.Text = CPARReader.ReadString()
txtJobDescription5.Text = CPARReader.ReadString()
txtJobPrice5.Text = CPARReader.ReadString()
txtTotalParts.Text = CPARReader.ReadString()
txtTotalLabor.Text = CPARReader.ReadString()
txtTaxRate.Text = CPARReader.ReadString()
txtTaxAmount.Text = CPARReader.ReadString()
txtTotalOrder.Text = CPARReader.ReadString()
txtRecommendations.Text = CPARReader.ReadString()
Finally
CPARReader.Close()
fleCPAR.Close()
End Try
End If
End Sub
|
- In the Class Name combo box, select mnuFileSave
- In the Method Name combo box, select Click and implement the event as
follows:
Private Sub mnuFileSave_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles mnuFileSave.Click
' Just in case, calculate the order now
Calculate()
' This number will be used to incrementally
' create the files by their names
Dim Incremental As Integer
' Check the above folder. If it exists, don't create it
' If it doesn't exist, then create it
Dim FolderName As String = "C:\College Park Auto Repair"
Dim FolderInformation As DirectoryInfo = _
Directory.CreateDirectory(FolderName)
' Get the list of files, if any, from the above folder
Dim CustomersOrders() As FileInfo = _
FolderInformation.GetFiles()
' If there is no file in the directory,
' then get ready to create the first file
If CustomersOrders.Length = 0 Then
' Get ready to display it in the Save dialog box
dlgSave.FileName = Incremental.ToString() & ".rpr"
Else ' If there was at least one file in the directory
' Get a reference to the last file
Dim LastCustomerOrder As FileInfo = _
CustomersOrders(CustomersOrders.Length - 1)
' Get the name of the last file without its extension
Dim FilenameWithoutExtension As String = _
Path.GetFileNameWithoutExtension(LastCustomerOrder.FullName)
' Increment the name of the file by 1
Incremental = CInt(FilenameWithoutExtension) + 1
' Get ready to display it in the Save dialog box
dlgSave.FileName = Incremental.ToString() & ".rpr"
End If
' For convenience, display the Save dialog box in the directory
' created above
dlgSave.InitialDirectory = FolderInformation.FullName
' Find out if the user clicked OK after displaying the Save dialog box
If dlgSave.ShowDialog() = Windows.Forms.DialogResult.OK Then
' Create a new file using the name of the Save dialog box
Dim fleCPAR As FileStream = New FileStream(dlgSave.FileName, _
FileMode.Create, FileAccess.Write, FileShare.Write)
Dim bnrCPAR As BinaryWriter = New BinaryWriter(fleCPAR)
Try
' Write each value in the file
bnrCPAR.Write(txtCustomerName.Text)
bnrCPAR.Write(txtAddress.Text)
bnrCPAR.Write(txtCity.Text)
bnrCPAR.Write(txtState.Text)
bnrCPAR.Write(txtZIPCode.Text)
bnrCPAR.Write(txtMake.Text)
bnrCPAR.Write(txtModel.Text)
bnrCPAR.Write(txtCarYear.Text)
bnrCPAR.Write(txtProblem.Text)
bnrCPAR.Write(txtPartName1.Text)
bnrCPAR.Write(txtUnitPrice1.Text)
bnrCPAR.Write(txtQuantity1.Text)
bnrCPAR.Write(txtSubTotal1.Text)
bnrCPAR.Write(txtPartName2.Text)
bnrCPAR.Write(txtUnitPrice2.Text)
bnrCPAR.Write(txtQuantity2.Text)
bnrCPAR.Write(txtSubTotal2.Text)
bnrCPAR.Write(txtPartName3.Text)
bnrCPAR.Write(txtUnitPrice3.Text)
bnrCPAR.Write(txtQuantity3.Text)
bnrCPAR.Write(txtSubTotal3.Text)
bnrCPAR.Write(txtPartName4.Text)
bnrCPAR.Write(txtUnitPrice4.Text)
bnrCPAR.Write(txtQuantity4.Text)
bnrCPAR.Write(txtSubTotal4.Text)
bnrCPAR.Write(txtPartName5.Text)
bnrCPAR.Write(txtUnitPrice5.Text)
bnrCPAR.Write(txtQuantity5.Text)
bnrCPAR.Write(txtSubTotal5.Text)
bnrCPAR.Write(txtJobDescription1.Text)
bnrCPAR.Write(txtJobPrice1.Text)
bnrCPAR.Write(txtJobDescription2.Text)
bnrCPAR.Write(txtJobPrice2.Text)
bnrCPAR.Write(txtJobDescription3.Text)
bnrCPAR.Write(txtJobPrice3.Text)
bnrCPAR.Write(txtJobDescription4.Text)
bnrCPAR.Write(txtJobPrice4.Text)
bnrCPAR.Write(txtJobDescription5.Text)
bnrCPAR.Write(txtJobPrice5.Text)
bnrCPAR.Write(txtTotalParts.Text)
bnrCPAR.Write(txtTotalLabor.Text)
bnrCPAR.Write(txtTaxRate.Text)
bnrCPAR.Write(txtTaxAmount.Text)
bnrCPAR.Write(txtTotalOrder.Text)
bnrCPAR.Write(txtRecommendations.Text)
mnuFileNew_Click(sender, e)
Finally
bnrCPAR.Close()
fleCPAR.Close()
End Try
End If
End Sub
|
- Execute the application to test it
- Create a new record. Here is an example:
- On the main menu of the form, click File -> Save Current Order...
- Accept the suggested name of the file and click Save
- Create another order, calculate it and save it
- Try opening a previously saved order
- Close the form and return to your programming environment
Introduction to the Print Dialog Box
|
|
One of the ways users print consists of sending the document
to the printer. To directly send a document to the printer, you need to make
sure that the control, whose value needs to be printed, supports printing. To
accommodate the users of your application, you can provide a menu item or a
button they would click. An example of such a button would be
.
To print, the user can click this button. With this type of printing, when the
user decides to print, the whole document would be printed "as is", in color if
the document is colored and if the printer supports colors. If there is more
than one printer, the computer would use what is known as the default printer.
If you want users to be able to configure or customize the
printing process, Microsoft Windows provides a common dialog box called Print.
Here is an example:
The Print dialog box allows a user to select a printer if
more than one is available. The user can decide either to print the whole
document, to print a range of pages, or to print a portion of the document that
was previously selected. The user can also decide on the number of copies to
print from the document, the range specified, or the selected portion.
Furthermore, the user can access the particular characteristics of the selected
printer and specify how the printer should perform the job. For example, if the
selected printer can print in color and the document is in color but the user
wants to print in black and white, he or she can specify this using the
Properties button.
To provide the users with the ability to customize printing
through the Print dialog box, you can add a PrintDialog object
from the Dialogs section of the Toolbox to your form. The PrintDialog control is
implemented through the PrintDialog class of the System.Windows.Forms
namespace. To programmatically create a PrintDialog object, you can declare a
variable of type PrinterDialog. Here is an example:
Imports System.Drawing
Imports System.Windows.Forms
Module Exercise
Public Class Starter
Inherits Form
Friend WithEvents btnPrint As Button
Dim components As System.ComponentModel.Container
Public Sub New()
InitializeComponent()
End Sub
Public Sub InitializeComponent()
btnPrint = New Button()
btnPrint.Location = New Point(12, 12)
btnPrint.Text = "&Print..."
Controls.Add(btnPrint)
End Sub
Private Sub PrintClicked(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnPrint.Click
Dim dlgPrint As PrintDialog = New PrintDialog
End Sub
End Class
Function Main() As Integer
Dim frmStart As Starter = New Starter
Application.Run(frmStart)
Return 0
End Function
End Module
To present the Print dialog box to the user, you can call
its ShowDialog() method.
Practical
Learning: Providing a Print Dialog Box
|
|
- From the Printing section of the Toolbox, click the PrintDialog button
and click the form
- While the print control is still selected, in the Properties window,
change its Name to dlgPrint
In order to print, the Print dialog box must be given a
document to print. This means that you must first prepare a document prior to
printing. To support this, the .NET Framework provides the PrintDocument
class that is defined in the System.Drawing.Printing namespace. This
class is represented in the Toolbox by the PrintDocument button
. Based on
this, to prepare a document for printing, you can either add a PrintDocument
object to your project or declare a variable of type PrintDocument. Here
is an example:
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Drawing.Printing
Module Exercise
Public Class Starter
Inherits Form
Friend WithEvents btnPrint As Button
Dim components As System.ComponentModel.Container
Public Sub New()
InitializeComponent()
End Sub
Public Sub InitializeComponent()
btnPrint = New Button()
btnPrint.Location = New Point(12, 12)
btnPrint.Text = "&Print..."
Controls.Add(btnPrint)
End Sub
Private Sub PrintClicked(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnPrint.Click
Dim dlgPrint As PrintDialog = New PrintDialog
Dim docPrint As PrintDocument = New PrintDocument
End Sub
End Class
Function Main() As Integer
Dim frmStart As Starter = New Starter
Application.Run(frmStart)
Return 0
End Function
End Module
After creating the document to print through a PrintDocument
object, you can associate it with a PrintDialog. To support this, the
PrintDialog class is equipped with the Document property. To specify
the object that would carry the printing, you can assign the PrintDocument
object to the PrintDialog.Document property. Here is an example:
Private Sub PrintClicked(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnPrint.Click
Dim dlgPrint As PrintDialog = New PrintDialog
Dim docPrint As PrintDocument = New PrintDocument
dlgPrint.Document = docPrint
dlgPrint.ShowDialog()
End Sub
A document to print can be made of only one or many pages.
Each page has a number of characteristics. The characteristics of a page are
controlled by the PrintDocument.PageSettings property which itself is
based on the PageSettings class. The PageSettings class is defined
in the System.Drawing.Printing namespace. This class holds the dimensions
of the page, the values of the margins applied on the page, the tray that would
supply the paper (since some printers have many trays), the printer resolution,
whether the page would be printed in color or black and white, whether the page
would be printed in Portrait or Landscape orientation, etc. If you don't want to
specify these characteristics, you can set the PrintDocument.PageSettings
property to DefaultPageSettings.
If you know the name of the document to be printed, you can
assign it to the PrintDocument.DocumentName property. Here is an example:
Private Sub PrintClicked(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnPrint.Click
Dim dlgPrint As PrintDialog = New PrintDialog
Dim docPrint As PrintDocument = New PrintDocument
docPrint.DocumentName = "Example.htm"
dlgPrint.Document = docPrint
dlgPrint.ShowDialog()
End Sub
To actually print the document, you can call the
PrintDocument.Print() method. Its syntax is:
Public Sub Print
Practical
Learning: Providing the Document to Print
|
|
- From the Printing section of the Toolbox, click the PrintDocument button
and click the form
- While the print document control is still selected, in the Properties
window, change its name to docPrint
- Under the form, click dlgPrint
- In the Properties window, click Document and select docPrint
- Right-click the form and click View Code
Events Related to Printing
|
|
When the PrintDocument.Print() method is called, the
printing process would start by firing the BeginPrint event but this
event occurs before the first page is printed. The BeginPrint event is of
type PrintEventArgs which does not hold any particular information,
especially for the BeginPrint event. This event allows you to take some
early actions, if necessary, before the printer receives the job.
Once the printer is ready, the application would then need
to know what needs to be printed on the paper. At this time, the PrintPage
event is fired. The PrintPage event is of type PrintPageEventArgs.
The PrintPageEventArgs class allows you to fully customize the page of
the document to be printed. For example, it is equipped with a Graphics
property that allows you to "draw" anything you want on the paper. The
PrintPageEventArgs class also allows you to get the location and dimensions
of the area to be printed. This is represented by the PageBounds
property, which produces a Rectangle object.
Once the PrintDocument object is ready, you must pass it to
the Print dialog box. To do that, assign the name of the PrintDocument variable
to the PrintDialog.Document property.
Practical
Learning: Printing a Document
|
|
- In the Class Name combo box, select docPrint
- In the Method Name combo box, select PrintPage and implement the event
as follows:
Private Sub docPrint_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles docPrint.PrintPage
e.Graphics.DrawLine(New Pen(Color.Black, 2), _
60, 90, 680, 90)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
60, 93, 680, 93)
Dim strDisplay As String = "College Park Auto Repair"
Dim fntString As Font = New Font("Times New Roman", _
28, FontStyle.Bold)
e.Graphics.DrawString(strDisplay, fntString, _
Brushes.Black, 160, 100)
strDisplay = "Customer Car Repair Order"
fntString = New Font("Times New Roman", 18, FontStyle.Bold)
e.Graphics.DrawString(strDisplay, fntString, _
Brushes.Black, 220, 150)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 60, 184, 680, 184)
e.Graphics.DrawLine(New Pen(Color.Black, 2), 60, 187, 680, 187)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Order Identification", fntString, _
Brushes.Black, 80, 200)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 250, 640, 250)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Customer Name:", fntString, _
Brushes.Black, 100, 260)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtCustomerName.Text, fntString, _
Brushes.Black, 260, 260)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 280, 640, 280)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Address:", fntString, _
Brushes.Black, 100, 290)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtAddress.Text, fntString, _
Brushes.Black, 260, 290)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 310, 640, 310)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
Dim Address As String = txtCity.Text.ToString() & ", " & _
txtState.Text & " " & txtZIPCode.Text
e.Graphics.DrawString(Address, fntString, Brushes.Black, 260, 320)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 340, 640, 340)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Car:", fntString, Brushes.Black, 100, 350)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
Dim Car As String = txtMake.Text & ", " & _
txtModel.Text & ", " & txtCarYear.Text
e.Graphics.DrawString(Car, fntString, Brushes.Black, 260, 350)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 370, 640, 370)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Problem Description:", _
fntString, Brushes.Black, 100, 380)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtProblem.Text, fntString, Brushes.Black, _
New RectangleF(260, 380, 420, 380))
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 400, 640, 400)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Parts Used", fntString, _
Brushes.Black, 80, 430)
e.Graphics.DrawLine(New Pen(Color.Black, 2), 80, 450, 680, 450)
e.Graphics.DrawString("Parts Name", fntString, _
Brushes.Black, 100, 460)
e.Graphics.DrawString("Unit Price", fntString, _
Brushes.Black, 420, 460)
e.Graphics.DrawString("Qty", fntString, Brushes.Black, 520, 460)
e.Graphics.DrawString("Sub-Total", fntString, _
Brushes.Black, 562, 460)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 480, 640, 480)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
Dim fmtString As StringFormat = New StringFormat()
fmtString.Alignment = StringAlignment.Far
e.Graphics.DrawString(txtPartName1.Text, fntString, _
Brushes.Black, 100, 490)
e.Graphics.DrawString(txtUnitPrice1.Text, fntString, _
Brushes.Black, 480, 490, fmtString)
e.Graphics.DrawString(txtQuantity1.Text, fntString, _
Brushes.Black, 540, 490, fmtString)
e.Graphics.DrawString(txtSubTotal1.Text, fntString, _
Brushes.Black, 630, 490, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 510, 640, 510)
e.Graphics.DrawString(txtPartName2.Text, fntString, _
Brushes.Black, 100, 520)
e.Graphics.DrawString(txtUnitPrice2.Text, fntString, _
Brushes.Black, 480, 520, fmtString)
e.Graphics.DrawString(txtQuantity2.Text, fntString, _
Brushes.Black, 540, 520, fmtString)
e.Graphics.DrawString(txtSubTotal2.Text, fntString, _
Brushes.Black, 630, 520, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 540, 640, 540)
e.Graphics.DrawString(txtPartName3.Text, fntString, _
Brushes.Black, 100, 550)
e.Graphics.DrawString(txtUnitPrice3.Text, fntString, _
Brushes.Black, 480, 550, fmtString)
e.Graphics.DrawString(txtQuantity3.Text, fntString, _
Brushes.Black, 540, 550, fmtString)
e.Graphics.DrawString(txtSubTotal3.Text, fntString, _
Brushes.Black, 630, 550, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 570, 640, 570)
e.Graphics.DrawString(txtPartName4.Text, fntString, _
Brushes.Black, 100, 580)
e.Graphics.DrawString(txtUnitPrice4.Text, fntString, _
Brushes.Black, 480, 580, fmtString)
e.Graphics.DrawString(txtQuantity4.Text, fntString, _
Brushes.Black, 540, 580, fmtString)
e.Graphics.DrawString(txtSubTotal4.Text, fntString, _
Brushes.Black, 630, 580, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 600, 640, 600)
e.Graphics.DrawString(txtPartName5.Text, fntString, _
Brushes.Black, 100, 610)
e.Graphics.DrawString(txtUnitPrice5.Text, fntString, _
Brushes.Black, 480, 610, fmtString)
e.Graphics.DrawString(txtQuantity5.Text, fntString, _
Brushes.Black, 540, 610, fmtString)
e.Graphics.DrawString(txtSubTotal5.Text, fntString, _
Brushes.Black, 630, 610, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 630, 640, 630)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Jobs Performed", fntString, _
Brushes.Black, 80, 650)
e.Graphics.DrawLine(New Pen(Color.Black, 2), 80, 670, 680, 670)
e.Graphics.DrawString("Job Name", fntString, _
Brushes.Black, 100, 680)
e.Graphics.DrawString("Price", fntString, Brushes.Black, 562, 680)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 700, 640, 700)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtJobDescription1.Text, fntString, _
Brushes.Black, 100, 710)
e.Graphics.DrawString(txtJobPrice1.Text, fntString, _
Brushes.Black, 600, 710, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 730, 640, 730)
e.Graphics.DrawString(txtJobDescription2.Text, fntString, _
Brushes.Black, 100, 740)
e.Graphics.DrawString(txtJobPrice2.Text, fntString, _
Brushes.Black, 600, 740, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 760, 640, 760)
e.Graphics.DrawString(txtJobDescription3.Text, fntString, _
Brushes.Black, 100, 770)
e.Graphics.DrawString(txtJobPrice3.Text, fntString, _
Brushes.Black, 600, 770, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 790, 640, 790)
e.Graphics.DrawString(txtJobDescription4.Text, fntString, _
Brushes.Black, 100, 800)
e.Graphics.DrawString(txtJobPrice4.Text, fntString, _
Brushes.Black, 600, 800, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 820, 640, 820)
e.Graphics.DrawString(txtJobDescription5.Text, fntString, _
Brushes.Black, 100, 830)
e.Graphics.DrawString(txtJobPrice5.Text, fntString, _
Brushes.Black, 600, 830, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 850, 640, 850)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Order Summary", fntString, _
Brushes.Black, 80, 870)
e.Graphics.DrawLine(New Pen(Color.Black, 2), 80, 890, 680, 890)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Total Parts:", fntString, _
Brushes.Black, 500, 900)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtTotalParts.Text, fntString, _
Brushes.Black, 640, 900, fmtString)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Total Labor:", fntString, _
Brushes.Black, 500, 920)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtTotalLabor.Text, fntString, _
Brushes.Black, 640, 920, fmtString)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Tax Rate:", fntString, _
Brushes.Black, 500, 940)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtTaxRate.Text, fntString, _
Brushes.Black, 640, 940, fmtString)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Tax Amount:", fntString, _
Brushes.Black, 500, 960)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtTaxAmount.Text, fntString, _
Brushes.Black, 640, 960, fmtString)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Repair Total:", fntString, _
Brushes.Black, 500, 980)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtTotalOrder.Text, fntString, _
Brushes.Black, 640, 980, fmtString)
fntString = New Font("Times New Roman", 10, FontStyle.Bold)
e.Graphics.DrawString("Recommendations:", fntString, _
Brushes.Black, 100, 900)
fntString = New Font("Times New Roman", 10, FontStyle.Regular)
e.Graphics.DrawString(txtRecommendations.Text, _
fntString, Brushes.Black, _
New RectangleF(100, 920, 350, 280))
End Sub
|
- In the Class Name combo box, select mnuFilePrint
- In the Method Name combo box, select Click and implement the event as
follows:
Private Sub mnuFilePrint_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles mnuFilePrint.Click
If dlgPrint.ShowDialog() = Windows.Forms.DialogResult.OK Then
docPrint.Print()
End If
End Sub
|
- Execute the application and open one of the previously saved orders
- On the main menu of the form, click File -> Print and click OK
- After using it, close the form and return to your programming
environment
In the above example, we saw a somewhat simplistic way of
making the Print dialog box available to the user. This dialog box offers many
options defined as the Printer Settings. To support the various options of a
Print dialog box, the PrintDialog class is equipped with a property
called PrinterSettings, which itself is defined from the
PrinterSettings class, which holds all possible characteristics of a
printer.
The first option presented to the user is the name of the
printer to be used. Because there can be many printers available to the user,
the printers are presented as a combo box:
The available printers may also be presented as a list view:
The Name combo box in the Printer section or the Select
Printer list view allows the user to select the printer that will handle the
job. If you are writing a universal application and cannot predict what
printer(s) the user would have, you would not be concerned with this
characteristic. If you are writing an application for a special company or you
are creating a particular application and you know for sure what printer should
be used to print the current document, then you can specify the printer to use.
To do this, assign the (exact) name of the printer to the
PrinterSettings.PrinterName property. On the other hand, if for some reason
you want to know what printer the user selected to print the document, you can
get the value of this PrinterName property.
Under the Name combo box, the labels provide the status of
the selected printer (whether it is ready or not), the type of printer (such as
its manufacturer), its location (such as where in the building the printer is
located; the person who installed the printer or may have provided this
printer), and an optional comment (this information is created by the person who
installed the printer or it can be changed in the printer's properties).
After selecting the printer, the user can access the
properties of that particular printer. Different printers support different
options. To configure the printed paper based on the selected printer, the user
can click either Properties or Preferences. This opens the Document Properties
or the Printing Preferences dialog box. The content of this dialog box (highly)
depends on the printer that was selected but some characteristics are shared
among printers.
On the lower-right side of the Printer section or of the
Select Printer section, there is a check box labeled Print To File. When this
check box is checked, the document is transformed into a file rather than being
printed. In this case, if the user clicks OK or Print, a dialog box would come
up, asking the user to specify the path and a name for the new file that will be
created. The appearance of that dialog box depends. Here is an example:
If you want the Print To File check box to be checked, set
the PrinterSettings.PrintFoFile Boolean property to true. Its default
value is false, which lets the user decide whether to check it or not.
After selecting the printer and deciding whether to
physically print or to only create a printed file, the user can click OK.
If the document is made of only one page, it would be
printed. If the document contains more than one page, the user may want to print
only one page, a range of pages, or all pages. The user can also select a
section in the document and print only that section. This decision is made using
the Page Range section. This section provides four radio buttons. The first
radio button labeled All is selected by default and allows the user to print the
whole document. By default, the second radio button is disabled. If the user had
selected a section of the document to print, then the second radio button,
labeled Selection would be enabled:
This allows the user to still specify whether to print the
whole document or only the section that was selected. If the document contains
more than one page, the user can navigate to a particular page and decide to
print only that page using the Current Page radio button. Again, if the document
contains more than one page, the user can specify a range of pages to print. All
these options are usually left up to the user. On the other hand, if you want to
specify the range of pages to print, you can use the PrinterSettings.FromPage
and the ToPage properties. If you want to specify the limits of ranges
allowed to the user, use the MinimumPage and the MaximumPage
properties.
On the right side of the Page Range section, a spin button
allows the user to specify the number of copies to make when printing. If you
want to specify this number by default, assign the desired value to the
Copies property. If the user (or you) set this number to a value higher than
1, then the printed papers can be collated or not. This is specified using the
Collate check box. If you want to programmatically collate the pages or not,
change the Boolean value of the Collate property.
|
|