 |
Operations on XML Elements |
|
So far, to create an XML element, we were directly typing in
a file. When such a file had been created and saved, it was ready to be
processed. Here is an example of a file named videos.xml:
<?xml version="1.0" encoding="utf-8" ?>
<videos>
<title>The Distinguished Gentleman</title>
</videos>
In some applications, you will want the user to provide you with the
necessary value(s) to create an element. Fortunately, the XmlDocument, the XmlNode,
and the
XmlElement classes provide all the necessary properties and methods to perform
the routine operations of an XML file, an element, or a node. The operations
include locating a node, adding a new element, or deleting a node.
Before performing an operation, you will usually need to
decide in what section of the file you want the action to be applied. As it
happens, you have the root node, a particular node inside the document, parent of a
node, the sibling of a node, etc. To get to a node, you will usually first get a
reference to its XmlElement. To do this, you can declare an
XmlElement variable and initialize it with that reference.
|
Practical
Learning: Introducing operations on XML Elements
|
|
- Start Microsoft Visual C# and create a Console
Application named SolasPropertyRental1
- To add a new form to the application, in the Solution Explorer, right-click
SolasPropertyRental1 -> Add -> Windows Form...
- Set the Name to Tenants and click Add
- From the Toolbox, add a ListView to the form
- While the new list view is still selected, in the Properties window, click
the ellipsis button of the Columns field and create the columns as follows:
| (Name) |
Text |
TextAlign |
Width |
| colAccountNumber |
Account # |
|
65 |
| colFullName |
Full Name |
|
120 |
| colMaritalStatus |
Marital Status |
|
85 |
| colPhoneNumber |
Phone # |
Center |
85 |
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| ListView |
|
lvwTenants |
Anchor: Top, Bottom, Left, Right
FullRowSelect: True
GridLines: True
View: Details |
| Button |
New Tenant... |
btnNewTenant |
Anchor: Bottom, Right |
| Button |
Close |
btnClose |
Anchor: Bottom, Right |
|
- Double-click an unoccupied area of the Tenants form
- Implement the Load event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace SolasPropertyRental1
{
public partial class Tenants : Form
{
public Tenants()
{
InitializeComponent();
}
void ShowTenants()
{
string Filename = @"C:\Solas Property Rental\tenants.xml";
XmlDocument docTenants = new XmlDocument();
if (File.Exists(Filename))
{
lvwTenants.Items.Clear();
docTenants.Load(Filename);
XmlElement elmTenant = docTenants.DocumentElement;
XmlNodeList lstTenants = elmTenant.ChildNodes;
foreach (XmlNode node in lstTenants)
{
ListViewItem lviTenant = new ListViewItem(node.FirstChild.InnerText); // Account Number
lviTenant.SubItems.Add(node.FirstChild.NextSibling.InnerText); // Full Name
lviTenant.SubItems.Add(node.FirstChild.NextSibling.NextSibling.InnerText); // Phone Number
lviTenant.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.InnerText); // Marital Status
lvwTenants.Items.Add(lviTenant);
}
}
}
private void Tenants_Load(object sender, EventArgs e)
{
ShowTenants();
}
}
}
|
- To add another form to the application, in the Solution Explorer, right- click
SolasPropertyRental1 -> Add ->
Windows Form...
- Set the Name to TenantEditor and click Add
- Design the form as follows:
 |
| Control |
Text |
Name |
Properties |
| Label |
&Account #: |
|
|
| MaskedTextBox |
|
txtAccountNumber |
Mask: 00-00-00
Modifiers: public |
| Label |
&Full Name: |
|
|
| TextBox |
|
txtFullName |
Modifiers: public |
| Label |
Marital Status: |
|
|
| ComboBox |
|
txtMaritalStatus |
Modifiers: public
Items:
Single
Widow
Married
Divorced
Separated |
| Label |
&Phone #: |
|
|
| MaskedTextBox |
|
txtPhoneNumber |
Mask: (999) 000-0000
Modifiers: public |
| Button |
OK |
btnOK |
DialogResult: OK |
| Button |
Cancel |
btnCancel |
DialogResult: Cancel |
| Form |
|
|
AcceptButton: btnOK
CancelButton: btnCancel
FormBorderStyle: FixedDialog
MaximizeBox: False
MinimizeBox: False
ShowInTaskbar: False |
|
- To add a new form to the application, in the Solution Explorer, right- click
SolasPropertyRental1 -> Add ->
Windows Form...
- Set the Name to RentalProperties and press Enter
- From the Toolbox, add a ListView to the form
- While the new list view is still selected, in the Properties window, click
the ellipsis button of the Columns field and create the columns as follows:
| (Name) |
Text |
TextAlign |
Width |
| colPropertyCode |
Prop Code |
|
65 |
| colPropertyType |
Property Type |
|
85 |
| colBedrooms |
Bedrooms |
Right |
65 |
| colBathrooms |
Bathrooms |
Right |
65 |
| colMonthlyRent |
Monthly Rent |
Right |
75 |
| colStatus |
Status |
|
65 |
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| ListView |
|
lvwProperties |
View: Details
GridLines: True
FullRowSelect: True
Anchor: Top, Bottom, Left, Right |
| Button |
New Property... |
btnNewProperty |
Anchor: Bottom, Right |
| Button |
Close |
btnClose |
Anchor: Bottom, Right |
|
- Double-click an unoccupied area of the Rental Properties form and implement
the Load event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace SolasPropertyRental1
{
public partial class RentalProperties : Form
{
public RentalProperties()
{
InitializeComponent();
}
void ShowProperties()
{
XmlDocument docProperties = new XmlDocument();
string Filename = @"C:\Solas Property Rental\properties.xml";
if (File.Exists(Filename))
{
lvwProperties.Items.Clear();
docProperties.Load(Filename);
XmlElement elmProperty = docProperties.DocumentElement;
XmlNodeList lstProperties = elmProperty.ChildNodes;
foreach (XmlNode node in lstProperties)
{
ListViewItem lviProperty = new ListViewItem(node.FirstChild.InnerText); // Property Code
lviProperty.SubItems.Add(node.FirstChild.NextSibling.InnerText); // Property Type
lviProperty.SubItems.Add(node.FirstChild.NextSibling.NextSibling.InnerText); // Bedrooms
lviProperty.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.InnerText); // Bathrooms
lviProperty.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Monthly Rent
lviProperty.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Status
lvwProperties.Items.Add(lviProperty);
}
}
}
private void RentalProperties_Load(object sender, EventArgs e)
{
ShowProperties();
}
}
}
|
- To add another form to the application, in the Solution Explorer, right-
click SolasPropertyRental1 -> Add -> Windows Form...
- Set the Name to PropertyEditor and click Add
- Design the form as follows:
 |
