|
Consider the following starting points of a data set:
Public Class Exercise
Private colStudentID As DataColumn
Private colUsername As DataColumn
Private tblStudents As DataTable
Private dsStudents As DataSet
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colUsername = New DataColumn("Username", _
Type.GetType("System.String"))
tblStudents = New DataTable("Student")
tblStudents.Columns.Add(colStudentID)
tblStudents.Columns.Add(colUsername)
dsStudents = New DataSet("Students")
dsStudents.Tables.Add(tblStudents)
End Sub
End Class
|
Practical
Learning: Introducing Data Relationships
|
|
- Start Microsoft Visual Basic and create a new Windows Forms Application named BethesdaCarRental2
- To add a new form to the project, in the Solution Explorer, right-click
BethesdaCarRental2 -> Add -> Windows Form...
- Set the Name to OrderProcessing and press Enter
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| Label |
Processed By: |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Employee #: |
|
|
| MaskedTextBox |
|
cbxEmployeeID |
|
| Label |
Employee Name: |
|
|
| TextBox |
|
txtEmployeeName |
|
| Label |
Processed For |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Driver's Lic #: |
|
|
| TextBox |
|
cbxCustomerID |
|
| Label |
Cust Name: |
|
|
| TextBox |
|
txtCustomerName |
|
| Label |
Address: |
|
|
| TextBox |
|
txtCustomerAddress |
|
| Label |
City: |
|
|
| TextBox |
|
txtCustomerCity |
|
| Label |
State: |
|
|
| ComboBox |
|
cbxCustomerStates |
DropDownStyle: DropDownList
Sorted: True
Items: AL, AK, AZ, AR, CA, CO, CT, DE, DC, FL, GA, HI, ID, IL,
IN, IA, KS, KY, LA, ME, MD, MA, MI, MN, MS, MO, MT, NE, NV, NH,
NJ, NM, NY, NC, ND, OH, OK, OR, PA, RI, SC, SD, TN, TX, UT, VT,
VA, WA, WV, WI, WY |
| Label |
ZIP Code |
|
|
| TextBox |
|
txtCustomerZIPCode |
|
| Label |
Car Selected |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Tag Number: |
|
|
| TextBox |
|
cbxCarID |
|
| Label |
Car Condition: |
|
|
| ComboBox |
|
cbxCarConditions |
Sorted: True
Items:
Needs Repair
Drivable
Excellent |
| Label |
Make: |
|
|
| TextBox |
|
txtMake |
|
| Label |
Model: |
|
|
| TextBox |
|
txtModel |
|
| Label |
Year: |
|
|
| TextBox |
|
txtCarYear |
|
| label |
Tank Level: |
|
|
| ComboBox |
|
cbxTankLevels |
Empty
1/4 Empty
1/2 Full
3/4 Full
Full |
| Label |
Mileage Start: |
|
|
| TextBox |
|
txtMileageStart |
TextAlign: Right |
| Label |
Mileage }: |
|
|
| TextBox |
|
txtMileage} |
TextAlign: Right |
| Label |
Order Timing |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Start Date: |
|
|
| DateTimePicker |
|
dtpStartDate |
|
| Label |
End Date: |
|
|
| DateTimePicker |
|
dtpEndDate |
|
| Label |
Days: |
|
|
| TextBox |
0 |
txtDays |
TextAlign: Right |
| Label |
Order Status |
|
|
| ComboBox |
|
cbxOrderStatus |
Items:
Car On Road
Car Returned
Order Reserved |
| Label |
Order Evaluation |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Rate Applied: |
|
|
| TextBox |
0.00 |
txtRateApplied |
TextAlign: Right |
| Button |
Rental Rates |
btnRentalRates |
|
| Label |
Sub-Total: |
|
|
| TextBox |
0.00 |
txtSubTotal |
TextAlign: Right |
| Button |
Calculate |
btnCalculate |
|
| Label |
Tax Rate: |
|
|
| TextBox |
7.75 |
txtTaxRate |
TextAlign: Right |
| Label |
% |
|
|
| Button |
Save |
btnSave |
|
| Label |
Tax Amount: |
|
|
| TextBox |
0.00 |
txtTaxAmount |
TextAlign: Right |
| Button |
Print... |
btnPrint |
|
| Label |
Order Total: |
|
|
| TextBox |
0.00 |
txtOrderTotal |
TextAlign: Right |
| Button |
Print Preview... |
btnPrintPreview |
|
| Label |
Receipt #: |
|
|
| TextBox |
0 |
txtReceiptNumber |
|
| Button |
Open |
btnOpen |
|
| Button |
New Rental Order/Reset |
btnNewRentalOrder |
|
| Button |
Close |
btnClose |
|
|
- Right-click the Order Processing form and click View Code
- Above the Start Date date time picker control
Imports System.IO
Public Class OrderProcessing
End Class
|
- In the Class Name combo box, select dtpStartDate
- In the Method Name combo box, select ValueChanged and implement the event as follows:
Imports System.IO
Public Class OrderProcessing
Private Sub dtpStartDate_ValueChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles dtpStartDate.ValueChanged
dtpEndDate.Value = dtpStartDate.Value
End Sub
End Class
|
- In the Class Name combo box, select dtpEndDate
- In the Method Name combo box, select ValueChanged and implement the event as follows:
' This event approximately evaluates the number of days as a
' difference between the end date and the starting date
Private Sub dtpEndDate_ValueChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles dtpEndDate.ValueChanged
Dim Days As Integer
Dim dteStart As DateTime = dtpStartDate.Value
Dim dteEnd As DateTime = dtpEndDate.Value
' Let's calculate the difference in days
Dim tme As TimeSpan = dteEnd - dteStart
Days = tme.Days
' If the customer returns the car the same day,
' we consider that the car was rented for 1 day
If Days = 0 Then
Days = 1
End If
txtDays.Text = Days
' At any case, we will let the clerk specify the actual number of days
End Sub
|
- In the Class Name combo box, select btnCalculate
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnCalculate_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnCalculate.Click
Dim Days As Integer
Dim RateApplied As Double
Dim SubTotal As Double
Dim TaxRate As Double
Dim TaxAmount As Double
Dim OrderTotal As Double
Try
Days = CInt(txtDays.Text)
Catch Exc As FormatException
MsgBox("Invalid Number of Days")
End Try
Try
RateApplied = CDbl(txtRateApplied.Text)
Catch Exc As FormatException
MsgBox("Invalid Amount for Rate Applied")
End Try
SubTotal = Days * RateApplied
txtSubTotal.Text = FormatNumber(SubTotal)
Try
TaxRate = CDbl(txtTaxRate.Text)
Catch Exc As FormatException
MsgBox("Invalid Tax Rate")
End Try
TaxAmount = SubTotal * TaxRate / 100
txtTaxAmount.Text = FormatNumber(TaxAmount)
OrderTotal = SubTotal + TaxAmount
txtOrderTotal.Text = FormatNumber(OrderTotal)
End Sub
|
- Return to the Order Processing form
- From the Printing section of the Toolbox, click PrintDocument and click
the form
- In the Properties window, set its (Name) to docPrint and press Enter
- 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), 80, 90, 750, 90)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 80, 93, 750, 93)
Dim strDisplay As String = "Bethesda Car Rental"
Dim fntString As Font = New Font("Times New Roman", 28, _
FontStyle.Bold)
e.Graphics.DrawString(strDisplay, fntString, _
Brushes.Black, 240, 100)
strDisplay = "Car Rental Order"
fntString = New System.Drawing.Font("Times New Roman", 22, _
FontStyle.Regular)
e.Graphics.DrawString(strDisplay, fntString, _
Brushes.Black, 320, 150)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 80, 187, 750, 187)
e.Graphics.DrawLine(New Pen(Color.Black, 2), 80, 190, 750, 190)
fntString = New System.Drawing.Font("Times New Roman", 12, _
FontStyle.Bold)
e.Graphics.DrawString("Receipt #: ", fntString, _
Brushes.Black, 100, 220)
fntString = New System.Drawing.Font("Times New Roman", 12, _
FontStyle.Regular)
e.Graphics.DrawString(txtReceiptNumber.Text, fntString, _
Brushes.Black, 260, 220)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 240, 380, 240)
fntString = New System.Drawing.Font("Times New Roman", 12, _
FontStyle.Bold)
e.Graphics.DrawString("Processed By: ", fntString, _
Brushes.Black, 420, 220)
fntString = New System.Drawing.Font("Times New Roman", 12, _
FontStyle.Regular)
e.Graphics.DrawString(txtEmployeeName.Text, fntString, _
Brushes.Black, 550, 220)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 420, 240, 720, 240)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.FillRectangle(Brushes.Gray, _
New Rectangle(100, 260, 620, 20))
e.Graphics.DrawRectangle(Pens.Black, _
New Rectangle(100, 260, 620, 20))
e.Graphics.DrawString("Customer", fntString, _
Brushes.White, 100, 260)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Driver's License #: ", fntString, _
Brushes.Black, 100, 300)
e.Graphics.DrawString("Name: ", fntString, _
Brushes.Black, 420, 300)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(cbxCustomerID.Text, fntString, _
Brushes.Black, 260, 300)
e.Graphics.DrawString(txtCustomerName.Text, fntString, _
Brushes.Black, 540, 300)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 320, 720, 320)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Address: ", fntString, _
Brushes.Black, 100, 330)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtCustomerAddress.Text, fntString, _
Brushes.Black, 260, 330)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 350, 720, 350)
strDisplay = txtCustomerCity.Text & " " & _
cbxCustomerStates.Text & " " & _
txtCustomerZIPCode.Text
fntString = New System.Drawing.Font("Times New Roman", _
12, FontStyle.Regular)
e.Graphics.DrawString(strDisplay, fntString, _
Brushes.Black, 260, 360)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 260, 380, 720, 380)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.FillRectangle(Brushes.Gray, _
New Rectangle(100, 410, 620, 20))
e.Graphics.DrawRectangle(Pens.Black, _
New Rectangle(100, 410, 620, 20))
e.Graphics.DrawString("Car Information", fntString, _
Brushes.White, 100, 410)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Tag #: ", fntString, _
Brushes.Black, 100, 450)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(cbxCarID.Text, fntString, _
Brushes.Black, 260, 450)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 470, 380, 470)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Year: ", fntString, _
Brushes.Black, 420, 450)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtCarYear.Text, fntString, _
Brushes.Black, 530, 450)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 420, 470, 720, 470)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Make: ", fntString, _
Brushes.Black, 100, 480)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtMake.Text, fntString, _
Brushes.Black, 260, 480)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 500, 380, 500)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Model: ", fntString, _
Brushes.Black, 420, 480)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtModel.Text, fntString, _
Brushes.Black, 530, 480)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 420, 500, 720, 500)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Car Condition: ", fntString, _
Brushes.Black, 100, 510)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(cbxCarConditions.Text, fntString, _
Brushes.Black, 260, 510)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 100, 530, 380, 530)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Tank Level: ", fntString, _
Brushes.Black, 420, 510)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(cbxTankLevels.Text, fntString, _
Brushes.Black, 530, 510)
e.Graphics.DrawLine(New Pen(Color.Black, 1), 420, 530, 720, 530)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Mileage Start:", fntString, _
Brushes.Black, 100, 540)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtMileageStart.Text, fntString, _
Brushes.Black, 260, 540)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
100, 560, 380, 560)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Mileage }:", fntString, _
Brushes.Black, 420, 540)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtMileageEnd.Text, fntString, _
Brushes.Black, 530, 540)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
420, 560, 720, 560)
e.Graphics.FillRectangle(Brushes.Gray, _
New Rectangle(100, 590, 620, 20))
e.Graphics.DrawRectangle(Pens.Black, _
New Rectangle(100, 590, 620, 20))
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Order Timing Information", fntString, _
Brushes.White, 100, 590)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Start Date:", fntString, _
Brushes.Black, 100, 620)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(dtpStartDate.Value.ToString("D"), _
fntString, Brushes.Black, 260, 620)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
100, 640, 720, 640)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("End Date:", fntString, _
Brushes.Black, 100, 650)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(dtpEndDate.Value.ToString("D"), fntString, _
Brushes.Black, 260, 650)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
100, 670, 520, 670)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Days:", fntString, _
Brushes.Black, 550, 650)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtDays.Text, fntString, _
Brushes.Black, 640, 650)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
550, 670, 720, 670)
e.Graphics.FillRectangle(Brushes.Gray, _
New Rectangle(100, 700, 620, 20))
e.Graphics.DrawRectangle(Pens.Black, _
New Rectangle(100, 700, 620, 20))
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Order Evaluation", fntString, _
Brushes.White, 100, 700)
Dim fmtString As StringFormat = New StringFormat
fmtString.Alignment = StringAlignment.Far
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Rate Applied:", fntString, _
Brushes.Black, 100, 740)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtRateApplied.Text, fntString, _
Brushes.Black, 300, 740, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
100, 760, 380, 760)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Tax Rate:", fntString, _
Brushes.Black, 420, 740)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtTaxRate.Text, fntString, _
Brushes.Black, 640, 740, fmtString)
e.Graphics.DrawString("%", fntString, _
Brushes.Black, 640, 740)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
420, 760, 720, 760)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Sub-Total:", fntString, _
Brushes.Black, 100, 770)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtSubTotal.Text, fntString, _
Brushes.Black, 300, 770, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
100, 790, 380, 790)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Tax Amount:", fntString, _
Brushes.Black, 420, 770)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtTaxAmount.Text, fntString, _
Brushes.Black, 640, 770, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
420, 790, 720, 790)
fntString = New Font("Times New Roman", 12, FontStyle.Bold)
e.Graphics.DrawString("Order Total:", fntString, _
Brushes.Black, 420, 800)
fntString = New Font("Times New Roman", 12, FontStyle.Regular)
e.Graphics.DrawString(txtOrderTotal.Text, fntString, _
Brushes.Black, 640, 800, fmtString)
e.Graphics.DrawLine(New Pen(Color.Black, 1), _
420, 820, 720, 820)
End Sub
|
- Return to the Order Processing form
- From the Printing section of the Toolbox, click PrintDialog and click the
form
- In the Properties window, change its Name to dlgPrint
- Still in the Properties windows, set its Document property to docPrint
- Right-click the Order Processing form and click View Code
- In the Class Name combo box, select btnPrint
- In the Method name combo box, select Click and implement the event as
follows:
Private Sub btnPrint_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnPrint.Click
If dlgPrint.ShowDialog() = DialogResult.OK Then
docPrint.Print()
End If
End Sub
|
- Return to the Order Processing 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 Order Processing form and click View Code
- In the Class name combo box, select btnPrintPreview
- In the Method name combo box, select Click and implement the event as follows:
Private Sub btnPrintPreview_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnPrintPreview.Click
dlgPrintPreview.ShowDialog()
End Sub
|
- In the Class name combo box, select btnNewRentalOrder
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnNewRentalOrder_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnNewRentalOrder.Click
cbxEmployeeID.SelectedIndex = -1
txtEmployeeName.Text = ""
cbxCustomerID.SelectedIndex = -1
txtCustomerName.Text = ""
txtCustomerAddress.Text = ""
txtCustomerCity.Text = ""
cbxCustomerStates.Text = "DC"
txtCustomerZIPCode.Text = ""
cbxCarID.SelectedIndex = -1
cbxCarConditions.SelectedIndex = 2
txtMake.Text = ""
txtModel.Text = ""
txtCarYear.Text = ""
cbxTankLevels.SelectedIndex = 0
txtMileageStart.Text = "0"
txtMileageEnd.Text = "0"
dtpDateProcessed.Value = DateTime.Today
dtpStartDate.Value = DateTime.Today
dtpEndDate.Value = DateTime.Today
txtDays.Text = "1"
txtRateApplied.Text = "0.00"
txtSubTotal.Text = "0.00"
txtTaxAmount.Text = "0.00"
txtOrderTotal.Text = "0.00"
cbxOrderStatus.SelectedIndex = 0
End Sub
|
- In the Solution Explorer, right-click Form1.vb and click Rename
- Type Central.vb and press Enter
- Design the form as follows:
 |
