|
Practical Learning: Introducing XML-Based Applications
|
|
- Start Microsoft Visual Studio .NET and create a Windows Forms
Application named CollegeParkAutoRepair1
- In the Solution Explorer, right-click Form1.vb and click Rename
- Type CPAR.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 |
Shortcut |
| &File |
mnuFile |
&New Repair Order |
mnuFileNew |
Ctrl+N |
| |
|
&Open Existing Order... |
mnuFileOpen |
Ctrl+O |
| |
|
&Save Current Order |
mnuFileSave |
Ctrl+S |
| |
|
Separator |
|
|
| |
|
&Print... |
mnuFilePrint |
Ctrl+P |
| |
|
Print Pre&view... |
mnuFilePrintPreview |
|
| |
|
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
- Just above the Public Class CPAR line, import the following namespaces:
Imports System.IO
Imports System.Xml
Imports System.Text
Public Class CPAR
End Class
|
- Under the Public Class CPAR line, create a sub-procedure named Calculate as follows:
Imports System.IO
Imports System.Xml
Public Class CPAR
Private Sub Calculate()
Dim UnitPricePart1 As Double, UnitPricePart2 As Double
Dim UnitPricePart3 As Double, UnitPricePart4 As Double
Dim UnitPricePart5 As Double
Dim SubTotalPart1 As Double, SubTotalPart2 As Double
Dim SubTotalPart3 As Double, SubTotalPart4 As Double
Dim SubTotalPart5 As Double, TotalParts As Double
Dim QuantityPart1 As Integer, QuantityPart2 As Integer
Dim QuantityPart3 As Integer, QuantityPart4 As Integer
Dim QuantityPart5 As Integer
Dim Job1Price As Double, Job2Price As Double
Dim Job3Price As Double, Job4Price As Double
Dim Job5Price As Double, TotalLabor As Double
Dim TaxRate As Double, TaxAmount As Double
Dim TotalOrder 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"
UnitPricePart1 = 0.0
Else
Try
UnitPricePart1 = CDbl(txtUnitPrice1.Text)
Catch Exc As FormatException
MsgBox("Invalid Unit Price")
txtUnitPrice1.Text = "0.00"
txtUnitPrice1.Focus()
End Try
Try
QuantityPart1 = CInt(txtQuantity1.Text)
Catch Exc As FormatException
MsgBox("Invalid Quantity")
txtQuantity1.Text = "0"
txtQuantity1.Focus()
End Try
End If
If txtPartName2.Text = "" Then
txtUnitPrice2.Text = "0.00"
txtQuantity2.Text = "0"
txtSubTotal2.Text = "0.00"
UnitPricePart2 = 0.0
Else
Try
UnitPricePart2 = CDbl(txtUnitPrice2.Text)
Catch Exc As FormatException
MsgBox("Invalid Unit Price")
txtUnitPrice2.Text = "0.00"
txtUnitPrice2.Focus()
End Try
Try
QuantityPart2 = CInt(txtQuantity2.Text)
Catch Exc As FormatException
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"
UnitPricePart3 = 0.0
Else
Try
UnitPricePart3 = CDbl(txtUnitPrice3.Text)
Catch Exc As FormatException
MsgBox("Invalid Unit Price")
txtUnitPrice3.Text = "0.00"
txtUnitPrice3.Focus()
End Try
Try
QuantityPart3 = CInt(txtQuantity3.Text)
Catch Exc As FormatException
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"
UnitPricePart4 = 0.0
Else
Try
UnitPricePart4 = CDbl(txtUnitPrice4.Text)
Catch Exc As FormatException
MsgBox("Invalid Unit Price")
txtUnitPrice4.Text = "0.00"
txtUnitPrice4.Focus()
End Try
Try
QuantityPart4 = CInt(txtQuantity4.Text)
Catch Exc As FormatException
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"
UnitPricePart5 = 0.0
Else
Try
UnitPricePart5 = CDbl(txtUnitPrice5.Text)
Catch Exc As FormatException
MsgBox("Invalid Unit Price")
txtUnitPrice5.Text = "0.00"
txtUnitPrice5.Focus()
End Try
Try
QuantityPart5 = CInt(txtQuantity5.Text)
Catch Exc As FormatException
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 Exc As FormatException
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 Exc As FormatException
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 Exc As FormatException
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 Exc As FormatException
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 Exc As FormatException
MsgBox("Invalid Job Price")
txtJobPrice5.Text = "0.00"
txtJobPrice5.Focus()
End Try
End If
SubTotalPart1 = UnitPricePart1 * QuantityPart1
SubTotalPart2 = UnitPricePart2 * QuantityPart2
SubTotalPart3 = UnitPricePart3 * QuantityPart3
SubTotalPart4 = UnitPricePart4 * QuantityPart4
SubTotalPart5 = UnitPricePart5 * QuantityPart5
txtSubTotal1.Text = FormatNumber(SubTotalPart1)
txtSubTotal2.Text = FormatNumber(SubTotalPart2)
txtSubTotal3.Text = FormatNumber(SubTotalPart3)
txtSubTotal4.Text = FormatNumber(SubTotalPart4)
txtSubTotal5.Text = FormatNumber(SubTotalPart5)
TotalParts = SubTotalPart1 + SubTotalPart2 + _
SubTotalPart3 + SubTotalPart4 + SubTotalPart5
TotalLabor = Job1Price + Job2Price + Job3Price + _
Job4Price + Job5Price
Try
TaxRate = CDbl(txtTaxRate.Text)
Catch Exc As FormatException
MsgBox("Invalid Tax Rate")
txtTaxRate.Text = "7.75"
txtTaxRate.Focus()
End Try
Dim totalPartsAndLabor As Double = 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 eventand
click the first text box under Unit Price
- In the Properties window, click the Events button and double-click
Leave
- Call the Calculate() method as follows:
Private Sub ControlsLeave(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, _
txtTaxRate.Leave
Calculate()
End Sub
|
- Return to the form
- 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
- Right-click the form and click View Code
- 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 System.Drawing.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 System.Drawing.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 System.Drawing.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 System.Drawing.Font("Times New Roman", _
10, FontStyle.Bold)
e.Graphics.DrawString("Customer Name:", fntString, _
Brushes.Black, 100, 260)
fntString = New System.Drawing.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 strAddress As String = txtCity.Text.ToString()& ", " & _
txtState.Text(+" " & txtZIPCode.Text)
e.Graphics.DrawString(strAddress, 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 strCar As String = txtMake.Text & ", " & txtModel.Text & _
", " & txtCarYear.Text
e.Graphics.DrawString(strCar, 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 System.Drawing.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 System.Drawing.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 System.Drawing.Font("Times New Roman", _
10, FontStyle.Bold)
e.Graphics.DrawString("Total Parts:", fntString, _
Brushes.Black, 500, 900)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Regular)
e.Graphics.DrawString(txtTotalParts.Text, fntString, _
Brushes.Black, 640, 900, fmtString)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Bold)
e.Graphics.DrawString("Total Labor:", fntString, _
Brushes.Black, 500, 920)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Regular)
e.Graphics.DrawString(txtTotalLabor.Text, fntString, _
Brushes.Black, 640, 920, fmtString)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Bold)
e.Graphics.DrawString("Tax Rate:", fntString, _
Brushes.Black, 500, 940)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Regular)
e.Graphics.DrawString(txtTaxRate.Text, fntString, _
Brushes.Black, 640, 940, fmtString)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Bold)
e.Graphics.DrawString("Tax Amount:", fntString, _
Brushes.Black, 500, 960)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Regular)
e.Graphics.DrawString(txtTaxAmount.Text, fntString, _
Brushes.Black, 640, 960, fmtString)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Bold)
e.Graphics.DrawString("Repair Total:", fntString, _
Brushes.Black, 500, 980)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Regular)
e.Graphics.DrawString(txtTotalOrder.Text, fntString, _
Brushes.Black, 640, 980, fmtString)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Bold)
e.Graphics.DrawString("Recommendations:", fntString, _
Brushes.Black, 100, 900)
fntString = New System.Drawing.Font("Times New Roman", _
10, FontStyle.Regular)
e.Graphics.DrawString(txtRecommendations.Text, fntString, _
Brushes.Black, New RectangleF(100, 920, 350, 280))
End Sub
|
- Return to the form
- 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
- Click Document and select docPrint
- Right-click the form and click View Code
- 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() = DialogResult.OK Then
docPrint.Print()
End If
End Sub
|
- Return to the form
- From the Printing section of the Toolbox, click PrintPreviewDialog and
click the form
- In the Properties window, change its (Name) to dlgPrintPreview
- Still in the Properties windows, set its Document property to docPrint
- Right-click the form and click View Code
- In the Class Name combo box, select mnuFilePrintPreview
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub mnuFilePrintPreview_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles mnuFilePrintPreview.Click
dlgPrintPreview.ShowDialog()
End Sub
|
- Save the file
- Return to the form
|
The XML Text Writer Fundamentals |
|
Besides the XmlDocument and the derived classes of XmlNode,
the .NET Framework provides the XmlTextWriter class, which is derived
from XmlWriter. The XmlTextWriter class works in a top-down
approach to create, or deal with, the contents of an XML file. This class writes
an XML node and moves down without referring back:

This means that, once you have created a node using the XmlTextWriter, you have no way of referring back to it.
To use an XmlTextWriter
object, first declare a variable of the type of this class and initialize it using
one of its three constructors.
If you had already created a Stream-based object such
as declaring a variable of type FileStream but you did not define an encoding
scheme, you can pass the Stream-based object to an XmlTextWriter but you
must take this time to specify the encoding scheme. To support this concept, the
XmlTextWriter provides a constructor with the following syntax:
Public Sub New(w As Stream, encoding As Encoding)
The first argument of this constructor can be a Stream-based
variable. The second argument specifies the encoding scheme that would be
applied. The default is UTF-8. Based on this, if you want to use the UTF-8
encoding scheme, you can pass it or pass the argument as 0. If you want to use
another encoding scheme, pass it to the constructor.
To work from scratch, that is, to initiate a file with
manually-created nodes, you can pass the desired name of the file to the XmlTextWriter
constructor using the following syntax:
Public Sub New(filename As String, encoding As Encoding)
In this case, you must provide the name of, or path to, the
file, whose content you are creating, as the first argument. You must pass the
desired encoding scheme as the second argument. Here is an example:
Imports System.Xml
Imports System.IO
Imports System.Text
Public Class Exercise
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
End Sub
End Class
Eventually, when you have finished using the XmlTextWriter
object, you must free the memory it was using by calling the XmlTextWriter.Flush()
method. To release the resources that the object was using, call the XmlTextWriter.Close()
method. Here is an example:
Imports System.Xml
Imports System.IO
Imports System.Text
Public Class Exercise
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.Flush()
Writer.Close()
End Sub
End Class
|
Creating the XML Declaration |
|
Declaring an XmlTextWriter variable allows you to
indicate that you intend to create a new XML file. With the variable ready, you
can start writing the file's content. As mentioned in previous lessons, an XML
file starts at the top with an XML declaration. To create this declaration, you
can call the XmlTextWriter.WriteStartDocument() method. This method is
overloaded with two versions. The syntax of one of them is:
Public Overrides Sub WriteStartDocument
This method creates a declaration, sets the XML version to
1.0, and includes the encoding scheme you specified in the constructor. Here is
an example:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.WriteStartDocument()
Writer.Flush()
Writer.Close()
End Sub
To end an XML file, you must close its declaration. This is
done by calling the XmlTextWriter.WriteEndDocument() method. Its syntax
is:
Public Overrides Sub WriteEndDocument
This method indicates that the XML file has ended and allows
the compiler to stop reading it down. This would be done as follows:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.WriteStartDocument()
Writer.WriteEndDocument()
Writer.Flush()
Writer.Close()
End Sub
|
Creating the Root Element |
|
Between the XML declaration and the end of the file,
that is, between the call to XmlTextWriter.WriteStartDocument() and the
call to XmlTextWriter.WriteEndDocument() methods, you can create the
necessary nodes of the file. As reviewed in previous lessons, the most
regular node of an XML file is the element. To create an element, the XmlTextWriter
class provides the WriteStartElement() method that is overloaded with
various versions. One of the versions of this method, and that is inherited from
the XmlWriter class, uses the following syntax:
Public Sub WriteStartElement(localName As String)
This method takes as argument the name of the element that
will be created. Here is an example:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.WriteStartDocument()
Writer.WriteStartElement("students")
Writer.WriteEndDocument()
Writer.Flush()
Writer.Close()
End Sub
As you may know from XML, every element must be closed. To
close an XML element, call the XmlTextWriter.WriteEndElement() method.
Its syntax is:
Public Overrides Sub WriteEndElement
When calling this method, always make sure that you know the
element it is closing, which must correspond to an appropriate previous call
to a WriteStartElement() method. Here is an example:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.WriteStartDocument()
Writer.WriteStartElement("students")
Writer.WriteEndElement()
Writer.WriteEndDocument()
Writer.Flush()
Writer.Close()
End Sub
This would produce:
As you can see from the result, a single or the first call
to the WriteStartElement() method creates the root element that is
required for every XML file. This means that, after this (first) call but before
its corresponding WriteEndElement() call, you can create the necessary
nodes that you want to include as part of the file.
|
Creating the Child Elements of the Root |
|
To help you create child elements of the root node, you can keep
calling the XmlTextWriter.WriteStartElement() method as necessary and
appropriately closing it. Here is an example:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.WriteStartDocument()
Writer.WriteStartElement("students")
Writer.WriteStartElement("student")
Writer.WriteEndElement()
Writer.WriteEndElement()
Writer.WriteEndDocument()
Writer.Flush()
Writer.Close()
End Sub
If you simply call this method as done above, the element
would be empty. Based on this, the above code would produce:
If you want the element to have a value, call the XmlTextWriter.WriteString()
method. Its syntax is:
Public Overrides Sub WriteString(text As String)
This method must immediately follow the call to
WriteStartElement() that creates a new element. It takes as argument the value
for the immediately previously defined element. Here is an example:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.WriteStartDocument()
Writer.WriteStartElement("students")
Writer.WriteStartElement("student")
Writer.WriteString("Raymond Sanson")
Writer.WriteEndElement()
Writer.WriteEndElement()
Writer.WriteEndDocument()
Writer.Flush()
Writer.Close()
End Sub
This would produce:
If you call the XmlTextWriter.WriteStartElement()
method and you want the element to have a value, remember to call the XmlTextWriter.WriteString()
method, and then call the XmlTextWriter.WriteEndElement() method. An
alternative is to call the XmlWriter.WriteElementString() method that
comes in two versions. The syntax of one of these versions is:
Public Sub WriteElementString(localName As String, _
value As String)
The first argument to this method is the name of the element
that will be created. The second argument is the value of the element. This
method creates and closes its element. Here is an example:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = _
New XmlTextWriter("students.xml", Encoding.UTF8)
Writer.WriteStartDocument()
Writer.WriteStartElement("students")
Writer.WriteStartElement("student")
Writer.WriteString("Raymond Sanson")
Writer.WriteEndElement()
Writer.WriteElementString("student", "Brigitte Arano")
Writer.WriteEndElement()
Writer.WriteEndDocument()
Writer.Flush()
Writer.Close()
End Sub
This would produce:
In the same way, you can create the necessary elements and
their child elements as necessary. Be careful to appropriately start an element
and remember to close it if necessary. Here are examples:
Private Sub btnDocument_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnDocument.Click
Dim Writer As XmlTextWriter = New XmlTextWriter("students.xml", _
Encoding.UTF8)
Writer.WriteStartDocument()
' Create the root element named students
Writer.WriteStartElement("students")
' Start a child element named student
Writer.WriteStartElement("student")
' Create a number for the student
Writer.WriteStartElement("studentnumber")
Writer.WriteString("740597")
Writer.WriteEndElement()
' Create a name for the student
Writer.WriteStartElement("fullname")
Writer.WriteString("Christie Aronson")
Writer.WriteEndElement()
' Create a date of birth for the student
Writer.WriteStartElement("dateofbirth")
Writer.WriteString("02/16/1988")
Writer.WriteEndElement()
' Create a Format child element to the Video element
Writer.WriteStartElement("Gender")
Writer.WriteString("Female")
Writer.WriteEndElement()
' Close the student node
Writer.WriteEndElement()
' Start a new student element
Writer.WriteStartElement("student")
' Create the child elements of the new student element
Writer.WriteElementString("studentnumber", "249575")
Writer.WriteElementString("fullname", "Julius Raymonds")
Writer.WriteElementString("dateofbirth", "12/07/1992")
Writer.WriteElementString("Gender", "Male")
' The current student node
Writer.WriteEndElement()
' Close the root element
Writer.WriteEndElement()
Writer.WriteEndDocument()
Writer.Flush()
Writer.Close()
End Sub
This would produce:
|
Practical Learning: Creating the Elements of an XML File
|
|
- From the Dialogs section of the Toolbox,
click SaveFileDialog and click the form
- Change its properties as follows:
Title: Save Current Repair Order
DefaultExt: xml
Filter: Repair Orders (*.xml)|*.xml|All Files|
Name: dlgSave
- Right-click the form and click View Code
- 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 iFilename As Integer
Dim Filename As String
' If this directory doesn't exist, create it
' Also, get a reference to this directory for later use
Dim FolderName As String = "C:\College Park Auto Repair"
Dim Folder As DirectoryInfo = Directory.CreateDirectory(FolderName)
' Get the list of files, if any, from the above folder
Dim ListOfFiles() As FileInfo = Folder.GetFiles("*.xml")
' If there is no XML file in the directory,
' then get ready to create the first file
If ListOfFiles.Length = 0 Then
' Create the name of the (initial) file
iFilename = 1000
Else ' If there was at least one file in the directory
' Get a reference to the last file
Dim fleLast As FileInfo = ListOfFiles(ListOfFiles.Length - 1)
' Get the name of the last file without its extension
Dim fwe As String = Path.GetFileNameWithoutExtension(fleLast.FullName)
' Get the name of the file
iFilename = CInt(fwe)
End If
Filename = FolderName& """" & cstr(iFilename + 1)& ".xml"
' Get ready to display it in the Save dialog box
dlgSave.FileName = Filename
' Find out if the user clicked OK after displaying the Save dialog box
If dlgSave.ShowDialog() = DialogResult.OK Then
Dim wtrRepairOrder As XmlTextWriter = New XmlTextWriter(Filename, _
Encoding.UTF8)
' Create the contents of the XML file
' Notice that we are not making an attempt to check the values
wtrRepairOrder.WriteStartDocument()
wtrRepairOrder.WriteStartElement("RepairOrders")
wtrRepairOrder.WriteStartElement("Invoice")
wtrRepairOrder.WriteElementString("CustomerName", txtCustomerName.Text)
wtrRepairOrder.WriteElementString("Addres", txtAddress.Text)
wtrRepairOrder.WriteElementString("City", txtCity.Text)
wtrRepairOrder.WriteElementString("State", txtState.Text)
wtrRepairOrder.WriteElementString("ZIPCode", txtZIPCode.Text)
wtrRepairOrder.WriteElementString("Make", txtMake.Text)
wtrRepairOrder.WriteElementString("Model", txtModel.Text)
wtrRepairOrder.WriteElementString("CarYear", txtCarYear.Text)
wtrRepairOrder.WriteElementString("ProbDescription", txtProblem.Text)
wtrRepairOrder.WriteElementString("PartName1", txtPartName1.Text)
wtrRepairOrder.WriteElementString("UnitPrice1", txtUnitPrice1.Text)
wtrRepairOrder.WriteElementString("Quantity1", txtQuantity1.Text)
wtrRepairOrder.WriteElementString("SubTotal1", txtSubTotal1.Text)
wtrRepairOrder.WriteElementString("PartName2", txtPartName2.Text)
wtrRepairOrder.WriteElementString("UnitPrice2", txtUnitPrice2.Text)
wtrRepairOrder.WriteElementString("Quantity2", txtQuantity2.Text)
wtrRepairOrder.WriteElementString("SubTotal2", txtSubTotal2.Text)
wtrRepairOrder.WriteElementString("PartName3", txtPartName3.Text)
wtrRepairOrder.WriteElementString("UnitPrice3", txtUnitPrice3.Text)
wtrRepairOrder.WriteElementString("Quantity3", txtQuantity3.Text)
wtrRepairOrder.WriteElementString("SubTotal3", txtSubTotal3.Text)
wtrRepairOrder.WriteElementString("PartName4", txtPartName4.Text)
wtrRepairOrder.WriteElementString("UnitPrice4", txtUnitPrice4.Text)
wtrRepairOrder.WriteElementString("Quantity4", txtQuantity4.Text)
wtrRepairOrder.WriteElementString("SubTotal4", txtSubTotal4.Text)
wtrRepairOrder.WriteElementString("PartName5", txtPartName5.Text)
wtrRepairOrder.WriteElementString("UnitPrice5", txtUnitPrice5.Text)
wtrRepairOrder.WriteElementString("Quantity5", txtQuantity5.Text)
wtrRepairOrder.WriteElementString("SubTotal5", txtSubTotal5.Text)
wtrRepairOrder.WriteElementString("JobDescription1", _
txtJobDescription1.Text)
wtrRepairOrder.WriteElementString("JobPrice1", txtJobPrice1.Text)
wtrRepairOrder.WriteElementString("JobDescription2", _
txtJobDescription2.Text)
wtrRepairOrder.WriteElementString("JobPrice2", txtJobPrice2.Text)
wtrRepairOrder.WriteElementString("JobDescription3", _
txtJobDescription3.Text)
wtrRepairOrder.WriteElementString("JobPrice3", txtJobPrice3.Text)
wtrRepairOrder.WriteElementString("JobDescription4", _
txtJobDescription4.Text)
wtrRepairOrder.WriteElementString("JobPrice4", txtJobPrice4.Text)
wtrRepairOrder.WriteElementString("JobDescription5", _
txtJobDescription5.Text)
wtrRepairOrder.WriteElementString("JobPrice5", txtJobPrice5.Text)
wtrRepairOrder.WriteElementString("TotalPart", txtTotalParts.Text)
wtrRepairOrder.WriteElementString("TotalLabor", txtTotalLabor.Text)
wtrRepairOrder.WriteElementString("TaxRate", txtTaxRate.Text)
wtrRepairOrder.WriteElementString("TaxAmount", txtTaxAmount.Text)
wtrRepairOrder.WriteElementString("TotalOrder", txtTotalOrder.Text)
wtrRepairOrder.WriteElementString("Recommendation", _
txtRecommendations.Text)
wtrRepairOrder.WriteEndElement()
wtrRepairOrder.WriteEndElement()
wtrRepairOrder.WriteEndDocument()
wtrRepairOrder.Flush()
wtrRepairOrder.Close()
End If
End Sub
|
- Execute the application to test it
- Create a new record and click Calculate Order:

- Click File -> Save and OK to Save the file
- Click File -> New Repair Order
- Create another repair order:

- Save it
- Close the form and return to your programming environment
If you are creating a text-intensive document and you want to
save it as an XML file, for example if you have declared a variable of type TextWriter-derived
class (such as StringWriter or StreamWriter), you can use that
file to initialize the XmlTextWriter variable. To support TextWriter
documents, the XmlTextWriter class is equipped with a constructor with the following
syntax:
Public Sub New(w As TextWriter)
This constructor expects as argument a TextWriter-based
object. This means that you should have defined the TextWriter object
prior to passing it to this constructor. This also implies that the TextWriter
was used to specify the encoding scheme that would be used. Here is an example:
Private Sub btnCreate_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnCreate.Click
Dim Filename As String = "students.xml"
Dim fleStream As FileStream = _
New FileStream("students.xml", FileMode.Create, _
FileAccess.Write, FileShare.None)
Dim stmWriter As StreamWriter = New StreamWriter(fleStream)
Dim txtWriter As XmlTextWriter = New XmlTextWriter(stmWriter)
stmWriter.Flush()
stmWriter.Close()
End Sub
To actually write the contents of the document, you can
create each paragraph by calling the XmlTextWriter.WriteStartElement()
method the same way we did earlier. Here is an example:
Private Sub btnCreate_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnCreate.Click
Dim Filename As String = "students.xml"
Dim fleStream As FileStream = New FileStream("students.xml", _
FileMode.Create, _
FileAccess.Write, _
FileShare.None)
Dim stmWriter As StreamWriter = New StreamWriter(fleStream)
Dim txtWriter As XmlTextWriter = New XmlTextWriter(stmWriter)
txtWriter.WriteStartDocument()
txtWriter.WriteStartElement("ToAllEmployees")
For i As Integer = 0 To txtEditor.Lines.Length - 1
txtWriter.WriteStartElement("Notice")
txtWriter.WriteString(txtEditor.Lines(i))
txtWriter.WriteEndElement()
Next
txtWriter.WriteEndDocument()
stmWriter.Flush()
stmWriter.Close()
End Sub
Once an XML file exists, you can read it to retrieve the
values of its nodes. To support opening an XML file and reading its contents,
the .NET Framework provides the XmlTextReader class that is derived from
the XmlReader class. The XmlTextReader class is equipped with all
the necessary properties and methods to explore the contents of an XML file.
Like XmlTextWriter, the XmlTextReader class
reads a file from top to bottom without going back up once it has passed a node:

This means that, when using the XmlTextReader class
to read an XML file, once you have read a node and moved down the file, you
cannot refer back to the previous node and you cannot access a previous node.
|
Using and XML Text Reader |
|
To use an XML text reader, declare a variable of type XmlTextReader
and initialize it with one of its constructors. The class is equipped with 14
constructors. If you want to open a file whose name or path you know, use the
following constructor:
Public Sub New(url As String)
This constructor takes as argument the name of, or path to, an
XML file. If the file is found, it would be opened. If the file does not
exist or there is an error in the string that specifies its path, the compiler
would throw an XmlException exception.
After declaring an XmlTextReader variable, you can
start reading the content of the file. To support this, you can call the XmlTextReader.Read()
method. Its syntax is:
Public Overrides Function Read As Boolean
As mentioned previously, the file is read from top to
bottom. Based on this, when you call the Read() method, it reads the
first node, moves to the next, and so on until it reaches the end of the file.
While reading the file, every time this method reaches a node, you can find out
what type of node it is by checking the XmlTextReader.NodeType property.
This can help you take a specific action if the reached node meets a certain
criterion.
As reviewed in our introductions to XML, each node has a
name and possibly a value. You can find out the name of a node by checking the XmlTextReader.Name
property. To know the value of a node, retrieve its XmlTextReader.Value
property.
|
Practical Learning: Reading the Elements of an XML File
|
|
- 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: xml
Filter: Repair Orders (*.xml)|*.xml|All Files|
Name: dlgOpen
- Right-click the form and click View Code
- In the Class Name combo box, select mnuFileOpen
- In the Method Name combo box, select Click and implement the
event as follows:
Private Sub mnuFileOpen_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles mnuFileOpen.Click
Dim rdrRepairOrder As XmlTextReader = Nothing
Try
If dlgOpen.ShowDialog() = DialogResult.OK Then
rdrRepairOrder = New XmlTextReader(dlgOpen.FileName)
' Scan the XML file
Do
' every time you find an element, find out what type it is
' If you find text, put it in the combo box' list
If (XmlNodeType.Element <> 0) And _
(rdrRepairOrder.Name = "CustomerName") Then
txtCustomerName.Text = _
rdrRepairOrder.ReadElementString("CustomerName")
txtAddress.Text = rdrRepairOrder.ReadElementString("Addres")
txtCity.Text = rdrRepairOrder.ReadElementString("City")
txtState.Text = rdrRepairOrder.ReadElementString("State")
txtZIPCode.Text = rdrRepairOrder.ReadElementString("ZIPCode")
txtMake.Text = rdrRepairOrder.ReadElementString("Make")
txtModel.Text = rdrRepairOrder.ReadElementString("Model")
txtCarYear.Text = rdrRepairOrder.ReadElementString("CarYear")
txtProblem.Text = _
rdrRepairOrder.ReadElementString("ProbDescription")
txtPartName1.Text = rdrRepairOrder.ReadElementString("PartName1")
txtUnitPrice1.Text = rdrRepairOrder.ReadElementString("UnitPrice1")
txtQuantity1.Text = rdrRepairOrder.ReadElementString("Quantity1")
txtSubTotal1.Text = rdrRepairOrder.ReadElementString("SubTotal1")
txtPartName2.Text = rdrRepairOrder.ReadElementString("PartName2")
txtUnitPrice2.Text = rdrRepairOrder.ReadElementString("UnitPrice2")
txtQuantity2.Text = rdrRepairOrder.ReadElementString("Quantity2")
txtSubTotal2.Text = rdrRepairOrder.ReadElementString("SubTotal2")
txtPartName3.Text = rdrRepairOrder.ReadElementString("PartName3")
txtUnitPrice3.Text = rdrRepairOrder.ReadElementString("UnitPrice3")
txtQuantity3.Text = rdrRepairOrder.ReadElementString("Quantity3")
txtSubTotal3.Text = rdrRepairOrder.ReadElementString("SubTotal3")
txtPartName4.Text = rdrRepairOrder.ReadElementString("PartName4")
txtUnitPrice4.Text = rdrRepairOrder.ReadElementString("UnitPrice4")
txtQuantity4.Text = rdrRepairOrder.ReadElementString("Quantity4")
txtSubTotal4.Text = rdrRepairOrder.ReadElementString("SubTotal4")
txtPartName5.Text = rdrRepairOrder.ReadElementString("PartName5")
txtUnitPrice5.Text = rdrRepairOrder.ReadElementString("UnitPrice5")
txtQuantity5.Text = rdrRepairOrder.ReadElementString("Quantity5")
txtSubTotal5.Text = rdrRepairOrder.ReadElementString("SubTotal5")
txtJobDescription1.Text = _
rdrRepairOrder.ReadElementString("JobDescription1")
txtJobPrice1.Text = rdrRepairOrder.ReadElementString("JobPrice1")
txtJobDescription2.Text = _
rdrRepairOrder.ReadElementString("JobDescription2")
txtJobPrice2.Text = rdrRepairOrder.ReadElementString("JobPrice2")
txtJobDescription3.Text = _
rdrRepairOrder.ReadElementString("JobDescription3")
txtJobPrice3.Text = rdrRepairOrder.ReadElementString("JobPrice3")
txtJobDescription4.Text = _
rdrRepairOrder.ReadElementString("JobDescription4")
txtJobPrice4.Text = rdrRepairOrder.ReadElementString("JobPrice4")
txtJobDescription5.Text = _
rdrRepairOrder.ReadElementString("JobDescription5")
txtJobPrice5.Text = rdrRepairOrder.ReadElementString("JobPrice5")
txtTotalParts.Text = rdrRepairOrder.ReadElementString("TotalPart")
txtTotalLabor.Text = rdrRepairOrder.ReadElementString("TotalLabor")
txtTaxRate.Text = rdrRepairOrder.ReadElementString("TaxRate")
txtTaxAmount.Text = rdrRepairOrder.ReadElementString("TaxAmount")
txtTotalOrder.Text = rdrRepairOrder.ReadElementString("TotalOrder")
txtRecommendations.Text = _
rdrRepairOrder.ReadElementString("Recommendation")
End If
Loop While rdrRepairOrder.Read()
End If
Catch Exc As XmlException
MsgBox("The file name you provided is not valid")
Finally
rdrRepairOrder.Close()
End Try
End Sub
|
- Execute the application and open one the previous orders
|
Details on XML Reading and Writing |
|
Consider a valid XML file such as the following, opened in
Notepad:
If you were asked to examine this file, you can see that its
crowded words make it difficult to read. To include a white space when writing
to the file, you can call the XmlTextWriter.WriteWhiteSpace() method.
Its syntax is:
Public Overrides Sub WriteWhitespace(ws As String)
Besides white spaces, indentation consists of setting empty spaces on the left of
child nodes to make the file easier to read. Based on this, indentation is not a
requirement but a convenience. While the WriteWhiteSpace() method allows
you to explicitly create a white space in the file, the XmlTextWriter
class is equipped with the Formatting property. This property is a value
of the Formatting enumeration. The Formatting enumeration has two members. The
Indented value ensures that each child node would be indented from its parent.
If you manually create an XML file, whether using Notepad,
Visual Studio, or another text editor, you can indent the nodes as you see fit.
To let the compiler know that you want the nodes to be indented, assign the
Formatting.Indented member to its Formatting property. Here is an example:
Private Sub btnCreate_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnCreate.Click
Dim Filename As String = "students.xml"
Dim fleStream As FileStream = _
New FileStream("students.xml", FileMode.Create, _
FileAccess.Write, FileShare.None)
Dim stmWriter As StreamWriter = New StreamWriter(fleStream)
Dim txtWriter As XmlTextWriter = New XmlTextWriter(stmWriter)
Writer.Formatting = Formatting.Indented
stmWriter.Flush()
stmWriter.Close()
End Sub
If you manually create an XML file, you can specify the
number of empty spaces on the left of a node by pressing the Space bar a few
times before typing the node. Most people use 2 or 4 characters for the
indentation. If you are programmatically creating the file, to specify the
number of characters that should be used during indentation, assign the desired
integer to the XmlTextWriter.Indentation property. If you don't use this
property, the compiler would use two characters. You can also find out the
number of characters used for indentation by retrieving the value of this
property.
As mentioned above, indentation consists of entering white
spaces on the left of child nodes. Instead of empty spaces, if you want to use
another character, assign it to the XmlTextWriter.IndentChar property.
|
Practical Learning: Indenting XML Nodes
|
|
- In the Class Name combo box, select mnuFileSave and, to control the indentation when the file is saved, change the top section
of the event as follows:
Private Sub mnuFileSave_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles mnuFileSave.Click
. . . No Change
' Find out if the user clicked OK after displaying the Save dialog box
If dlgSave.ShowDialog() = DialogResult.OK Then
Dim wtrRepairOrder As XmlTextWriter = New XmlTextWriter(Filename, _
Encoding.UTF8)
wtrRepairOrder.Formatting = Formatting.Indented
wtrRepairOrder.Indentation = 4
. . . No Change
End If
End Sub
|
- In the Class Name combo box, select mnuFileExit
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub mnuFileExit_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles mnuFileExit.Click
End
End Sub
|
- Execute the application
- Create and save a few more repair orders
- Close the form
- Open the College Park Auto-Repair database from this lesson
- Notice that if you open a repair order, change it and try to save it, the
application would create a new repair order with a new receipt number.
Configure the form so that, if a repair order was previous opened then
changed, if the user saves it, the current repair order would be saved,
using its own receipt number instead of generating a new receipt number
|
|