| Control |
Text |
Name |
Properties |
| Label |
Property Code: |
|
|
| MaskedTextBox |
|
txtPropertyCode |
Mask: 000-000
Modifiers: Public |
| Button |
OK |
btnOK |
DialogResult: OK |
| Label |
Property Type: |
|
|
| ComboBox |
|
cbxPropertyTypes |
Modifiers: Public
Items: Unknown
Apartment
Townhouse
Single Family |
| Button |
Cancel |
btnCancel |
DialogResult: Cancel |
| Label |
Bedrooms: |
|
|
| TextBox |
0 |
txtBedrooms |
TextAlign: Right
Modifiers: Public |
| Label |
Bathrooms: |
|
|
| TextBox |
0.00 |
txtBathrooms |
TextAlign: Right
Modifiers: Public |
| Label |
Monthly Rent: |
|
|
| TextBox |
0.00 |
txtMonthlyRent |
TextAlign: Right
Modifiers: Public |
| Label |
Occupancy Status: |
|
|
| ComboBox |
Unknown |
cbxStatus |
Modifiers: Public
Items:
Unknown
Available
Occupied
Needs Repair |
| Form |
|
|
AcceptButton: btnOK
CancelButton: btnCancel
FormBorderStyle: FixedDialog
MaximizeBox: False
MinimizeBox: False
ShowInTaskbar: False |
|
- To add a new form to the application, in the Solution Explorer, right-click
SolasPropertyRental1 -> Add -> Windows Form...
- Set the Name to RentalAllocation and click Add
- From the Toolbox, add a ListView to the form
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| Label |
Rent Allocation |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Allocation Code: |
|
|
| MaskedTextBox |
|
txtAllocationCode |
Mask: 0000-9999
Modifiers: Public |
| Label |
Date Allocated: |
|
|
| DateTimePicker |
|
dtpDateAllocated |
Format: Short
Modifiers: Public |
| Label |
Tenant |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Property |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| |
|
|
|
| Label |
Account #: |
|
|
| MaskedTextBox |
|
txtTenantAcntNbr |
Mask: 00-00-00
Modifiers: Public |
| Label |
Property #: |
|
|
| MaskedTextBox |
|
txtPropertyCode |
Mask: 000-000
Modifiers: Public |
| Label |
Tenant Name |
|
|
| TextBox |
|
txtTenantName |
Modifiers: Public |
| Label |
Property Type: |
|
|
| TextBox |
|
txtPropertyType |
Modifiers: Public |
| Label |
Marital Status: |
|
|
| TextBox |
|
txtMaritalStatus |
Modifiers: Public |
| Label |
Monthly Rent: |
|
|
| TextBox |
|
txtMonthlyRent |
|
| Label |
Allocation Evaluation |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Contract Length: |
|
|
| ComboBox |
|
cbxContractLength |
Items:
Monthly
3 Months
6 Months
12 Months
Modifiers: Public |
| Label |
Rent Start Date: |
|
|
| DateTimePicker |
|
dtpRentStartDate |
Modifiers: Public |
| Button |
OK |
btnOK |
DialogResult: OK |
| Button |
Close |
btnClose |
DialogResult: Cancel |
| Form |
|
|
AcceptButton: btnOK
CancelButton: btnClose
FormBorderStyle: FixedDialog
MaximizeBox: False
MinimizeBox: False
ShowInTaskbar: False |
|
- On the form, click the Account # text box and, in the Properties window,
double-click Leave
- Implement the event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace SolasPropertyRental1
{
public partial class RentalAllocation : Form
{
public RentalAllocation()
{
InitializeComponent();
}
private void txtTenantAcntNbr_Leave(object sender, EventArgs e)
{
string Filename = @"C:\Solas Property Rental\tenants.xml";
XmlDocument docTenants = new XmlDocument();
if (File.Exists(Filename))
{
docTenants.Load(Filename);
XmlElement elmTenant = docTenants.DocumentElement;
XmlNodeList lstTenants = elmTenant.ChildNodes;
bool TenantFound = false;
for (int i = 0; i < lstTenants.Count; i++)
{
XmlNode node = lstTenants[i];
if (node.FirstChild.InnerText == txtTenantAcntNber.Text)
{
TenantFound = true;
txtTenantName.Text = node.FirstChild.NextSibling.InnerText;
txtMaritalStatus.Text = node.FirstChild.NextSibling.NextSibling.InnerText;
}
}
if (TenantFound == false)
{
MessageBox.Show("There is no tenant with that account number");
txtTenantAcntNber.Text = "";
}
}
else
MessageBox.Show("There is no list of tenants to check.");
}
}
}
|
- Return to the Rent Allocation form and click the Property Code text box
- In the Events section of the Properties window, double-click Leave
- Implement the event as follows:
private void txtPropertyCode_Leave(object sender, EventArgs e)
{
string Filename = @"C:\Solas Property Rental\properties.xml";
XmlDocument docProperties = new XmlDocument();
if (File.Exists(Filename))
{
docProperties.Load(Filename);
XmlElement elmProperty = docProperties.DocumentElement;
XmlNodeList lstProperties = elmProperty.ChildNodes;
bool PropertyFound = false;
for (int i = 0; i < lstProperties.Count; i++)
{
XmlNode node = lstProperties[i];
if (node.FirstChild.InnerText == txtPropertyCode.Text)
{
PropertyFound = true;
txtPropertyType.Text = node.FirstChild.NextSibling.InnerText;
txtMonthlyRent.Text = node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.InnerText;
}
}
if (PropertyFound == false)
{
MessageBox.Show("There is no Property with that code");
txtPropertyType.Text = "";
}
}
else
MessageBox.Show("There is no list of properties to check.");
}
|
- To add a new form to the application, in the Solution Explorer, right- click
SolasPropertyRental1 -> Add ->
Windows Form...
- Set the Name to RentalAllocations and press Enter
- From the Toolbox, add a ListView to the form
- While the new list view is still selected, in the Properties window, click
the ellipsis button of the Columns field and create the columns as follows:
| (Name) |
Text |
TextAlign |
Width |
| colAllocationCode |
Alloc Code |
|
65 |
| colDateAllocated |
Date Allocated |
Center |
85 |
| colTenantAccount |
Tenant # |
Center |
65 |
| colTenantName |
Tenant Name |
|
100 |
| colPropertyCode |
Prop Code |
Center |
65 |
| colPropertyType |
Prop Type |
|
75 |
| colContractLength |
Contract Length |
|
88 |
| colRentStartDate |
Rent Start Date |
Center |
88 |
| colMonthlyRent |
Monthly Rent |
Right |
76 |
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| ListView |
|
lvwAllocations |
View: Details
GridLines: True
FullRowSelect: True
Anchor: Top, Bottom, Left, Right |
| Button |
New Rental Allocation... |
btnNewAllocation |
Anchor: Bottom, Right |
| Button |
Close |
btnClose |
|
|
- Double-click an unoccupied area of the RentalAllocations form and implement
the Load event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace SolasPropertyRental1
{
public partial class RentalAllocations : Form
{
public RentalAllocations()
{
InitializeComponent();
}
void ShowRentalAllocations()
{
string Filename = @"C:\Solas Property Rental\contracts.xml";
XmlDocument docAllocations = new XmlDocument();
if (File.Exists(Filename))
{
lvwAllocations.Items.Clear();
docAllocations.Load(Filename);
XmlElement elmAllocation = docAllocations.DocumentElement;
XmlNodeList lstAllocations = elmAllocation.ChildNodes;
foreach (XmlNode node in lstAllocations)
{
ListViewItem lviAllocation = new ListViewItem(node.FirstChild.InnerText); // Allocation Code
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.InnerText); // Date Allocated
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.NextSibling.InnerText); // Tenant Account Number
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.InnerText); // Tenant Name
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Property Code
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Property Type
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Contract Length
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Rent Start Date
lviAllocation.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Monthly Rent
lvwAllocations.Items.Add(lviAllocation);
}
}
}
private void RentalAllocations_Load(object sender, EventArgs e)
{
ShowRentalAllocations();
}
}
}
|
- To add a new form to the application, in the Solution Explorer, right-click
SolasPropertyRental1 -> Add -> Windows Form...
- Set the Name to RentPayment and click Add
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| Label |
Rent Allocation |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Date Received: |
|
|
| DateTimePicker |
|
dtpDateReceived |
Format: Short
Modifiers: Public |
| Label |
Allocation Code: |
|
|
| MaskedTextBox |
|
txtAllocationCode |
Mask: 0000-9999
Modifiers: Public |
| Label |
Receipt #: |
|
|
| TextBox |
|
txtReceiptNumber |
Modifiers: Public |
| Label |
Tenant Account #: |
|
|
| TextBox |
|
txtTenantAcntNber |
Modifiers: Public |
| Label |
Property Code: |
|
|
| TextBox |
|
txtPropertyCode |
Modifiers: Public |
| Label |
Tenant Name: |
|
|
| TextBox |
|
txtTenantName |
Modifiers: Public |
| Label |
Property Type: |
|
|
| TextBox |
|
txtPropertyType |
Modifiers: Public |
| Label |
Payment Summary |
|
AutoSize: False
BackColor: Gray
BorderStyle: FixedSingle
ForeColor: White
TextAlign: MiddleLeft |
| Label |
Month: |
|
|
| Label |
Year: |
|
|
| Label |
Payment For: |
|
|
| ComboBox |
|
cbxMonths |
Modifiers: Public
Items:
January
February
March
April
May
June
July
August
September
October
November
December |
| TextBox |
|
txtYear |
Modifiers: Public |
| Label |
Amount Received: |
|
|
| TextBox |
0.00 |
txtAmountReceived |
TextAlign: Right
Modifiers: Public |
| Button |
OK |
btnOK |
DialogResult: OK |
| Button |
Close |
btnClose |
DialogResult: Cancel |
| Form |
|
|
AcceptButton: btnOK
CancelButton: btnClose
FormBorderStyle: FixedDialog
MaximizeBox: False
MinimizeBox: False
ShowInTaskbar: False |
|
- On the form, click the Allocation Code text box and, in the Events section
of the Properties window, double-click Leave
- Implement the event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace SolasPropertyRental1
{
public partial class RentPayment : Form
{
public RentPayment()
{
InitializeComponent();
}
private void txtAllocationCode_Leave(object sender, EventArgs e)
{
string Filename = @"C:\Solas Property Rental\contracts.xml";
XmlDocument docAllocations = new XmlDocument();
if (File.Exists(Filename))
{
docAllocations.Load(Filename);
XmlElement elmAllocation = docAllocations.DocumentElement;
XmlNodeList lstAllocations = elmAllocation.ChildNodes;
bool ContractFound = false;
for (int i = 0; i < lstAllocations.Count; i++)
{
XmlNode node = lstAllocations[i];
if (node.FirstChild.InnerText == txtAllocationCode.Text)
{
ContractFound = true;
txtTenantAcntNber.Text = node.FirstChild.NextSibling.NextSibling.InnerText;
txtTenantName.Text = node.FirstChild.NextSibling.NextSibling.NextSibling.InnerText;
txtPropertyCode.Text = node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText;
txtPropertyType.Text = node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText;
txtAmountReceived.Text = node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText;
}
}
if (ContractFound == false)
{
MessageBox.Show("There is no rental contral with that number");
txtTenantAcntNber.Text = "";
}
}
else
MessageBox.Show("There is no list of rental contracts to check.");
}
}
}
|
- To add a new form to the application, in the Solution Explorer, right- click
SolasPropertyRental1 -> Add ->
Windows Form...
- Set the Name to RentPayments and press Enter
- From the Toolbox, add a ListView to the form
- While the new list view is still selected, in the Properties window, click
the ellipsis button of the Columns field and create the columns as follows:
| (Name) |
Text |
TextAlign |
Width |
| colReceiptNumber |
Receipt # |
Right |
|
| colDateReceived |
Date Received |
Center |
85 |
| colAllocationCode |
Alloc Code |
Center |
65 |
| colTenantAccount |
Tenant # |
Center |
65 |
| colTenantName |
Tenant Name |
|
100 |
| colPropertyCode |
Prop Code |
Center |
65 |
| colPropertyType |
Prop Type |
|
75 |
| colPaymentFor |
Payment For |
|
88 |
| colAmountReceived |
Amount |
Right |
50 |
- Design the form as follows:
 |