| Control |
Text |
Name |
| Button |
Order Processing... |
btnOrderProcessing |
| Button |
Customers... |
btnCustomers |
| Button |
Car Editor... |
btnCarEditor |
| Button |
Employees |
btnEmployees |
| Button |
Close |
btnClose |
|
- Right-click the form and click View Code
- Above the Public Class Central line, import the System.IO namespace
Imports System.IO
Public Class Central
End Class
|
- In the Class Name combo box, select (Central Events)
- In the Method Name combo box, select Load and implement the event as
follows:
Imports System.IO
Public Class Central
Private Sub Central_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
' If this directory doesn't exist, create it
Directory.CreateDirectory("C:\Bethesda Car Rental1")
End Sub
End Class
|
- In the Class Name combo box, select btnOrderProcessing
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnOrderProcessing_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnOrderProcessing.Click
Dim Order As OrderProcessing = New OrderProcessing
Order.ShowDialog()
End Sub
|
- To add a new form to the project, in the Solution Explorer, right-click
BethesdaCarRental2 -> Add -> Windows Form...
- Set the Name to RentalRates and press Enter
- Add a ListView to the form and create its Columns as follows:
| (Name) |
Text |
TextAlign |
Width |
| colCategory |
Category |
|
90 |
| colDaily |
Daily |
Right |
|
| colWeekly |
Weekly |
Right |
|
| colMonthly |
Monthly |
Right |
|
| colWeek} |
Week} |
Right |
|
- Create its Items as follows:
| ListViewItem |
SubItems |
SubItems |
SubItems |
SubItems |
| |
Text |
Text |
Text |
Text |
| Economy |
35.95 |
32.75 |
28.95 |
24.95 |
| Compact |
39.95 |
35.75 |
32.95 |
28.95 |
| Standard |
45.95 |
39.75 |
35.95 |
32.95 |
| Full Size |
49.95 |
42.75 |
38.95 |
35.95 |
| Mini Van |
55.95 |
50.75 |
45.95 |
42.95 |
| SUV |
55.95 |
50.75 |
45.95 |
42.95 |
| Truck |
42.75 |
38.75 |
35.95 |
32.95 |
| Van |
69.95 |
62.75 |
55.95 |
52.95 |
- Complete the design of the form as follows:

- In the Solution Explorer, right-click OrderProcessing.vb and click View
Code
- In the Class Name combo box, select btn Rental Rates
- In the Method Name combo box, select Click and implement its event as follows:
Private Sub btnRentalRates_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnRentalRates.Click
Dim WindowRates As RentalRates = New RentalRates
WindowRates.Show()
End Sub
|
- To add a new form to the application, in the Solution Explorer, right-click
BethesdaCarRental2 -> Add -> Windows Form...
- Set the Name to Employees and click Add
- From the Data section of the Toolbox, click DataSet and click the form
- Click Untyped Dataset and click OK
- In the Properties window, change the following characteristics:
DataSetName: Employees
(Name): dsEmployees
- Click Tables and click its button
- Click Add and change the following characteristics:
TableName: Employee
(Name) tblEmployee
- Click Columns and click its button
- In the Columns Collection Editor, click Add change the characteristics as
follows:
ColumnName: EmployeeID
(Name): colEmployeeID
In order to create a relationship, you need two tables. One
table would hold the original data. That table is referred to as the parent.
That table would provide its data to another table. The table that receives data
is referred to as a child table. The table that acts as the parent must have a
way to uniquely identify each record.
In the previous lesson, we saw that, to create unique values
for a column, you could set its Unique property to True. Here is an
example:
Public Class Exercise
Private colStudentID As DataColumn
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
End Sub
End Class
Once this property is
set, the user must remember to specify the value of that column, otherwise, the
record would not be created. In some cases, the user may not have the right
value at the time of data entry or the user may simply be confused.
To assist you with specifying the unique value of a column,
you can ask the compiler to take care of this. To make this happen, you can set an incremental value on the column. To support this, the DataColumn
class is equipped with a Boolean property named AutoIncrement. The
default value of this property is False. When this property is set to True, when
the user decides to add a new record, the compiler would increment the current
value of the column. Here is an example:
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
colStudentID.AutoIncrement = True
End Class
By default, if the DataColumn.AutoIncrement property
is set to True, before any record is created on the table, the initial value of
the column is set to 0 and that would be the first value of the column. If you
want, you can start the records with another value. To support this, the DataColumn
class is equipped with a property named AutoIncrementSeed, which is a Long
integral type. Here is an example:
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
colStudentID.AutoIncrement = True
colStudentID.AutoIncrementSeed = 1000
End Sub
By default, if the AutoIncrement property of the DataColumn
class is set to True, when a record is being created, the value of the column
would be incremented by 1. If you want it to be incremented by another value,
you can use the AutoIncrementStep property. Here is an example:
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
colStudentID.AutoIncrement = True
colStudentID.AutoIncrementSeed = 1
colStudentID.AutoIncrementStep = 100
End Sub
|
Practical
Learning: Introducing Data Relationships
|
|
- While the EmployeeID member is selected, in the Properties list,
double-click AutoIncrement to set its value to True
- Click AutoIncrementSeed and type 1
- Click Add continuously and create the following columns:
| AllowDBNull |
ColumnName |
(Name) |
Expression |
| False |
EmployeeNumber |
colEmployeeNumber |
|
| |
FirstName |
colFirstName |
|
| False |
LastName |
colLastName |
|
| |
FullName |
colFullName |
LastName + ', ' + FirstName |
| |
Title |
colTitle |
|
- Click Close and click Close
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| DataGridView |
|
dgvEmployees |
DataSource: dsEmployees
DataMember: Employee |
| Button |
Close |
btnClose |
|
|
| Data Grid Columns |
| DataPropertyName |
HeaderText |
Width |
| EmployeeID |
Empl ID |
50 |
| EmployeeNumber |
Empl # |
65 |
| FirstName |
First Name |
70 |
| LastName |
Last Name |
70 |
| FullName |
Full Name |
120 |
| Title |
|
110 |
|
- Right-click the form and click View Code
- Above the Public Class Employees line, import the System.IO
namespace
Imports System.IO
Public Class Employees
End Class
|
- In the Class Name combo box, select (Employees Events)
- In the Method Name combo box, select Load and implement the event as
follows:
Imports System.IO
Public Class Employees
Private Sub Employees_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
Dim Filename As String = "C:\Bethesda Car Rental1\employees.xml"
If File.Exists(Filename) Then
dsEmployees.ReadXml(Filename)
End If
End Sub
End Class
|
- In the Class Name combo box, select (Employees Events)
- In the Method name combo box, select FormClosing and implement the event as follows:
Private Sub Employees_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing
dsEmployees.WriteXml("C:\Bethesda Car Rental1\employees.xml")
End Sub
|
- In the Class Name combo box, select btnClose
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnClose_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnClose.Click
Close()
End Sub
|
- In the Solution Explorer, right-click Central.vb and click View Code
- In the Class Name combo box, select btnEmployees
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnEmployees_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnEmployees.Click
Dim frmEmployees As Employees = New Employees
frmEmployees.ShowDialog()
End Sub
|
- Execute the application
- On the Central form, click the Employees button
- Create a few employees as follows:
| Employee # |
First Name |
Last Name |
Title |
| 62-845 |
Patricia |
Katts |
General Manager |
| 92-303 |
Henry |
Larson |
Sales Representative |
| 25-947 |
Gertrude |
Monay |
Sales Representative |
| 73-947 |
Helene |
Sandt |
Intern |
| 40-508 |
Melanie |
Karron |
Sales Representative |
| 22-580 |
Ernest |
Chisen |
Sales Manager |
| 20-308 |
Melissa |
Roberts |
Administrative Assistant |
- Close the forms and return to your programming environment
- To add a new form to the application, in the Solution Explorer, right-click
BethesdaCarRental2 -> Add -> Windows Form...
- Set the Name to Customers and click Add
- From the Data section of the Toolbox, click DataSet and click the form
- Click Untyped Dataset and click OK
- In the Properties window, change the following characteristics:
DataSetName: Customers
(Name): dsCustomers
- Click Tables and click its button
- Click Add and change the following characteristics:
TableName: Customer
(Name) tblCustomer
- Click Columns and click its button
- In the Columns Collection Editor, click Add continuously and create the
following columns:
| ColumnName |
(Name) |
Additional Properties |
| CustomerID |
colCustomerID |
AutoIncrement: True
AutoIncrementSeed: 1 |
| DrvLicNumber |
colDrvLicNumber |
AllowDBNull: False
Unique: True |
| FullName |
colFullName |
AllowDBNull: False |
| Address |
colAddress |
|
| City |
colCity |
|
| State |
colState |
|
| ZIPCode |
colZIPCode |
|
- Click Close and click Close
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| DataGridView |
|
dgvCustomers |
DataSource: dsCustomers
DataMember: Customer |
| Button |
Close |
btnClose |
|
|
| Data Grid Columns |
| DataPropertyName |
HeaderText |
Width |
| CustomerID |
Cust ID |
50 |
| DrvLicNumber |
Drv Lic # |
80 |
| FullName |
Full Name |
|
| Address |
|
|
| City |
|
80 |
| State |
|
45 |
| ZIPCode |
ZIP Code |
60 |
|
- Right-click the form and click View Code
- Above the Public Class Customers line, import the System.IO
namespace
Imports System.IO
Public Class Customers
End Class
|
- In the Class Name combo box, select (Customers Events)
- In the Method Name combo box, select Load and implement the event as
follows:
Imports System.IO
Public Class Customers
Private Sub Customers_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
Dim Filename As String = "C:\Bethesda Car Rental1\customers.xml"
If File.Exists(Filename) Then
dsCustomers.ReadXml(Filename)
End If
End Sub
End Class
|
- In the Method Name combo box, select FormClosing and implement the event as follows:
Private Sub Customers_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing
dsCustomers.WriteXml("C:\Bethesda Car Rental1\customers.xml")
End Sub
|
- In the Class name combo box, select btnClose
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnClose_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnClose.Click
Close()
End Sub
|
- In the Solution Explorer, right-click Central.vb and click View Code
- In the Class name combo box, select btnCustomers
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnCustomers_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnCustomers.Click
Dim frmCustomers As Customers = New Customers
frmCustomers.ShowDialog()
End Sub
|
- Execute the application
- Click the Customers button
and create a few customers as follows:
| Driver's Lic. # |
State |
Full Name |
Address |
City |
ZIP Code |
| M-505-862-575 |
MD |
Lynda Melman |
4277 Jamison Avenue |
Silver Spring |
20904 |
| 379-82-7397 |
DC |
John Villard |
108 Hacken Rd NE |
Washington |
20012 |
| J-938-928-274 |
MD |
Chris Young |
8522 Aulage Street |
Rockville |
20852 |
| 497-22-0614 |
PA |
Pamela Ulmreck |
12075 Famina Rd |
Blain |
17006 |
| 922-71-8395 |
VA |
Helene Kapsco |
806 Hyena Drive |
Alexandria |
22231 |
| C-374-830-422 |
MD |
Hermine Crasson |
6255 Old Georgia Ave |
Silver Spring |
20910 |
| 836-55-2279 |
NY |
Alan Pastore |
4228 Talion Street |
Amherst |
14228 |
| 397-59-7487 |
TN |
Phillis Buster |
724 Cranston Circle |
Knoxville |
37919 |
| 115-80-2957 |
FL |
Elmus Krazucki |
808 Rasters Ave |
Orlando |
32810 |
| 294-90-7744 |
VA |
Helena Weniack |
10448 Great Pollard Hwy |
Arlington |
22232 |
- Close the Customers form
- To add a new form to the application, in the Solution Explorer, right-click
BethesdaCarRental2 -> Add -> Windows Form...
- Set the Name to CarEditor and click Add
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| Label |
Text # |
|
|
| TextBox |
|
txtTagNumber |
|
| Label |
Make: |
|
|
| TextBox |
|
txtMake |
|
| Label |
Model: |
|
|
| TextBox |
|
txtModel |
|
| Label |
Year: |
|
|
| TextBox |
|
txtYear |
|
| Label |
Category: |
|
|
| ComboBox |
|
cboCategories |
DropDownStyle: DropDownList |
| Items: |
Economy
Compact
Standard
Full Size
Mini Van
SUV
Truck
Van |
| PictureBox |
|
pbxCar |
SizeMode: Zoom |
| CheckBox |
CD Player |
chkCDPlayer |
CheckAlign: MiddleRight |
| CheckBox |
DVD Player |
chkDVDPlayer |
CheckAlign: MiddleRight |
| Button |
Select Car Picture... |
btnSelectPicture |
|
| CheckBox |
Available |
chkAvailable |
CheckAlign: MiddleRight |
| Label |
Picture Name |
lblPictureName |
|
| Button |
Submit |
btnSubmit |
|
| Button |
Close |
btnClose |
DialogResult: Cancel |
| OpenFileDialog |
(Name): dlgOpen
Title: Select Item Picture
DefaultExt: jpg
Filter: JPEG Files (*.jpg,*.jpeg)|*.jpg|GIF Files (*.gif)|*.gif|Bitmap Files (*.bmp)|*.bmp|PNG Files (*.png)|*.png |
| Form |
|
|
FormBorderStyle: FixedDialog
MaximizeBox: False
MinimizeBox: False
ShowInTaskbar: False |
|
- Right-click the form and click View Code
- Above the Public Class CarEditor line, import the System.IO
namespace
Imports System.IO
Public Class CarEditor
End Class
|
- In the Class Name combo box, select btnSelectPicture
- In the Method Name combo box, select Click and implement the event as
follows:
Imports System.IO
Public Class CarEditor
Private Sub btnSelectPicture_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnSelectPicture.Click
If dlgPicture.ShowDialog() = DialogResult.OK Then
lblPictureName.Text = dlgPicture.FileName
pbxCar.Image = Image.FromFile(lblPictureName.Text)
End If
End Sub
End Class
|
- Return to the Car Editor form
- From the Data section of the Toolbox, click DataSet and click the form
- Click Untyped Dataset and click OK
- In the Properties window, change the following characteristics:
DataSetName: Cars
(Name): dsCars
- Click Tables and click its button
- Click Add and change the following characteristics:
TableName: Car
(Name) tblCar
- Click Columns and click its button
- In the Columns Collection Editor, click Add continuously and create the
following columns:
| ColumnName |
(Name) |
Additional Properties |
| CarID |
colCarID |
AutoIncrement: True
AutoIncrementSeed: 1 |
| TagNumber |
colTagNumber |
AllowDBNull: False
Unique: True |
| Make |
colMake |
|
| Model |
colModel |
|
| Year |
colYear |
DataType: System.UInt16 |
| Category |
colCategory |
|
| CDPlayer |
colCDPlayer |
DataType: System.Boolean |
| DVDPlayer |
colDVDPlayer |
DataType: System.Boolean |
| Available |
colAvailable |
DataType: System.Boolean |
- Click Close and click Close
- Right-click the form and click View Code
- In the Class name com box, select btnSubmit
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnSubmit_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnSubmit.Click
If txtTagNumber.Text.Length = 0 Then
MsgBox("You must enter the car's tag number")
Exit Sub
End If
If txtMake.Text.Length = 0 Then
MsgBox("You must specify the car's manufacturer")
Exit Sub
End If
If txtModel.Text.Length = 0 Then
MsgBox("You must enter the model of the car")
Exit Sub
End If
If txtYear.Text.Length = 0 Then
MsgBox("You must enter the year of the car")
Exit Sub
End If
Dim CarRecord As DataRow = tblCar.NewRow()
CarRecord("TagNumber") = txtTagNumber.Text
CarRecord("Make") = txtMake.Text
CarRecord("Model") = txtModel.Text
CarRecord("CarYear") = txtYear.Text
CarRecord("Category") = cbxCategories.Text
CarRecord("CDPlayer") = chkCDPlayer.Checked
CarRecord("DVDPlayer") = chkDVDPlayer.Checked
CarRecord("Available") = chkAvailable.Checked
tblCar.Rows.Add(CarRecord)
dsCars.WriteXml("C:\Bethesda Car Rental1\cars.xml")
If lblPictureName.Text.Length <> 0 Then
Dim flePicture As FileInfo = New FileInfo(lblPictureName.Text)
flePicture.CopyTo("C:\Bethesda Car Rental1\" & _
txtTagNumber.Text & flePicture.Extension)
End If
txtTagNumber.Text = ""
txtMake.Text = ""
txtModel.Text = ""
txtYear.Text = ""
cbxCategories.Text = "Economy"
chkCDPlayer.Checked = False
chkDVDPlayer.Checked = False
chkAvailable.Checked = False
lblPictureName.Text = "."
pbxCar.Image = Nothing
End Sub
|
- In the Class name combo box, select btnClose
- In the Method name combo box, select Click and implement the event as follows:
Private Sub btnClose_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnClose.Click
Close()
End Sub
|
- In the Solution Explorer, right-click Central.vb and click View Code
- In the Class name combo box, select btn Car Editor
- In the Method name combo box, select Click and implement the as follows:
Private Sub btnCarEditor_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnCarEditor.Click
Dim Editor As CarEditor = New CarEditor
Editor.ShowDialog()
End Sub
|
- Copy the following pictures to any folder somewhere on your computer:
 |
 |
