Home

Operations on XML Elements

 

Fundamental Operations

 

Introduction

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 LearningPractical Learning: Introducing operations on XML Elements

  1. Start Microsoft Visual C# and create a Console Application named SolasPropertyRental1
  2. To add a new form to the application, in the Solution Explorer, right-click SolasPropertyRental1 -> Add -> Windows Form...
  3. Set the Name to Tenants and click Add
  4. From the Toolbox, add a ListView to the form
  5. 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
  6. Design the form as follows: 
     
    Solas Property Rental: Customers
     
    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
  7. Double-click an unoccupied area of the Tenants form
  8. 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();
            }
        }
    }
  9. To add another form to the application, in the Solution Explorer, right- click SolasPropertyRental1 -> Add -> Windows Form...
  10. Set the Name to TenantEditor and click Add
  11. Design the form as follows: 
     
    Solas Property Rental: Customer Editor
     
    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
  12. To add a new form to the application, in the Solution Explorer, right- click SolasPropertyRental1 -> Add -> Windows Form...
  13. Set the Name to RentalProperties and press Enter
  14. From the Toolbox, add a ListView to the form
  15. 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
  16. Design the form as follows: 
     
    Solas Property Rental: Properties
     
    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
  17. 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();
            }
        }
    }
  18. To add another form to the application, in the Solution Explorer, right- click SolasPropertyRental1 -> Add -> Windows Form...
  19. Set the Name to PropertyEditor and click Add
  20. Design the form as follows: 
     
    Solas Property Rental: Property Editor
     
    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
  21. To add a new form to the application, in the Solution Explorer, right-click SolasPropertyRental1 -> Add -> Windows Form...
  22. Set the Name to RentalAllocation and click Add
  23. From the Toolbox, add a ListView to the form
  24. Design the form as follows:
     
    Solas Property Rental: Rental Allocation
    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
  25. On the form, click the Account # text box and, in the Properties window, double-click Leave
  26. 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.");
            }
        }
    }
  27. Return to the Rent Allocation form and click the Property Code text box
  28. In the Events section of the Properties window, double-click Leave
  29. 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.");
    }
  30. To add a new form to the application, in the Solution Explorer, right- click SolasPropertyRental1 -> Add -> Windows Form...
  31. Set the Name to RentalAllocations and press Enter
  32. From the Toolbox, add a ListView to the form
  33. 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
  34. Design the form as follows: 
     
    Solas Property Rental: Rental Allocations
     
    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  
  35. 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();
            }
        }
    }
  36. To add a new form to the application, in the Solution Explorer, right-click SolasPropertyRental1 -> Add -> Windows Form...
  37. Set the Name to RentPayment and click Add
  38. Design the form as follows:
     
    Solas Property Rental: Rent Payment
    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
  39. On the form, click the Allocation Code text box and, in the Events section of the Properties window, double-click Leave
  40. 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.");
            }
        }
    }
  41. To add a new form to the application, in the Solution Explorer, right- click SolasPropertyRental1 -> Add -> Windows Form...
  42. Set the Name to RentPayments and press Enter
  43. From the Toolbox, add a ListView to the form
  44. 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
  45. Design the form as follows: 
     
    Solas Property Rental: Rent Payments
     
    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
  46. 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();
            }
        }
    }
  47. In the Solution Explorer, right-click Form1.cs and click Rename
  48. Set the name to Central.cs and press Enter twice to display the form
  49. Design the form as follows:
     
    Solas Property Rental
    Control Text Name
    Button Tenants btnTenants
    Button Rental Properties btnRentalProperties
    Button Rental Allocations btnRentalAllocations
    Button C&lose btnClose
  50. 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();
    }     
  51. Return to the Central form
  52. 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();
    }
  53. Return to the Central form
  54. 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();
    }        
  55. Return to the Central form
  56. 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();
    }
  57. Return to the Central form
  58. Double-click the Close button and implement its event as follows:
     
    private void btnClose_Click(object sender, EventArgs e)
    {
        Close();
    }
  59. Save all

Appending an Element

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 Practical Learning: Introducing operations on XML Elements

  1. Access the Tenants.cs [Design] tab and double-click the New Tenant button
  2. 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();
        }
    }
  3. Return to the Tenants form and double-click the Close button
  4. Implement its Click event as follows:
     
    private void btnClose_Click(object sender, EventArgs e)
    {
        Close();
    }
  5. Access the RentalProperties.cs [Design] tab and double-click the New Property button
  6. 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();
        }
    }
  7. Return to the Rental Properties form and double-click the Close button
  8. Implement its Click event as follows:
     
    private void btnClose_Click(object sender, EventArgs e)
    {
        Close();
    }
  9. Execute the application
  10. 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
  11. 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
     
  12. 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 Practical Learning: Programmatically Adding an Element

  1. Access the Rental Allocations form and double-click the New Allocation button
  2. 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();
        }
    }
  3. Return to the Rental Allocation form and double-click the Close button
  4. Implement the event as follows:
     
    private void btnClose_Click(object sender, EventArgs e)
    {
        Close();
    }
  5. Access the Rent Payments form and double-click the New Rent Payment button
  6. 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();
        }
    }
  7. Return to the Rental Allocation form and double-click the Close button
  8. Implement the event as follows:
     
    private void btnClose_Click(object sender, EventArgs e)
    {
        Close();
    }
  9. Execute the application
  10. 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
     
  11. 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
     
  12. Close the DOS window

Exercises

 

Solas Property Rental

  1. Open the Solas Property Rental database from this lesson
  2. 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)
  3. 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)

Previous Copyright © 2008-2009 Yevol.com Next