| Control |
Text |
Name |
Other Properties |
| ListView |
|
lvwRentPayments |
View: Details
GridLines: True
FullRowSelect: True
Anchor: Top, Bottom, Left, Right |
| Button |
New Rent Payment... |
btnNewPayment |
Anchor: Bottom, Right |
| Button |
Close |
btnClose |
Anchor: Bottom, Right |
|
- Double-click an unoccupied area of the RentPayments form and implement
the Load event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace SolasPropertyRental1
{
public partial class RentPayments : Form
{
public RentPayments()
{
InitializeComponent();
}
void ShowRentPayments()
{
string Filename = @"C:\Solas Property Rental\payments.xml";
XmlDocument docPayments = new XmlDocument();
if (File.Exists(Filename))
{
lvwRentPayments.Items.Clear();
docPayments.Load(Filename);
XmlElement elmAllocation = docPayments.DocumentElement;
XmlNodeList lstAllocations = elmAllocation.ChildNodes;
foreach (XmlNode node in lstAllocations)
{
ListViewItem lviPayment = new ListViewItem(node.FirstChild.InnerText); // Receipt Number
lviPayment.SubItems.Add(node.FirstChild.NextSibling.InnerText); // Date Received
lviPayment.SubItems.Add(node.FirstChild.NextSibling.NextSibling.InnerText); // Allocation Code
lviPayment.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.InnerText); // Tenant Account Number
lviPayment.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Tenant Name
lviPayment.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Property Code
lviPayment.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Property Type
lviPayment.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Payment For
lviPayment.SubItems.Add(node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText); // Amount
lvwRentPayments.Items.Add(lviPayment);
}
}
}
private void RentPayments_Load(object sender, EventArgs e)
{
ShowRentPayments();
}
}
}
|
- In the Solution Explorer, right-click Form1.cs and click Rename
- Set the name to Central.cs and press Enter twice to display the
form
- Design the form as follows:
 |