| BMW: 335i |
Chevrolet Avalanche |
 |
 |
| Honda Accord |
Mazda Miata |
 |
 |
| Chevrolet Aveo |
Ford E150XL |
 |
 |
| Buick Lacrosse |
Honda Civic |
 |
 |
| Ford F-150 |
Mazda Mazda5 |
 |
 |
| Volvo S40 |
Land Rover LR3 |
- Execute the application
- Click the Car Editor button and create the
cars
- Close the Car Editor form and return to your programming environment
- In the Solution Explorer, double-click OrderProcessing.vb
- From the Data section of the Toolbox, click DataSet and click the form
- Click Untyped Dataset and click OK
- In the Properties window, change the following characteristics:
DataSetName: RentalOrders
(Name): dsRentalOrders
- Click Tables and click its button
- Click Add and change the following characteristics:
TableName: RentalOrder
(Name) tblRentalOrder
- Click Columns and click its ellipsis button
- In the Columns Collection Editor, click Add twice and create the following columns:
| ColumnName |
(Name) |
Additional Properties |
| RentalOrderID |
colRentalOrderID |
AutoIncrement: True
AutoIncrementSeed: 1000 |
| DateProcessed |
colDateProcessed |
DataType: System.DateTime |
- Click Close
In a relation, a constraint is a rule that would specify how
some data is created or provided to a table. For example, a constraint can
provide the means by which some values of a column are entered. Another type of
constraint can create a rule that controls the types or ranges of values that
can be accepted for a column; non-acceptable values would be rejected. There are
various types of constraints and most are supported in the DataSet system.
To visually create a constraint, display the Table
Collection Editor. In the Members list, click the name of the table. In the
Properties list, click the Constraints list and click its ellipsis button:

To support constraints, the DataTable class is
equipped with a property named Constraints, which is an object of type ConstraintCollection.
A unique constraint is a rule that states that the value of
one column or the combination of values of some columns must be unique among the
records of a table. The unique constraint can involve only one column as we saw
for the Unique property of a column. For example, if you are creating a
list of usernames for the students of a school, you would not want two students
to have the same username. Here is an example:
| First Name |
MI |
Last Name |
Username |
| Frank |
|
Adams |
fadams |
| Fannie |
H |
Adams |
fadams |
| Virginie |
|
Mengue |
vmengue |
| Christine |
M |
Chambers |
cchambers |
| Cynthia |
P |
Chambers |
cchambers |
| Carlton |
|
Chambers |
cchambers |
| Alexis |
|
Leandro |
aleandro |
When creating the table, you can set up a unique constraint
so that duplicate values would be rejected. In this case, every time the user
enters a new value, the compiler (actually an interpreter) would check if that
value exists already. If so, the user would be informed and must take
appropriate actions to correct it. Here are examples:
| First Name |
MI |
Last Name |
Username |
Valid |
| Frank |
|
Adams |
fadams |
fadams |
| Fannie |
H |
Adams |
fadams |
fhadams |
| Virginie |
|
Mengue |
vmengue |
vmengue |
| Christine |
M |
Chambers |
cchambers |
cmchambers |
| Cynthia |
P |
Chambers |
cchambers |
cphambers |
| Carlton |
|
Chambers |
cchambers |
cchambers |
| Alexis |
|
Leandro |
aleandro |
aleandro |
A unique constraint can also involve more than one column.
For example, if you are creating a list of members of a club, it could be
confusing to have two members with the exact same full name. You could allow
same last names. As long as the first names are different, there would be less
or no confusion. Using a unique constraint, you can set a rule so that each
combination of a first and last name would be different.
To visually create a unique constraint, display the Table
Collection Editor and create the desired columns for a table. In the Members
list, click the desired table. In the Properties list, click the ellipsis button of the Constraints field. In the Constraints
Collection Editor, click Add -> Unique Constraint, give it a name,
click the check box of the column that will hold unique values. Here is an
example:

If the unique constraint will involve more than one column,
click the check box of each. After providing the necessary information, click
OK.
To support unique constraints, the System.Data
namespace provides the UniqueConstraint class, which is derived from the Constraint
class. Therefore, to programmatically create a unique constraint, you can
declare a variable to type UniqueConstraint and initialize it with one of
its many constructors. If you want to specify only the column that will hold
unique values, you can use the following constructor:
Public Sub New(column As DataColumn)
This method expects the variable name of a column as
argument. After creating the constraint variable, you can add it to the Constraints
collection of the table. To support this, the ConstraintCollection class
is equipped with a method named Add that comes in many versions. If you
had created a UniqueContraint object and you want to add it, you can use
the following syntax of the method:
Public Sub Add(constraint As Constraint)
This version expects a Constraint-derived object as
argument. Here is an example:
Public Class Exercise
Private colStudentID As DataColumn
Private colUsername As DataColumn
Private tblStudents As DataTable
Private cnsUniqueUsername As UniqueConstraint
Private dsStudents As DataSet
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colUsername = New DataColumn("Username", _
Type.GetType("System.String"))
tblStudents = New DataTable("Student")
tblStudents.Columns.Add(colStudentID)
tblStudents.Columns.Add(colUsername)
cnsUniqueUsername = New UniqueConstraint(colUsername)
tblStudents.Constraints.Add(cnsUniqueUsername)
dsStudents = New DataSet("Students")
dsStudents.Tables.Add(tblStudents)
End Sub
End Class
If you create a unique constraint using the UniqueConstraint(column
As DataColumn) constructor, a default name would be assigned to it. If this
is the first constraint, it would be named Constraint1 and the names would be
incremental. If you want, you can provide your own name. To do this, you can use
the following constructor of the UniqueConstraint class:
Public Sub New(name As String, column As DataColumn)
The first argument is the name of the unique constraint.
Here is an example:
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
colStudentID.AutoIncrement = True
colStudentID.AutoIncrementSeed = 1000
colStudentID.AutoIncrementStep = 5
colUsername = New DataColumn("Username", Type.GetType("System.String"))
tblStudents = New DataTable("Student")
tblStudents.Columns.Add(colStudentID)
tblStudents.Columns.Add(colUsername)
cnsUniqueUsername = New UniqueConstraint("UniqueUsername", colUsername)
tblStudents.Constraints.Add(cnsUniqueUsername)
dsStudents = New DataSet("Students")
dsStudents.Tables.Add(tblStudents)
End Sub
If the unique constraint is a combination of columns, create
them in an array before adding them.
To create a scenario where data flows from one list to
another, we saw that the first list must hold the records that would be supplied
to other lists. In the first list, each record must be distinguishable from the
others. One way you can take care of this is to create what is referred to as a
primary key.
To visually create a primary key, in the Members list of the Tables Collection Editor,
click the desired table. In the Properties list, click the arrow of the
PrimaryKey combo box and click the left button of the column. Here is an
example:

Like a unique constraint, a primary key can involve more
than one column. In this case, you would click the gray button of each of the
columns that would be involved in the combination. After doing this, you can
click Close.
In reality, a primary key is a unique constraint. Therefore,
if you create a primary key as just described above, the studio would configure
it behind the scenes. Otherwise, you can explicitly create a primary key as a
unique constraint. To do this, in the Members list of the Tables Collection
Editor, click the desired table. In the Properties list, click Constraints and
click its ellipsis button. In the Constraints Collection Editor, click Add -> Unique
Constraint. In the Unique Constraint dialog box, accept the default name or
change it. In the Columns list,
click the check box of the column that will be the primary key, and click the
Primary Key check box. Here is an example:

If the primary key involves more than one column, click the
check box of each. After making the selections, click OK.
To assist you with programmatically creating a primary key,
the UniqueConstraint class is equipped with the following constructor:
Public Sub New(column As DataColumn, isPrimaryKey As Boolean)
In this case, the second argument is passed as True or
False. If passed as True, the column specified as the first argument would be
treated as the primary key. If you use this constructor, a default name would be
given to the constraint. If you want to specify a name, you can use the
following constructor:
Public Sub New ( _
name As String, _
column As DataColumn, _
isPrimaryKey As Boolean _
)
Here is an example:
Public Class Exercise
Private colGenderID As DataColumn
Private PKGenderID As UniqueConstraint
Private colGender As DataColumn
Private tblGenders As DataTable
Private colStudentID As DataColumn
Private colUsername As DataColumn
Private tblStudents As DataTable
Private cnsUniqueUsername As UniqueConstraint
Private dsStudents As DataSet
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colGenderID = New DataColumn("GenderID", _
Type.GetType("System.Int32"))
colGenderID.AutoIncrement = True
colGenderID.AutoIncrementSeed = 1
colGenderID.AutoIncrementStep = 1
colGender = New DataColumn("colGender", _
Type.GetType("System.String"))
tblGenders = New DataTable("Gender")
tblGenders.Columns.Add(colGenderID)
tblGenders.Columns.Add(colGender)
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
colStudentID.AutoIncrement = True
colStudentID.AutoIncrementSeed = 1000
colStudentID.AutoIncrementStep = 5
colUsername = New DataColumn("Username", _
Type.GetType("System.String"))
tblStudents = New DataTable("Student")
tblStudents.Columns.Add(colStudentID)
tblStudents.Columns.Add(colUsername)
cnsUniqueUsername = New UniqueConstraint("UniqueUsername", colUsername)
tblStudents.Constraints.Add(cnsUniqueUsername)
PKGenderID = New UniqueConstraint("PKGenderID", colGenderID, True)
tblGenders.Constraints.Add(PKGenderID)
dsStudents = New DataSet("Students")
dsStudents.Tables.Add(tblStudents)
End Sub
End Class
|
Practical
Learning: Creating a Primary Key
|
|
- While the RentalOrder table is still selected in the Members list, in the
Properties list, click Constraints and click its button
- In the Constraints Collection Editor, click Add -> Unique Constraint