| Control |
Text |
Name |
| Button |
Tenants |
btnTenants |
| Button |
Rental Properties |
btnRentalProperties |
| Button |
Rental Allocations |
btnRentalAllocations |
| Button |
C&lose |
btnClose |
|
- Double-click the Rent Payment button and implement its event as follows:
private void btnRentPayment_Click(object sender, EventArgs e)
{
RentPayments frmPayment = new RentPayments();
frmPayment.Show();
}
|
- Return to the Central form
- Double-click the Rental Allocations button and implement its event as follows:
private void btnRentalAllocations_Click(object sender, EventArgs e)
{
RentalAllocations frmAllocations = new RentalAllocations();
frmAllocations.ShowDialog();
}
|
- Return to the Central form
- Double-click the Tenants button and implement its event as follows:
private void btnTenants_Click(object sender, EventArgs e)
{
Tenants frmTenants = new Tenants();
frmTenants.ShowDialog();
}
|
- Return to the Central form
- Double-click the Rental Properties button and implement its event as follows:
private void btnRentalProperties_Click(object sender, EventArgs e)
{
RentalProperties frmProperties = new RentalProperties();
frmProperties.ShowDialog();
}
|
- Return to the Central form
- Double-click the Close button and implement its event as follows:
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
|
- Save all
To assist with programmatically creating a new element, the XmlDocument
class provides the CreateElement() method that is overloaded with three
versions. One of the versions uses the following syntax:
public XmlElement CreateElement(string name);
Using this method, to create a new element, call it and pass it the name of the element.
For example, imagine you want to add a new Title element to the above file. You
would start with code as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace videoCollection1
{
public partial class Exercise : Form
{
public Exercise()
{
InitializeComponent();
}
private void btnDocument_Click(object sender, EventArgs e)
{
string Filename = "videos.xml";
XmlDocument DOMVideos = new XmlDocument();
if (File.Exists(Filename))
{
DOMVideos.Load(Filename);
XmlElement elmNew = DOMVideos.CreateElement("Title");
}
}
}
}
In order to add the new element to the file, you must specify its position in the
tree: whether it would be the first or the last node, whether you want to
position it before or after a node of your choice. For example, if you want to
add a new Title element to the above file, it would be considered a child of the
root, that is, a child of the XmlDocument.DocumentElement property. In
the previous lesson, we learned how to get a reference to the root node.
To support the positions of
existing nodes, the XmlNode class, which is the ancestor of all XML
nodes of the .NET Framework, provides various appropriate methods. One of these methods is
AppendChild(), which is
used to add an element as the last child of its parent. The syntax of the XmlNode.AppendChild()
method is:
public virtual XmlNode AppendChild(XmlNode newChild);
When calling this method, pass the XmlNode object you
had previous created. After adding the node, if you want the file to keep it,
you should save it. Here is an example:
private void btnDocument_Click(object sender, EventArgs e)
{
string Filename = "videos.xml";
XmlDocument DOMVideos = new XmlDocument();
if (File.Exists(Filename))
{
DOMVideos.Load(Filename);
XmlElement elmRoot = DOMVideos.DocumentElement;
XmlElement elmNew = DOMVideos.CreateElement("title");
elmRoot.AppendChild(elmNew);
}
else // if (!File.Exists(Filename))
{
// Create the default XML structure
DOMVideos.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<videos></videos>");
}
DOMVideos.Save(Filename);
}
This would produce:
<?xml version="1.0" encoding="utf-8"?>
<videos />
or:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<title />
</videos>
Notice that the newly added element is empty.
|
Adding the Inner Text of an Element |
|
Suppose you have the
following videos.xml file:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video>
<title>The Distinguished Gentleman</title>
<director>Jonathan Lynn</director>
<length>112 Minutes</length>
<format>DVD</format>
<rating>R</rating>
</video>
<video>
<title>Her Alibi</title>
<director>Bruce Beresford</director>
<length>94 Minutes</length>
<format>DVD</format>
<rating>PG-13</rating>
</video>
</videos>
Imagine that you want to add a video element. You have a
choice of adding one, more than one, or all child elements of the video node. To perform
this operation, one solution you can use is to "build" all child
elements of the video element, then add the node as a whole.
In the previous lesson, we saw that the XmlNode.InnerXml property comprises a
node, its markup, its children and their markup. This means that you can create
the child node(s) with its (their) markup(s) as a string and assign that string to an XmlNode.InnerXml
string. To do this, you would need the set version of the InnerXml
property. It is declared as follows:
public virtual string InnerXml{get; set;}
Here is an example that adds a complete new video node to
the above XML file:
private void btnDocument_Click(object sender, EventArgs e)
{
string Filename = "videos.xml";
XmlDocument DOMVideos = new XmlDocument();
if (File.Exists(Filename))
{
DOMVideos.Load(Filename);
XmlElement elmXML = DOMVideos.CreateElement("video");
string strNewvideo = "<title>Other People's Money</title>" +
"<director>Alan Brunstein</director>" +
"<length>114 Minutes</length>" +
"<format>VHS</format>" +
"<rating>PG-13</rating>";
elmXML.InnerXml = strNewvideo;
DOMVideos.DocumentElement.AppendChild(elmXML);
}
else // if (!File.Exists(Filename))
{
// Create the default XML structure
DOMVideos.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<videos></videos>");
}
DOMVideos.Save(Filename);
}
This would produce:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video>
<title>Other People's Money</title>
<director>Alan Brunstein</director>
<length>114 Minutes</length>
<format>VHS</format>
<rating>PG-13</rating>
</video>
</videos>
|
Practical
Learning: Introducing operations on XML Elements
|
|
- Access the Tenants.cs [Design] tab and double-click the New Tenant button
- Implement the Click event as follows:
private void btnNewTenant_Click(object sender, EventArgs e)
{
string AccountNumber;
string FullName, MaritalStatus, PhoneNumber;
// If this directory doesn't exist, create it
Directory.CreateDirectory(@"C:\Solas Property Rental\");
// This is the XML file that holds the list of tenants
string Filename = @"C:\Solas Property Rental\tenants.xml";
// This is the dialog box from where a tenant is created
TenantEditor editor = new TenantEditor();
// Display the Tenant Editor Dialog and find out if the
// user clicked OK after filling its controls
if (editor.ShowDialog() == DialogResult.OK)
{
// We will need a reference to the XML document
XmlDocument docTenant = new XmlDocument();
// Find out if the file exists already
// If it doesn't, then create it
if (!File.Exists(Filename))
{
docTenant.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<Tenants></Tenants>");
docTenant.Save(Filename);
}
// At this time, we have a Tenants.xml file. Open it
docTenant.Load(Filename);
// Get a reference to the root node
XmlElement nodRoot = docTenant.DocumentElement;
// Prepare the values of the XML element
AccountNumber = editor.txtAccountNumber.Text;
FullName = editor.txtFullName.Text;
MaritalStatus = editor.cbxMaritalStatus.Text;
PhoneNumber = editor.txtPhoneNumber.Text;
// Create an element named Tenant
XmlElement elmXML = docTenant.CreateElement("Tenant");
// Create the XML code of the child element of Tenant
string strNewCustomer = "<AccountNumber>" + AccountNumber +
"</AccountNumber>" +
"<FullName>" + FullName +
"</FullName>" +
"<MaritalStatus>" + MaritalStatus
+ "</MaritalStatus>" +
"<PhoneNumber>" + PhoneNumber +
"</PhoneNumber>";
elmXML.InnerXml = strNewCustomer;
// Append the new element as a child of Tenant
docTenant.DocumentElement.AppendChild(elmXML);
// Save the XML file
docTenant.Save(@"C:\Solas Property Rental\tenants.xml");
// Since the content of the XML file has just been changed,
// re-display the list of tenants
ShowTenants();
}
}
|
- Return to the Tenants form and double-click the Close button
- Implement its Click event as follows:
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
|
- Access the RentalProperties.cs [Design] tab and double-click the New
Property button
- Implement the Click event as follows:
private void btnNewProperty_Click(object sender, EventArgs e)
{
// If this directory doesn't exist, create it
Directory.CreateDirectory(@"C:\Solas Property Rental\");
// This is the XML file that holds the list of proeprties
string Filename = @"C:\Solas Property Rental\properties.xml";
PropertyEditor editor = new PropertyEditor();
Random rnd = new Random();
editor.txtPropertyCode.Text = rnd.Next(100000, 999999).ToString();
if (editor.ShowDialog() == DialogResult.OK)
{
string PropertyCode, PropertyType, Status;
int Bedrooms;
float Bathrooms;
double MonthlyRent;
// We will need a reference to the XML document
XmlDocument docProperty = new XmlDocument();
// Find out if the file exists already
// If it doesn't, then create it
if (!File.Exists(Filename))
{
docProperty.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<Properties></Properties>");
docProperty.Save(Filename);
}
// Open the XML file
docProperty.Load(Filename);
// Get a reference to the root node
XmlElement nodRoot = docProperty.DocumentElement;
PropertyCode = editor.txtPropertyCode.Text;
PropertyType = editor.cbxPropertyTypes.Text;
Bedrooms = int.Parse(editor.txtBedrooms.Text);
Bathrooms = float.Parse(editor.txtBathrooms.Text);
MonthlyRent = double.Parse(editor.txtMonthlyRent.Text);
Status = editor.cbxStatus.Text;
XmlElement elmXML = docProperty.CreateElement("Property");
string strNewCustomer = "<PropertyCode>" + PropertyCode +
"</PropertyCode>" + "<PropertyType>" +
PropertyType + "</PropertyType>" +
"<Bedrooms>" + Bedrooms + "</Bedrooms>" +
"<Bathrooms>" + Bathrooms.ToString("F") +
"</Bathrooms>" + "<MonthlyRent>" +
MonthlyRent.ToString("F") +
"</MonthlyRent>" +
"<Status>" + Status + "</Status>";
elmXML.InnerXml = strNewCustomer;
docProperty.DocumentElement.AppendChild(elmXML);
docProperty.Save(@"C:\Solas Property Rental\properties.xml");
ShowProperties();
}
}
|
- Return to the Rental Properties form and double-click the Close button
- Implement its Click event as follows:
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
|
- Execute the application
- Use the Tenants button and its New Tenant button to create the following Tenants:
| Account # |
Full Name |
Marital Status |
Phone # |
| 20-48-46 |
Lenny Crandon |
Single |
(240) 975-9093 |
| 57-97-15 |
Joan Ramey |
Married |
(301) 304-5845 |
| 19-38-84 |
Peter Sellars |
Married |
(240) 801-7974 |
| 24-68-84 |
Alberta Sanson |
Separated |
(202) 917-0095 |
| 47-80-95 |
Urlus Flack |
Single |
(703) 203-7947 |
 |
- Use the Rental Properties button and its New Property button to create the following properties:
| Prop Code |
Property Types |
Bedrooms |
Bathrooms |
Monthly Rent |
Status |
| 527-992 |
Apartment |
1 |
1 |
925 |
Available |
| 726-454 |
Apartment |
2 |
1 |
1150.5 |
Available |
| 476-473 |
Single Family |
5 |
3.5 |
2250.85 |
Occupied |
| 625-936 |
Townhouse |
3 |
2.5 |
1750 |
Available |
| 179-738 |
Townhouse |
4 |
2.5 |
1920.5 |
Available |
| 727-768 |
Single Family |
4 |
2.5 |
2140.5 |
Needs Repair |
| 371-801 |
Apartment |
3 |
2 |
1250.25 |
Available |
| 241-536 |
Townhouse |
3 |
1.5 |
1650.5 |
Occupied |
| |
 |
- Close the forms and return to your programming environment
|
Adding an Element With Value |
|
Consider the following XML file named videos.xml:
<?xml version="1.0" encoding="utf-8" ?>
<videos>
<title>The Distinguished Gentleman</title>
</videos>
If you want the element to
have a value, the XmlDocument class provides the CreateTextNode()
method. This method returns an XmlText value. The syntax of this method
is:
public virtual XmlText CreateTextNode(string text);
This method takes as argument the string that would
constitute the value of the element. Before calling it, you should have used the
XmlNode.AppendChild() method to create a node. Calling this method on the
LastChild node of the one that called the AppendChild() would
specify the value of the new node. Here is an example:
private void btnDocument_Click(object sender, EventArgs e)
{
string Filename = "videos.xml";
XmlDocument DOMVideos = new XmlDocument();
if (File.Exists(Filename))
{
DOMVideos.Load(Filename);
XmlElement elmRoot = DOMVideos.DocumentElement;
XmlElement elmNew = DOMVideos.CreateElement("title");
XmlText txtvideo = DOMVideos.CreateTextNode("Basic Instinct");
elmRoot.AppendChild(elmNew);
elmRoot.LastChild.AppendChild(txtvideo);
}
else // if (!File.Exists(Filename))
{
// Create the default XML structure
DOMVideos.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<videos></videos>");
}
DOMVideos.Save(Filename);
}
This would produce:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<title>The Distinguished Gentleman</title>
<title>Basic Instinct</title>
</videos>
The combination of calls to XmlDocument.CreateElement()
and XmlDocument.CreateTextNode() allow you to create a new element that
has a value.
Consider the following XML file named "videos.xml":
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video>
<title>The Distinguished Gentleman</title>
</video>
<video>
<title>Basic Instinct</title>
</video>
</videos>
Notice that the root, videos, has a repetitive child named video. This
video child has its own child named Title. Imagine that you want to
add a new video node that has a child. To do this, first create an empty video node as a child of the root. We learned earlier how to do that:
private void btnDocument_Click(object sender, EventArgs e)
{
string Filename = "videos.xml";
XmlDocument DOMVideos = new XmlDocument();
if (File.Exists(Filename))
{
DOMVideos.Load(Filename);
XmlElement elmRoot = DOMVideos.DocumentElement;
XmlElement elmNew = DOMVideos.CreateElement("video");
elmRoot.AppendChild(elmNew);
}
else // if (!File.Exists(Filename))
{
// Create the default XML structure
DOMVideos.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<videos></videos>");
}
DOMVideos.Save(Filename);
}
After creating the new child of the root, initialize the
grand child with the desired name (the name doesn't have to be one of the
existing names) and a value (which is optional if you don't want the new node to
have a value). Once the new node is ready, append it as the last child of the
root. If this new node has a value, append its XmlText object as the LastChild
of the LastChild of the root. Here is an example of how you would do this:
private void btnDocument_Click(object sender, EventArgs e)
{
string Filename = "videos.xml";
XmlDocument DOMVideos = new XmlDocument();
if (File.Exists(Filename))
{
DOMVideos.Load(Filename);
XmlElement elmRoot = DOMVideos.DocumentElement;
XmlElement elmNew = DOMVideos.CreateElement("video");
elmRoot.AppendChild(elmNew);
elmRoot = DOMVideos.DocumentElement;
elmNew = DOMVideos.CreateElement("title");
XmlText txtvideo = DOMVideos.CreateTextNode("Her Alibi");
elmRoot.LastChild.AppendChild(elmNew);
elmRoot.LastChild.LastChild.AppendChild(txtvideo);
}
else // if (!File.Exists(Filename))
{
// Create the default XML structure
DOMVideos.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<videos></videos>");
}
DOMVideos.Save(Filename);
}
This would produce:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video>
<title>The Distinguished Gentleman</title>
</video>
<video>
<title>Basic Instinct</title>
</video>
<video>
<title>Her Alibi</title>
</video>
</videos>
Now consider the following file:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video>
<title>The Distinguished Gentleman</title>
<director>Jonathan Lynn</director>
<length>112 Minutes</length>
<format>DVD</format>
<rating>R</rating>
</video>
<video>
<title>Her Alibi</title>
<director>Bruce Beresford</director>
<length>94 Minutes</length>
<format>DVD</format>
<rating>PG-13</rating>
</video>
</videos>
The root, videos, has a child named video. The video node
has many child nodes. By now, we know how to add a child to the root. We also
saw how to add a grand child with value to the root. To had many (grand)
children to a node, first build the node, add it to the root, then continuously
add the necessary nodes, one at a time, including its name and its optional
value. This would be done as follows:
private void btnDocument_Click(object sender, EventArgs e)
{
string Filename = "videos.xml";
XmlDocument DOMVideos = new XmlDocument();
if (File.Exists(Filename))
{
DOMVideos.Load(Filename);
XmlElement elmRoot = DOMVideos.DocumentElement;
XmlElement elmNew = DOMVideos.CreateElement("video");
elmRoot.AppendChild(elmNew);
elmRoot = DOMVideos.DocumentElement;
elmNew = DOMVideos.CreateElement("title");
XmlText txtvideo = DOMVideos.CreateTextNode("The Day After Tomorrow");
elmRoot.LastChild.AppendChild(elmNew);
elmRoot.LastChild.LastChild.AppendChild(txtvideo);
elmNew = DOMVideos.CreateElement("director");
txtvideo = DOMVideos.CreateTextNode("Roland Emmerich");
elmRoot.LastChild.AppendChild(elmNew);
elmRoot.LastChild.LastChild.AppendChild(txtvideo);
elmNew = DOMVideos.CreateElement("length");
txtvideo = DOMVideos.CreateTextNode("124 Minutes");
elmRoot.LastChild.AppendChild(elmNew);
elmRoot.LastChild.LastChild.AppendChild(txtvideo);
elmNew = DOMVideos.CreateElement("format");
txtvideo = DOMVideos.CreateTextNode("DVD");
elmRoot.LastChild.AppendChild(elmNew);
elmRoot.LastChild.LastChild.AppendChild(txtvideo);
elmNew = DOMVideos.CreateElement("rating");
txtvideo = DOMVideos.CreateTextNode("PG-13");
elmRoot.LastChild.AppendChild(elmNew);
elmRoot.LastChild.LastChild.AppendChild(txtvideo);
}
else // if (!File.Exists(Filename))
{
// Create the default XML structure
DOMVideos.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<videos></videos>");
}
DOMVideos.Save(Filename);
}
This would produce:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video>
<title>The Distinguished Gentleman</title>
<director>Jonathan Lynn</director>
<length>112 Minutes</length>
<format>DVD</format>
<rating>R</rating>
</video>
<video>
<title>Her Alibi</title>
<director>Bruce Beresford</director>
<length>94 Minutes</length>
<format>DVD</format>
<rating>PG-13</rating>
</video>
<video>
<title>The Day After Tomorrow</title>
<director>Roland Emmerich</director>
<length>124 Minutes</length>
<format>DVD</format>
<rating>PG-13</rating>
</video>
</videos>
Using the same approach, you can add children to children of
children, and so on.
|
Practical
Learning: Programmatically Adding an Element
|
|
- Access the Rental Allocations form and double-click the New Allocation button
- Implement the event as follows:
private void btnNewAllocation_Click(object sender, EventArgs e)
{
string AllocationCode, TenantAccountNumber,
TenantName, MaritalStatus,
PropertyCode, PropertyType, ContractLength;
DateTime DateAllocated, RentStartDate;
double MonthlyRent;
RentalAllocation editor = new RentalAllocation();
Directory.CreateDirectory(@"C:\Solas Property Rental");
string Filename = @"C:\Solas Property Rental\contracts.xml";
if (editor.ShowDialog() == DialogResult.OK)
{
XmlDocument docAllocation = new XmlDocument();
if (!File.Exists(Filename))
{
docAllocation.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<Allocations></Allocations>");
docAllocation.Save(Filename);
}
docAllocation.Load(Filename);
XmlElement nodRoot = docAllocation.DocumentElement;
AllocationCode = editor.txtAllocationCode.Text;
DateAllocated = editor.dtpDateAllocated.Value;
TenantAccountNumber = editor.txtTenantAcntNber.Text;
TenantName = editor.txtTenantName.Text;
MaritalStatus = editor.txtMaritalStatus.Text;
PropertyCode = editor.txtPropertyCode.Text;
PropertyType = editor.txtPropertyType.Text;
MonthlyRent = double.Parse(editor.txtMonthlyRent.Text);
ContractLength = editor.cbxContractLengths.Text;
RentStartDate = editor.dtpRentStartDate.Value;
XmlElement elmRoot = docAllocation.DocumentElement;
XmlElement elmAllocation =
docAllocation.CreateElement("RentalAllocation");
elmRoot.AppendChild(elmAllocation);
elmRoot = docAllocation.DocumentElement;
elmAllocation = docAllocation.CreateElement("AllocationCode");
XmlText txtAllocation =
docAllocation.CreateTextNode(AllocationCode);
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("DateAllocated");
txtAllocation =
docAllocation.CreateTextNode(DateAllocated.ToString("d"));
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("TenantAccountNumber");
txtAllocation = docAllocation.CreateTextNode(TenantAccountNumber);
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("TenantName");
txtAllocation = docAllocation.CreateTextNode(TenantName);
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("MaritalStatus");
txtAllocation = docAllocation.CreateTextNode(MaritalStatus);
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("PropertyCode");
txtAllocation = docAllocation.CreateTextNode(PropertyCode);
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("PropertyType");
txtAllocation = docAllocation.CreateTextNode(PropertyType);
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("ContractLength");
txtAllocation = docAllocation.CreateTextNode(ContractLength);
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("RentStartDate");
txtAllocation =
docAllocation.CreateTextNode(RentStartDate.ToString("d"));
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmAllocation = docAllocation.CreateElement("MonthlyRent");
txtAllocation =
docAllocation.CreateTextNode(MonthlyRent.ToString("F"));
elmRoot.LastChild.AppendChild(elmAllocation);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
docAllocation.Save(Filename);
ShowRentalAllocations();
}
}
|
- Return to the Rental Allocation form and double-click the Close button
- Implement the event as follows:
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
|
- Access the Rent Payments form and double-click the New Rent Payment button
- Implement the event as follows:
private void btnNewPayment_Click(object sender, EventArgs e)
{
int ReceiptNumber;
string AllocationCode,
TenantAccountNumber, TenantName,
PaymentFor, PropertyCode, PropertyType;
DateTime DateReceived;
double AmountReceived;
RentPayment editor = new RentPayment();
XmlDocument docPayment = new XmlDocument();
Directory.CreateDirectory(@"C:\Solas Property Rental");
string Filename = @"C:\Solas Property Rental\payments.xml";
// If some payments were previously made
if (File.Exists(Filename))
{
// Open the payments.xml file
docPayment.Load(Filename);
// Locate the root element
XmlElement elmAllocation = docPayment.DocumentElement;
// Get a list of the child nodes
XmlNodeList lstAllocations = elmAllocation.ChildNodes;
// Get the last receipt number
ReceiptNumber =
int.Parse(lstAllocations[lstAllocations.Count
- 1].FirstChild.InnerText) + 1;
editor.txtReceiptNumber.Text = ReceiptNumber.ToString();
}
else
{
// If no payment has ever been made,
// create a new XML file for the payments
docPayment.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<RentPayments></RentPayments>");
// We will start the receipt numbers at 101
ReceiptNumber = 101;
editor.txtReceiptNumber.Text = ReceiptNumber.ToString();
}
// Display the Rent Payment dialog box
if (editor.ShowDialog() == DialogResult.OK)
{
// If the user had clicked OK,
// Prepare the elements of the XML file
ReceiptNumber = int.Parse(editor.txtReceiptNumber.Text);
DateReceived = editor.dtpDateReceived.Value;
AllocationCode = editor.txtAllocationCode.Text;
TenantAccountNumber = editor.txtTenantAcntNber.Text;
TenantName = editor.txtTenantName.Text;
PropertyCode = editor.txtPropertyCode.Text;
PropertyType = editor.txtPropertyType.Text;
PaymentFor = editor.cbxMonths.Text + " " + editor.txtYear.Text;
AmountReceived = double.Parse(editor.txtAmountReceived.Text);
// Get a reference to the root element
XmlElement elmRoot = docPayment.DocumentElement;
// Create an element named Payment
XmlElement elmPayment = docPayment.CreateElement("Payment");
// Add the new element as the last node of the root element
elmRoot.AppendChild(elmPayment);
// Get a reference to the root element
elmRoot = docPayment.DocumentElement;
// Create an element
elmPayment = docPayment.CreateElement("ReceiptNumber");
// Create the value of the new element
XmlText txtPayment = docPayment.CreateTextNode(ReceiptNumber.ToString());
// Add the new element as a child of the Payment element
elmRoot.LastChild.AppendChild(elmPayment);
// Specify the value of the new element
elmRoot.LastChild.LastChild.AppendChild(txtPayment);
// Follow the same logic for the other elements
elmPayment = docPayment.CreateElement("DateReceived");
txtPayment = docPayment.CreateTextNode(DateReceived.ToString("d"));
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtPayment);
elmPayment = docPayment.CreateElement("AllocationCode");
XmlText txtAllocation = docPayment.CreateTextNode(AllocationCode);
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmPayment = docPayment.CreateElement("TenantAccountNumber");
txtAllocation = docPayment.CreateTextNode(TenantAccountNumber);
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmPayment = docPayment.CreateElement("TenantName");
txtAllocation = docPayment.CreateTextNode(TenantName);
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmPayment = docPayment.CreateElement("PropertyCode");
txtAllocation = docPayment.CreateTextNode(PropertyCode);
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmPayment = docPayment.CreateElement("PropertyType");
txtAllocation = docPayment.CreateTextNode(PropertyType);
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmPayment = docPayment.CreateElement("PaymentFor");
txtAllocation = docPayment.CreateTextNode(PaymentFor);
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
elmPayment = docPayment.CreateElement("AmountReceived");
txtAllocation = docPayment.CreateTextNode(AmountReceived.ToString("F"));
elmRoot.LastChild.AppendChild(elmPayment);
elmRoot.LastChild.LastChild.AppendChild(txtAllocation);
docPayment.Save(Filename);
ShowRentPayments();
}
}
|
- Return to the Rental Allocation form and double-click the Close button
- Implement the event as follows:
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
|
- Execute the application
- Create the following Rental Allocations:
| |
Allocation 1 |
Allocation 2 |
Allocation 3 |
Allocation 4 |
| Allocation Code |
4205-8274 |
5920-9417 |
2792-4075 |
7957-7294 |
| Date Allocated |
8/12/2002 |
2/18/2004 |
3/24/2004 |
10/26/2007 |
| Account # |
24-68-84 |
57-97-15 |
19-38-84 |
20-48-46 |
| Prop Code |
726-454 |
625-936 |
371-801 |
727-768 |
| Contract Length |
12 Months |
3 Months |
12 Months |
6 Months |
| Start Date |
10/1/2002 |
4/1/2004 |
6/1/2004 |
2/1/2008 |
- Create the following Rent Payments:
| |
Date Received |
Allocation Code |
Payment For |
Amount |
| Month |
Year |
| Payment 1 |
10/25/2002 |
4205-8274 |
October |
2002 |
1150.50 |
| Payment 2 |
11/28/2002 |
4205-8274 |
November |
2002 |
1150.50 |
| Payment 3 |
4/28/2004 |
5920-9417 |
April |
2004 |
1750.00 |
| Payment 4 |
7/5/2004 |
2792-4075 |
June |
2004 |
1250.25 |
| Payment 5 |
6/3/2004 |
5920-9417 |
May |
2004 |
1750.00 |
| Payment 6 |
7/30/2004 |
2792-4075 |
July |
2004 |
1250.25 |
| Payment 7 |
7/5/2004 |
5920-9417 |
June |
2004 |
1750.00 |
| Payment 8 |
12/30/2002 |
4205-8274 |
December |
2002 |
1150.50 |
- Close the DOS window
- Open the Solas Property Rental database from this lesson
- Configure the Rental Allocations form so that, after the user has entered
a property code and press Tab (or when the control looses focus), the
database will first check the status of the property. If the property is
occupied, a message box will be displayed to the user and that particular
property cannot be selected (the property code text box should be set empty)
- Configure the Rent Payments so that the user can decide to see only the
payments for one particular tenant (you can create a contextual menu so that
if the user right-clicks a certain row and click View Tenant's Payments, the
list view would display only that tenant's payments. Of course, make sure the
user has a way to display all payments again)