- Set the Name to PKRentalOrders
- Click the check box of RentalOrderID and click the Primary Key check box

- Click OK and click Close
- Click Columns and create the following columns:
| ColumnName |
(Name) |
Other Properties |
| RentalOrderID |
colRentalOrderID |
|
| DateProcessed |
colDateProcessed |
|
| EmployeeID |
colEmplID |
DataType: System.Int32 |
| EmployeeName |
colEmployeeName |
|
| CustomerID |
colCustID |
DataType: System.Int32 |
| CustomerName |
colCustomerName |
|
| CustomerAddress |
colCustomerAddress |
|
| CustomerCity |
colCustomerCity |
|
| CustomerState |
colCustomerState |
|
| CustomerZIPCode |
colCustomerZIPCode |
|
| CarID |
colVehicleID |
DataType: System.Int32 |
| Make |
colCarMake |
|
| Model |
colCarModel |
|
| Year |
colCarYear |
DataType: System.UInt16 |
| Condition |
colCarCondition |
|
| TankLevel |
colTankLevel |
|
| MileageStart |
colMileageStart |
DataType: System.UInt32 |
| Mileage} |
colMileage} |
DataType: System.UInt32 |
| RentStartDate |
colRentStartDate |
DataType: System.DateTime |
| RendependDate |
colRendependDate |
DataType: System.DateTime |
| Days |
colDays |
DataType: System.UInt16 |
| RateApplied |
colRateApplied |
DataType: System.Double |
| SubTotal |
colSubTotal |
DataType: System.Double |
| TaxRate |
colTaxRate |
DataType: System.Double |
| TaxAmount |
colTaxAmount |
DataType: System.Double |
| OrderTotal |
colOrderTotal |
DataType: System.Double |
| OrderStatus |
colOrderStatus |
|
- Click Close
- While the RentalOrder table is selected, in the RentalOder Properties
list, click PrimaryKey and click the arrow of its combo box.
Notice the check box on RentalOrderID

- In the Tables Collection Editor, click Add and change the following
characteristics:
TableName: Car
(Name) tblCar
- Click Columns and click its button
- In the Columns Collection Editor, click Add continuously and create the
following columns:
| ColumnName |
(Name) |
Additional Properties |
| CarID |
colCarID |
AutoIncrement: True
AutoIncrementSeed: 1 |
| TagNumber |
colTagNumber |
AllowDBNull: False
Unique: True |
| Make |
colMake |
|
| Model |
colModel |
|
| Year |
colYear |
DataType: System.UInt16 |
| Category |
colCategory |
|
| CDPlayer |
colCDPlayer |
DataType: System.Boolean |
| DVDPlayer |
colDVDPlayer |
DataType: System.Boolean |
| Available |
colAvailable |
DataType: System.Boolean |
- Click Close
- While the Car table is selected, in the Properties list, click Constraints
and its button
- In the Constraints Collection Editor, if Constraint1 is selected, click
Edit (otherwise, click Add -> Unique Constraint)
- Set the Name to PKCars
- Click the check box of CarID and click the Primary Key check box:

- Click OK and click Close
- In the Tables Collection Editor, click Add and change the following
characteristics:
TableName: Customer
(Name) tblCustomer
- Click Columns and click its button
- In the Columns Collection Editor, click Add continuously and create the
following columns:
| ColumnName |
(Name) |
Additional Properties |
| CustomerID |
colCustomerID |
AutoIncrement: True
AutoIncrementSeed: 1 |
| DrvLicNumber |
colDrvLicNumber |
AllowDBNull: False
Unique: True |
| FullName |
colFullName |
AllowDBNull: False |
| Address |
colAddress |
|
| City |
colCity |
|
| State |
colState |
|
| ZIPCode |
colZIPCode |
|
- Click Close
- Click Constraints and click its button
- In the Constraints Collection Editor, if Constraint1 is selected, click
Edit (otherwise, click Add -> Unique Constraint)
- Set the Name to PKCustomers
- Click the check box of CustomerID and click the Primary Key check box
(clear any other check box)
- Click OK and click Close
- In the Tables Collection Editor, click Add and change the following
characteristics:
TableName: Employee
(Name) tblEmployee
- Click Columns and click its button
- In the Columns Collection Editor, click Add continuously and create the
following columns:
| ColumnName |
(Name) |
Additional Properties |
| EmployeeID |
colEmployeeID |
AutoIncrement: True
AutoIncrementSeed: 1 |
| EmployeeNumber |
colEmployeeNumber |
AllowDBNull: False
Unique: True |
| FirstName |
colFirstName |
AllowDBNull: False |
| LastName |
colLastName |
|
| FullName |
colEmplFullName |
|
| Title |
colTitle |
|
- Click Close
- Click Constraints and click its button
- In the Constraints Collection Editor, if Constraint1 is selected, click
Edit (otherwise, click Add -> Unique Constraint)
- Set the Name to PKEmployees
- Click the check box of EmployeeID and click the Primary Key check box
(clear any other check box)
- Click OK and click Close
- Right-click the form and click View Code
For a parent list to supply its information to another list,
the child list must have a column that would serve as a relay. This means that,
in the child list, you must create a column that would correspond to the primary
key of the parent table. This column of the child list is called a foreign key.
To visually create a foreign key, in the Tables Collection Editor,
you can click the ellipsis button of the Constraints field. In the Constraints
Collection Editor, you can click Add -> Foreign Key Constraint. In Foreign
Key Constraint:
- Accept or change the Name
- In the Parent Table combo box, select the name of the table that holds the
primary key
- If everything is configured fine, after selecting the table that holds the
primary key, the box under Key Columns and the box under Foreign Key Columns
should have the names of the right columns already. Otherwise, you should
click the box under Key to reveal its combo box, then click the arrow
of that combo box to select the primary key column of the parent table
- Click the box under Foreign Key Columns and, in its combo box, select the
name of the foreign key in the current table
Here is an example:

In the same way, you can create the other foreign keys for
your table. The list of foreign keys would appear in the Members list of the
Constraints Collection Editor.
To support foreign keys, the System.Data namespace
provides a class named ForeignKeyConstraint. The ForeignKeyConstraint
class is derived from the Constraint class. To programmatically create a foreign
key, declare a variable of type ForeignKeyConstraint and initialize it
with one of its six constructors. If you want to specify (only) the names of the
primary key and the foreign key columns, you can use the following constructor:
public ForeignKeyConstraint(DataColumn parentColumn,
DataColumn childColumn)
Here is an example:
Public Class Exercise
Private colGenderID As DataColumn
Private PKGenderID As UniqueConstraint
Private colGender As DataColumn
Private colStudentGenderID As DataColumn
Private tblGenders As DataTable
Private colStudentID As DataColumn
Private colUsername As DataColumn
Private tblStudents As DataTable
Private cnsUniqueUsername As UniqueConstraint
Private FKGenderID As ForeignKeyConstraint
Private dsStudents As DataSet
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colGenderID = New DataColumn("GenderID", _
Type.GetType("System.Int32"))
colGenderID.AutoIncrement = True
colGenderID.AutoIncrementSeed = 1
colGenderID.AutoIncrementStep = 1
colGender = New DataColumn("colGender", _
Type.GetType("System.String"))
tblGenders = New DataTable("Gender")
tblGenders.Columns.Add(colGenderID)
tblGenders.Columns.Add(colGender)
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
colStudentID.AutoIncrement = True
colStudentID.AutoIncrementSeed = 1000
colStudentID.AutoIncrementStep = 5
colUsername = New DataColumn("Username", _
Type.GetType("System.String"))
colStudentGenderID = New DataColumn("GenderID", _
Type.GetType("System.Int32"))
tblStudents = New DataTable("Student")
tblStudents.Columns.Add(colStudentID)
tblStudents.Columns.Add(colUsername)
tblStudents.Columns.Add(colStudentGenderID)
cnsUniqueUsername = New UniqueConstraint("UniqueUsername", _
colUsername)
tblStudents.Constraints.Add(cnsUniqueUsername)
PKGenderID = New UniqueConstraint("PKGenderID", _
colGenderID, True)
tblGenders.Constraints.Add(PKGenderID)
FKGenderID = New ForeignKeyConstraint(colGenderID, _
colStudentGenderID)
tblStudents.Constraints.Add(FKGenderID)
dsStudents = New DataSet("Students")
dsStudents.Tables.Add(tblStudents)
End Sub
End Class
A relational database is an application in which different
tables work together so that information in one table can be made available to
other tables. To make this possible, you start by creating the tables as we have
done above. Each table must have a primary key. As we saw above, to make data
from a parent table available to data from a child table, the child table must
have a foreign key that would "represent" the information from the
parent table. Once the tables and their keys have been created, you can
link them.
To visually create a relationship in a data set, first
select the DataSet object. In the Properties window, click Relations
and click its ellipsis button. In the Relations Collection Editor, to
create a relationship, click Add. In the Relation dialog box, you can
complete the text boxes and combo boxes using the same options as when
creating a foreign key.
If you had previously created a(the) foreign key(s) in
your table, the relationship(s) would automatically be created and
configured so you do not have to recreate it(them).
To support relations in a database, the DataSet
class is equipped with a property named Relations. The DataSet.Relations
property is an object of type DataRelationCollection. The DataRelationCollection
class is a collection of objects where each member is of type DataRelation.
To create a relationship, declare a variable of type DataRelation
and initialize it using one of its six constructors. To specify the
primary key and the foreign key, you can use the following constructor:
Public Sub New(relationName As String, _
parentColumn As DataColumn, _
childColumn As DataColumn)
The first argument is the name of the relationship.
The second argument is the column name of the primary key. The last
argument is the column name of the foreign key. After creating the
relationship, you can add it to the DataSet.Relations property. To
support this, the DataRelationCollection class is equipped with the
Add() method that is provided in various versions. One of the
versions uses the following syntax:
Public Sub Add(relation As DataRelation)
Here is an example
Public Class Exercise
Private colGenderID As DataColumn
Private PKGenderID As UniqueConstraint
Private colGender As DataColumn
Private colStudentGenderID As DataColumn
Private tblGenders As DataTable
Private colStudentID As DataColumn
Private colUsername As DataColumn
Private tblStudents As DataTable
Private cnsUniqueUsername As UniqueConstraint
Private FKGenderID As ForeignKeyConstraint
Private relSchool As DataRelation
Private dsStudents As DataSet
Private Sub Exercise_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
colGenderID = New DataColumn("GenderID", _
Type.GetType("System.Int32"))
colGenderID.AutoIncrement = True
colGenderID.AutoIncrementSeed = 1
colGenderID.AutoIncrementStep = 1
colGender = New DataColumn("colGender", _
Type.GetType("System.String"))
tblGenders = New DataTable("Gender")
tblGenders.Columns.Add(colGenderID)
tblGenders.Columns.Add(colGender)
colStudentID = New DataColumn("ColumnID", _
Type.GetType("System.Int32"))
colStudentID.Unique = True
colStudentID.AutoIncrement = True
colStudentID.AutoIncrementSeed = 1000
colStudentID.AutoIncrementStep = 5
colUsername = New DataColumn("Username", _
Type.GetType("System.String"))
colStudentGenderID = New DataColumn("GenderID", _
Type.GetType("System.Int32"))
tblStudents = New DataTable("Student")
tblStudents.Columns.Add(colStudentID)
tblStudents.Columns.Add(colUsername)
tblStudents.Columns.Add(colStudentGenderID)
cnsUniqueUsername = New UniqueConstraint("UniqueUsername", _
colUsername)
tblStudents.Constraints.Add(cnsUniqueUsername)
PKGenderID = New UniqueConstraint("PKGenderID", _
colGenderID, True)
tblGenders.Constraints.Add(PKGenderID)
FKGenderID = New ForeignKeyConstraint(colGenderID, _
colStudentGenderID)
tblStudents.Constraints.Add(FKGenderID)
dsStudents = New DataSet("Students")
dsStudents.Tables.Add(tblStudents)
dsStudents.Tables.Add(tblGenders)
relSchool = New DataRelation("SchoolRelations", _
colGenderID, colStudentGenderID)
dsStudents.Relations.Add(relSchool)
End Sub
End Class
There are many other ways you can create a
relationship.
Once a relationship exists between two tables, you can use
that relationship to have the information flow from one list to another. To
support this, the visual controls of the .NET Framework are equipped with
various properties, including DataSource and DisplayMember.
The DataSource property specifies the name of the data set
variable that holds the database. The DisplayMember property specifies the name
of the column from the table that has the value to be displayed.
|
Practical
Learning: Using the Relationships
|
|
- In the Class Name combo box, select (OrderProcessing Events)
- In the Method Name combo box, select Load event and implement the event as
follows:
Private Sub OrderProcessing_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
Dim Filename As String = "C:\Bethesda Car Rental\employees.xml"
If File.Exists(Filename) Then
dsRentalOrders.ReadXml(Filename)
End If
Filename = "C:\Bethesda Car Rental\customers.xml"
If File.Exists(Filename) Then
dsRentalOrders.ReadXml(Filename)
End If
Filename = "C:\Bethesda Car Rental\cars.xml"
If File.Exists(Filename) Then
dsRentalOrders.ReadXml(Filename)
End If
End Sub
|
- Return to the Order Processing form and click the Employee # combo box
- In the Properties window, change the following characteristics:
DataSource: dsRentalOrders
DisplayMember: Employee.EmployeeNumber
- Right-click the form and click View Code
- In the Class Name combo box, select cbxEmployeeID
- In the Method Name combo box, select SelectedIndexChanged and implement
the event as follows:
Private Sub cbxEmployeeID_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles cbxCustomerID.SelectedIndexChanged
For Each Record As DataRow In tblEmployee.Rows
If cbxEmployeeID.Text = Record("EmployeeNumber") Then
txtEmployeeName.Text = Record("FullName")
End If
Next
End Sub
|
- Return to the form and click the Driver's Lic # combo box
- In the Properties window, change the following characteristics:
DataSource: dsRentalOrders
DisplayMember: Customer.DrvLicNumber
- Right-click the form and click View Code
- In the Class Name combo box, select cbxCustomerID
- In the Method Name combo box, select SelectedIndexChanged and implement
the event as follows:
Private Sub cbxCustomerID_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles cbxCustomerID.SelectedIndexChanged
For Each Record As DataRow In tblCustomer.Rows
If cbxCustomerID.Text = Record("DrvLicNumber") Then
txtCustomerName.Text = Record("FullName")
txtCustomerAddress.Text = Record("Address")
txtCustomerCity.Text = Record("City")
cbxCustomerStates.Text = Record("State")
txtCustomerZIPCode.Text = Record("ZIPCode")
End If
Next
End Sub
|
- Return to the form and click the Tag Number combo box
- In the Properties window, change the following characteristics:
DataSource: dsRentalOrders
DisplayMember: Car.TagNumber
- Right-click the form and click View Code
- In the Class Name combo box, select cbxCarID
- In the Method Name combo box, select SelectedIndexChanged and implement
the event as follows:
Private Sub cbxCarID_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles cbxCarID.SelectedIndexChanged
For Each Record As DataRow In tblCar.Rows
If cbxCarID.Text = Record("TagNumber") Then
txtMake.Text = Record("Make")
txtModel.Text = Record("Model")
txtCarYear.Text = Record("Year")
End If
Next
End Sub
|
- Return to the OrderProcessing form
- From the Data section of the Toolbox, click DataSet and click the form
- Click Untyped Dataset and click OK
- In the Properties window, change the following characteristics:
DataSetName: OrderProcessing
(Name):dsOrderProcessing
- Click the ellipsis button of the Tables field
- In the Tables Collection Editor, click Add and change the characteristics
as follows:
TableName: RentalOrder
(Name): tblRental
- Click the ellipsis button of the Columns field
- In the Columns Collection Editor, click Add continuously and create the following columns:
| ColumnName |
(Name) |
Other Properties |
| ReceiptNumber |
colReceiptNumber |
AutoIncrement: True
AutoIncrementSeed: 1001 |
| DateProcessed |
colProcessedDate |
|
| OrderStatus |
colStatus |
|
| EmployeeNumber |
colEmplNumber |
|
| EmployeeName |
colEmplName |
|
| CustomerDrvLicNbr |
colDrvLicNbr |
|
| CustomerName |
colCustName |
|
| CustomerAddress |
colCustAddress |
|
| CustomerCity |
colCustCity |
|
| CustomerState |
colCustState |
|
| CustomerZIPCode |
colCustZIPCode |
|
| CarTagNumber |
colCarTagNumber |
|
| CarMake |
colMake |
|
| CarModel |
colVehicleModel |
|
| CarYear |
colVehicleYear |
|
| CarCondition |
colCondition |
|
| CarTankLevel |
colCarTankLevel |
|
| MileageStart |
colCarMileageStart |
|
| MileageEnd |
colCarMileageEnd |
|
| RentStartDate |
colStartDate |
|
| RendependDate |
colEndDate |
|
| TotalDays |
colTotalDays |
|
| RateApplied |
colAppliedRate |
|
| SubTotal |
colTotalSub |
|
| TaxRate |
colRateTax |
|
| TaxAmount |
colAmountTax |
|
| OrderTotal |
colTotalOrder |
|
- Click Close and click Close
- Right-click t he form and click View Code
- In the Class Name combo box, select btnSave
- In the Method Name combo box, select Click and implement the event as
follows:
Private Sub btnSave_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnSave.Click
' Don't save this rental order if we don't
' know who processed it
If cbxEmployeeID.SelectedIndex < 0 Then
MsgBox("You must select the employee number or " & _
"the clerk who processed this order.")
Exit Sub
End If
' Don't save this rental order if we don't
' know who is renting the car
If cbxCustomerID.SelectedIndex < 0 Then
MsgBox("You must select the driver's license number " & _
"of the customer who is renting the car")
Exit Sub
End If
' Don't save the rental order if we don't
' know what car is being rented
If cbxCarID.SelectedIndex < 0 Then
MsgBox("You must select the tag number " & _
"of the car that is being rented")
Exit Sub
End If
' This variable will allow us to know whether
' we are only updating a rental order
Dim Found As Boolean = False
' This is the XML file that holds the rental orders
Dim Filename As String = "C:\Bethesda Car Rental1\RentalOrders.xml"
' This is the stream that holds the file
Dim bcrStream As FileStream = New FileStream(Filename, _
FileMode.OpenOrCreate, _
FileAccess.ReadWrite, _
FileShare.ReadWrite)
' Check the rental orders
For Each Record As DataRow In tblRental.Rows
' Find out if there is already a rental
' order with the current receipt number
If Record("ReceiptNumber") = txtReceiptNumber.Text Then
' Since the rental order was found, make note
Found = True
' Get ready to update the rental order
Record("DateProcessed") = dtpDateProcessed.Value.ToString("d")
Record("EmployeeNumber") = cbxEmployeeID.Text
Record("EmployeeName") = txtEmployeeName.Text
Record("CustomerDrvLicNbr") = cbxCustomerID.Text
Record("CustomerName") = txtCustomerName.Text
Record("CustomerAddress") = txtCustomerAddress.Text
Record("CustomerCity") = txtCustomerCity.Text
Record("CustomerState") = cbxCustomerStates.Text
Record("CustomerZIPCode") = txtCustomerZIPCode.Text
Record("CarTagNumber") = cbxCarID.Text
Record("CarMake") = txtMake.Text
Record("CarModel") = txtModel.Text
Record("CarYear") = txtCarYear.Text
Record("CarCondition") = cbxCarConditions.Text
Record("CarTankLevel") = cbxTankLevels.Text
Record("MileageStart") = txtMileageStart.Text
Record("Mileage}") = txtMileageEnd.Text
Record("RentStartDate") = dtpStartDate.Value.ToString("d")
Record("RendependDate") = dtpEndDate.Value.ToString("d")
Record("TotalDays") = txtDays.Text
Record("RateApplied") = txtRateApplied.Text
Record("SubTotal") = txtSubTotal.Text
Record("TaxRate") = txtTaxRate.Text
Record("TaxAmount") = txtTaxAmount.Text
Record("OrderTotal") = txtOrderTotal.Text
Record("OrderStatus") = cbxOrderStatus.Text
' STOP!!!
Exit For
End If
Next
' If the receipt number was not found,
' then prepare to create a new rental order
If Found = False Then
Dim Record As DataRow = tblRental.NewRow()
Record("DateProcessed") = dtpDateProcessed.Value.ToString("d")
Record("EmployeeNumber") = cbxEmployeeID.Text
Record("EmployeeName") = txtEmployeeName.Text
Record("CustomerDrvLicNbr") = cbxCustomerID.Text
Record("CustomerName") = txtCustomerName.Text
Record("CustomerAddress") = txtCustomerAddress.Text
Record("CustomerCity") = txtCustomerCity.Text
Record("CustomerState") = cbxCustomerStates.Text
Record("CustomerZIPCode") = txtCustomerZIPCode.Text
Record("CarTagNumber") = cbxCarID.Text
Record("CarMake") = txtMake.Text
Record("CarModel") = txtModel.Text
Record("CarYear") = txtCarYear.Text
Record("CarCondition") = cbxCarConditions.Text
Record("CarTankLevel") = cbxTankLevels.Text
Record("MileageStart") = txtMileageStart.Text
Record("Mileage}") = txtMileageEnd.Text
Record("RentStartDate") = dtpStartDate.Value.ToString("d")
Record("RendependDate") = dtpEndDate.Value.ToString("d")
Record("TotalDays") = txtDays.Text
Record("RateApplied") = txtRateApplied.Text
Record("SubTotal") = txtSubTotal.Text
Record("TaxRate") = txtTaxRate.Text
Record("TaxAmount") = txtTaxAmount.Text
Record("OrderTotal") = txtOrderTotal.Text
Record("OrderStatus") = cbxOrderStatus.Text
tblRental.Rows.Add(Record)
End If
' Now that the rental order is ready, ...
Try
' ... save it
dsOrderProcessing.WriteXml(bcrStream)
Finally
bcrStream.Close()
End Try
End Sub
|
- In the Class Name combo box, select btnOpen
- In the Method Name combo box, select Click and implement the event as follows:
Private Sub btnOpen_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnOpen.Click
Dim Found As Boolean = False
Try
Dim Filename As String = "C:\Bethesda Car Rental1\RentalOrders.xml"
If File.Exists(Filename) Then
dsOrderProcessing.ReadXml(Filename)
For Each Record As DataRow In tblRental.Rows
If Record("ReceiptNumber") = txtReceiptNumber.Text Then
Found = True
dtpDateProcessed.Value = DateTime.Parse(Record("DateProcessed"))
cbxEmployeeID.Text = Record("EmployeeNumber")
txtEmployeeName.Text = Record("EmployeeName")
cbxCustomerID.Text = Record("CustomerDrvLicNbr")
txtCustomerName.Text = Record("CustomerName")
txtCustomerAddress.Text = Record("CustomerAddress")
txtCustomerCity.Text = Record("CustomerCity")
cbxCustomerStates.Text = Record("CustomerState")
txtCustomerZIPCode.Text = Record("CustomerZIPCode")
cbxCarID.Text = Record("CarTagNumber")
txtMake.Text = Record("CarMake")
txtModel.Text = Record("CarModel")
txtCarYear.Text = Record("CarYear")
cbxCarConditions.Text = Record("CarCondition")
cbxTankLevels.Text = Record("CarTankLevel")
txtMileageStart.Text = Record("MileageStart")
txtMileageEnd.Text = Record("MileageEnd")
dtpStartDate.Value = DateTime.Parse(Record("RentStartDate"))
dtpEndDate.Value = DateTime.Parse(Record("RendependDate"))
txtDays.Text = Record("TotalDays")
txtRateApplied.Text = Record("RateApplied")
txtSubTotal.Text = Record("SubTotal")
txtTaxRate.Text = Record("TaxRate")
txtTaxAmount.Text = Record("TaxAmount")
txtOrderTotal.Text = Record("OrderTotal")
cbxOrderStatus.Text = Record("OrderStatus")
Exit For
End If
Next
Else
MsgBox("There is no cleaning order to open")
End If
Catch Exc As ConstraintException
End Try
If Found = False Then
MsgBox("There is no rental order with that receipt number")
End If
End Sub
|
- In the Class Name combo box, select btnClose
- In the Method Name combo box, select Click and implement the event as
follows:
Private Sub btnClose_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnClose.Click
Close
End Sub
|
- In the Solution Explorer, right-click Central.vb and click View Code
- In the Class Name combo box, select btnClose
- In the Method Name combo box, select Click and implement the event as
follows:
Private Sub btnClose_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnClose.Click
End
End Sub
|
- Execute the application
|
|