Home

Example Application:
College Park Auto-Parts

 

Description

This application explores the built-in collection classes of the .NET Framework.

The application is used by a company that sells auto-parts. To start, the company must create the items being sold in the store. Each car part is known for the make (or manufacturer of the car), the model of the car, the category of the part (this makes it a little easier to locate, categorize, or identify a part), the part name (a short description), and its unit price.

Once the parts have been created, when a customer comes to the store, a clerk can locate the desires part in the database.

Practical Learning Practical Learning: Creating the Application

  1. Start Microsoft Visual C# and create a new Windows Application named CollegeParkAutoParts3
  2. To create a dialog box, on the main menu, click Project -> Add Windows Form...
  3. Set the name to MakeEditor and click Add
  4. Design the form as follows:
     
    Make Editor
    Control Text Name Other Properties
    Label &Make:    
    TextBox   txtMake Modifiers: Public
    Button OK btnOK DialogResult: OK
    Button Cancel btnCancel DialogResult: Cancel
    Form Property Value
    FormBorderStyle FixedDialog
    Text Make Editor
    StartPosition CenterScreen
    AcceptButton btnOK
    CancelButton btnCancel
    MaximizeBox False
    MinimizeBox False
    ShowInTaskbar False
  5. To create a dialog box, on the main menu, click Project -> Add Windows Form...
  6. Set the name to ModelEditor and click Add
  7. Design the form as follows:
     
    College Park Auto Parts: Model Editor
    Control Text Name Other Properties
    Label &Model:    
    TextBox   txtModel Modifiers: Public
    Button OK btnOK DialogResult: OK
    Button Cancel btnCancel DialogResult: Cancel
    Form Property Value
    FormBorderStyle FixedDialog
    Text Model Editor
    StartPosition CenterScreen
    AcceptButton btnOK
    CancelButton btnCancel
    MaximizeBox False
    MinimizeBox False
    ShowInTaskbar False
  8. To create a dialog box, in the Solution Explorer, right-click CollegeParkAutoParts2 -> Add -> Windows Form...
  9. Set the name to CategoryEditor and click Add
  10. Design the form as follows:
     
    College Park Auto Parts: Category Editor
    Control Text Name Other Properties
    Label &Category:    
    TextBox   txtCategory Modifiers: Public
    Button OK btnOK DialogResult: OK
    Button Cancel btnCancel DialogResult: Cancel
    Form Property Value
    FormBorderStyle FixedDialog
    Text Category Editor
    StartPosition CenterScreen
    AcceptButton btnOK
    CancelButton btnCancel
    MaximizeBox False
    MinimizeBox False
    ShowInTaskbar False
  11. On the main menu, click Project -> Add Windows Form...
  12. Set the Name to PartEditor and click Add
  13. Design the form as follows:
     
    College Park Auto-Part - Part Editor
     
    Control Text Name Other Properties
    Label &Year:    
    TextBox   txtItemNumber  
    Label &Make:    
    ComboBox   cbxMakes  
    Button New C&ategory... btnNewMake  
    Label M&odel:    
    ComboBox   cbxModels  
    Button New Mo &del... btnNewModel  
    Label &Category:    
    ComboBox   cbxCategories  
    Button New Ca&tegory btnNewCategory  
    Label &Unit Price:    
    TextBox 0.00 txtUnitPrice TextAlign: Right
    Label Part #:    
    TextBox   txtPartNumber  
    Label &Part Name:    
    TextBox   txtPartName  
    Button Submit btnSubmit  
    Button Close btnClose DialogResult: Cancel
    Form Property Value
    FormBorderStyle FixedDialog
    Text College Park Auto -Parts: Part Editor
    StartPosition CenterScreen
    MaximizeBox False
    MinimizeBox False
    ShowInTaskbar False
  14. Double-click the New Make button and implement it as follows:
      
    private void btnNewMake_Click(object sender, EventArgs e)
    {
        MakeEditor editor = new MakeEditor();
    
        if (editor.ShowDialog() == DialogResult.OK)
        {
            if (editor.txtMake.Text.Length > 0)
            {
                string strMake = editor.txtMake.Text;
    
                // Make sure the category is not yet in the list
                if (cbxMakes.Items.Contains(strMake))
                    MessageBox.Show(strMake + " is already in the list");
                else
                {
                    // Since this is a new category, add it to the combox box
                    cbxMakes.Items.Add(strMake);
                }
                        
                cbxMakes.Text = strMake;
            }
        }
    }
  15. Return to the Part Editor dialog box and double-click the New Model button
  16. Implement the event as follows:
      
    private void btnNewModel_Click(object sender, EventArgs e)
    {
        ModelEditor editor = new ModelEditor();
    
        if (editor.ShowDialog() == DialogResult.OK)
        {
            if (editor.txtModel.Text.Length > 0)
            {
                string strModel = editor.txtModel.Text;
    
                // Make sure the category is not yet in the list
                if (cbxModels.Items.Contains(strModel))
                    MessageBox.Show(strModel + " is already in the list");
                else
                {
                    // Since this is a new category, add it to the combox box
                    cbxModels.Items.Add(strModel);
                }
    
                cbxModels.Text = strModel;
            }
        }
    }
  17. Return to the Part Editor dialog box and double-click the New Category button
  18. Implement the event as follows:
      
    private void btnNewCategory_Click(object sender, EventArgs e)
    {
        CategoryEditor editor = new CategoryEditor();
    
        if (editor.ShowDialog() == DialogResult.OK)
        {
            if (editor.txtCategory.Text.Length > 0)
            {
                string strCategory = editor.txtCategory.Text;
    
                // Make sure the category is not yet in the list
                if (cbxCategories.Items.Contains(strCategory))
                    MessageBox.Show(strCategory + " is already in the list");
                else
                {
                    // Since this is a new category, add it to the combox box
                    cbxCategories.Items.Add(strCategory);
                }
                
                cbxCategories.Text = strCategory;
            }
        }
    }
  19. Save the file and close the form
  20. To create an icon, on the main menu, click Project -> Add New Item...
  21. In the Templates list, click Icon File
  22. Set the Name to cpap1 and click Add
  23. Right-click the white area and click Delete Image Type
  24. Design the 16x16, 16 colors version of the icon as follows:
     
  25. On the main menu, click File -> Save cpap1.ico As
  26. Select the bin\Debug folder of the current folder and click Save
  27. On the main menu, click File -> Close
  28. In the Solution Explorer, expand bin and expand Debug
  29. In the Solution Explorer, right-click the Debug folder -> Add -> New Item...
  30. In the Templates list, make sure Icon File is selected.
    Set the Name to cpap2 and click Add
  31. Right-click the white area and click Delete Image Type
  32. Design the 16x16, 16 colors version of the icon as follows:
     
  33. Save the file and close the icon window
  34. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  35. In the Templates list, make sure Icon File is selected.
    Set the Name to year1 and click Add
  36. Right-click the white area and click Delete Image Type
  37. Design the 16x16, 16 colors version of the icon as follows:
     
  38. Save the file and close the icon window
  39. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  40. In the Templates list, make sure Icon File is selected.
    Set the Name to year2 and click Add
  41. Right-click the white area and click Delete Image Type
  42. Design the 16x16, 16 colors version of the icon as follows:
     
  43. Save the file and close the icon window
  44. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  45. In the Templates list, make sure Icon File is selected.
    Set the Name to make1 and click Add
  46. Right-click the white area and click Delete Image Type
  47. Design the 16x16, 16 colors version of the icon as follows:
     
    Icon Design: Diamond
  48. Save the file and close the icon window
  49. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  50. In the Templates list, make sure Icon File is selected.
    Set the Name to make2 and click Add
  51. Right-click the white area and click Delete Image Type
  52. Design the 16x16, 16 colors version of the icon as follows:
     
    Icon Design: Diamond
  53. Save the file and close the icon window
  54. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  55. In the Templates list, make sure Icon File is selected.
    Set the Name to model1 and click Add
  56. Right-click the white area and click Delete Image Type
  57. Design the 16x16, 16 colors version of the icon as follows:
     
  58. Save the file and close the icon window
  59. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  60. In the Templates list, make sure Icon File is selected.
    Set the Name to model2 and click Add
  61. Right-click the white area and click Delete Image Type
  62. Design the 16x16, 16 colors version of the icon as follows:
     
  63. Save the file and close the icon window
  64. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  65. In the Templates list, make sure Icon File is selected.
    Set the Name to category1 and click Add
  66. Right-click the white area and click Delete Image Type
  67. Design the 16x16, 16 colors version of the icon as follows:
     
  68. Save the file and close the icon window
  69. In the Solution Explorer, right- click the Debug folder -> Add -> New Item...
  70. In the Templates list, make sure Icon File is selected.
    Set the Name to category2 and click Add
  71. Right-click the white area and click Delete Image Type
  72. Design the 16x16, 16 colors version of the icon as follows:
     
    Icon Design: Minus
  73. Save the file and close the icon window
  74. In the Solution Explorer, right-click Form1.cs and click Rename
  75. Type Central.cs and press Enter twice to display the Central form
  76. From the Components section of the Toolbox, click ImageList and click the form
  77. In the Properties window, click (Name) and type imgAutoParts
  78. Click the ellipsis button of the Images field
  79. In the Image Collection Editor, click Add
  80. Locate the folder that contains the icons you created and display it in the Look In combo box
  81. Select cpap1.ico and click Open
  82. In the same way, add the other pictures in the following order: cpap2.ico, year1.ico, year2.ico, make1.ico, make2.ico, model1.ico, model2.ico, category1.ico, and category1.ico
     
    Image Collection Editor
  83. Click OK
  84. Design the form as follows:
     
    College Park Auto Parts - Form Design
    Control Text Name Other Properties
    Label Label College Park Auto-Parts   Font: Times New Roman, 20.25pt, style=Bold
    ForeColor: Blue
    Panel     Height: 2
    GroupBox GroupBox Part Identification    
    TreeView TreeView   tvwAutoParts ImageList: imgAutoParts
    GroupBox GroupBox Available Parts    
    ListView ListView   lvwAutoParts FullRowSelect: True
    GridLines: True
    View: Details
    Columns   (Name) Text TextAlign Width
    colPartNumber Part #    
    colPartName Part Name   300
    colUnitPrice Unit Price Right 80
    GroupBox GroupBox Customer Order - Selected Parts    
    Label Label Part #    
    Label Label Part Name    
    Label Label Unit Price    
    Label Label Qty    
    Label Label Sub Total    
    TextBox TextBox   txtPartNumber  
    TextBox TextBox   txtPartName  
    TextBox TextBox 0.00 txtUnitPrice TextAlign: Right
    TextBox TextBox 0 txtQuantity TextAlign: Right
    TextBox TextBox 0.00 txtSubTotal TextAlign: Right
    Button Button Add/Select btnAdd
    ListView ListView   lvwSelectedParts FullRowSelect: True
    GridLines: True
    View: Details
    Columns   (Name) Text TextAlign Width
    colPartNumberSelected Part #   45
    colPartNameSelected Part Name   274
    colUnitPriceSelected Unit Price Right 58
    colQuantitySelected Qty Right 28
    colSubTotalSelected Sub-Total Right 58
    GroupBox GroupBox Order Summary
    Button Button New Au&to Part... btnNewAutoPart  
    Label Label Receipt #:  
    TextBox TextBox txtSave
    Button Button Save btnSave
    Label Label Tax Rate:
    TextBox TextBox 7.75 txtTaxRate TextAlign: Right
    Label Label %
    Label Label Parts Total:
    TextBox TextBox 0.00 txtPartsTotal TextAlign: Right
    Button Button &New Customer Order btnNewCustomerOrder  
    Label Label Receipt #:  
    TextBox TextBox txtOpen
    Button Button Save btnOpen
    Label Label Tax Amount:
    TextBox TextBox 0.00 txtTaxAmount TextAlign: Right
    Label Label Order Total:
    TextBox TextBox 0.00 txtOrderTotal TextAlign: Right
    Button Button Close btnClose  
  85. Click the Available Parts list view
  86. In the Properties window, click the Events button and, in the Events section, double-click DoubleClick
  87. Implement the event as follows:
     
    private void lvwAutoParts_DoubleClick(object sender, EventArgs e)
    {
        ListViewItem lviAutoPart = lvwAutoParts.SelectedItems[0];
    
        if( (lvwAutoParts.SelectedItems.Count == 0) ||
            (lvwAutoParts.SelectedItems.Count > 1) )
                    return;
    
        txtPartNumber.Text = lviAutoPart.Text;
        txtPartName.Text = lviAutoPart.SubItems[1].Text;
        txtUnitPrice.Text = lviAutoPart.SubItems[2].Text;
    
        txtQuantity.Text = "1";
        txtSubTotal.Text = lviAutoPart.SubItems[2].Text;
    
        txtQuantity.Focus();
    }
  88. Return to the Central form
  89. Click the Unit Price text box and, in the Events section of the Properties window, double-click Leave
  90. Implement the event as follows:
     
    private void txtUnitPrice_Leave(object sender, EventArgs e)
    {
        double UnitPrice = 0.00D;
        int Quantity = 0;
        double SubTotal = 0.00D;
    
        try
        {
            UnitPrice = double.Parse(txtUnitPrice.Text);
        }
        catch (FormatException)
        {
            MessageBox.Show("Invalid Unit Price!");
        }
    
        try { Quantity = int.Parse(txtQuantity.Text); }
        catch (FormatException)
        {
            MessageBox.Show("Invalid Quandtity!");
        }
    
        SubTotal = UnitPrice * Quantity;
        txtSubTotal.Text = SubTotal.ToString("F");
    }
    
    internal void CalculateOrder()
    {
        // Calculate the current total order and update the order
        double PartsTotal = 0.00;
        double TaxRate = 0.00;
        double TaxAmount = 0.00;
        double OrderTotal = 0.00;
    
        ListViewItem lviSelectedPart = lvwSelectedParts.Items[0];
    
        foreach (ListViewItem lvi in lvwSelectedParts.Items)
        {
            ListViewItem.ListViewSubItem SubItem = lvi.SubItems[4];
    
            PartsTotal += double.Parse(SubItem.Text);
        }
    
        try
        {
            TaxRate = double.Parse(txtTaxRate.Text) / 100;
        }
        catch (FormatException)
        {
            MessageBox.Show("Invalid Tax Rate");
        }
    
        TaxAmount = PartsTotal * TaxRate;
        OrderTotal = PartsTotal + TaxAmount;
    
        txtTotalOrder.Text = PartsTotal.ToString("F");
        txtTaxAmount.Text = TaxAmount.ToString("F");
        txtOrderTotal.Text = OrderTotal.ToString("F");
    }
  91. Return to the Central form and click the Qty text box
  92. In the Events section of the Properties, click Leave, then click the arrow of its combo box and select txtUnitPrice_Leave
  93. Return to the Central form
  94. Click the Selected Part list view (the list view in the bottom-right section of the form)
  95. In the Events section of the Properties window, double-click DoubleClick
  96. Implement the event as follows:
     
    private void lvwSelectedParts_DoubleClick(object sender, EventArgs e)
    {
        ListViewItem lviSelectedPart = lvwSelectedParts.SelectedItems[0];
    
        if( (lvwSelectedParts.SelectedItems.Count == 0) ||
            (lvwSelectedParts.SelectedItems.Count > 1) )
            return;
    
        txtPartNumber.Text = lviSelectedPart.Text;
        txtPartName.Text = lviSelectedPart.SubItems[1].Text;
        txtUnitPrice.Text = lviSelectedPart.SubItems[2].Text;
        txtQuantity.Text = lviSelectedPart.SubItems[3].Text;
        txtSubTotal.Text = lviSelectedPart.SubItems[4].Text;
    
        lvwSelectedParts.Items.Remove(lviSelectedPart);
        CalculateOrder();
    }
  97. In the Solution Explorer, right-click CollegeParkAutoParts3 -> Add -> Class...
  98. Set the name to PartDescription and press Enter
  99. To create a class that can hold a structured item of a list, change the class as follows:
     
    using System;
    
    namespace CollegeParkAutoParts3
    {
        [Serializable]
        public class PartDescription
        {
            // These members will be used to define a car part
            private long ID;
            private int yr;
            private string mk;
            private string mdl;
            private string cat;
            private string name;
            private double price;
    
            public PartDescription()
            {
                this.ID = 0;
                this.yr = 1960;
                this.mk = "";
                this.mdl = "";
                this.name = "Unknown";
                this.price = 0.00;
            }
    
            public PartDescription(long code, int year, string make,
                                   string model, string type,
                                   string desc, double UPrice)
            {
                this.ID = code;
                this.yr = year;
                this.mk = make;
                this.mdl = model;
                this.cat = type;
                this.name = desc;
                this.price = UPrice;
            }
    
            public long PartNumber
            {
                get { return ID; }
                set { ID = value; }
            }
    
            public int Year
            {
                get { return yr; }
                set { yr = value; }
            }
    
            public string Make
            {
                get { return mk; }
                set { mk = value; }
            }
    
            public string Model
            {
                get { return mdl; }
                set { mdl = value; }
            }
    
            public string Category
            {
                get { return cat; }
                set { cat = value; }
            }
    
            public string PartName
            {
                get { return name; }
                set { name = value; }
            }
    
            public double UnitPrice
            {
                get { return (price < 0) ? 0.00 : price; }
                set { price = value; }
            }
    
            public override string ToString()
            {
                return this.PartNumber + " " +
                       this.Year.ToString() + " " +
                       this.Make + " " +
                       this.Model + " " +
                       this.Category + " " +
                       this.PartName + " " +
                       this.UnitPrice;
            }
        }
    }
  100. In the Solution Explorer, right-click CollegeParkAutoParts3 -> Add -> Class...
  101. Set the name to PartsOrdered and press Enter
  102. To create another class intended for a list, change the document as follows:
     
    using System;
    
    namespace CollegeParkAutoParts3
    {
        [Serializable]
        public class PartsOrdered
        {
            public long PartNumber;
            public string PartName;
            public double UnitPrice;
            public int Quantity;
            public double SubTotal;
        }
    }
  103. Save all
  104. Display the Part Editor form and double-click the Submit button
  105. Implement the event as follows:
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace CollegeParkAutoParts3
    {
        public partial class PartEditor : Form
        {
            List<PartDescription> lstAutoParts;
    
            . . . No Change
    
            private void btnSubmit_Click(object sender, EventArgs e)
            {
                FileStream stmAutoParts = null;
                BinaryFormatter bfmAutoParts = new BinaryFormatter();
    
                // If this directory doesn't exist, create it
                Directory.CreateDirectory(@"C:\College Park Auto Parts");
                // This is the file that holds the list of items
                string FileName = @"C:\College Park Auto Parts\Parts.prs";
    
                // Create a random number that will be used to identify the item
                Random rnd = new Random();
                txtPartNumber.Text = rnd.Next(100000, 999999).ToString();
    
                // Make sure the user had selected a make
                if (cbxYears.Text.Length == 0)
                {
                    MessageBox.Show("You must specify the year");
                    cbxYears.Focus();
                    return;
                }
    
                // Make sure the user had selected a make
                if (cbxMakes.Text.Length == 0)
                {
                    MessageBox.Show("You must specify the car name");
                    cbxMakes.Focus();
                    return;
                }
    
                // Make sure the user had selected a model
                if (cbxModels.Text.Length == 0)
                {
                    MessageBox.Show("You must specify the model of the car");
                    cbxModels.Focus();
                    return;
                }
    
                // Make sure the user had selected the part category
                if (cbxCategories.Text.Length == 0)
                {
                    MessageBox.Show("You must specify the part's category");
                    cbxCategories.Focus();
                    return;
                }
    
                // Make sure the user had entered a name/description
                if (txtPartName.Text.Length == 0)
                {
                    MessageBox.Show("You must enter the name (or a " +
                                    "short description) for the part");
                    txtPartName.Focus();
                    return;
                }
    
                // Make sure the user had typed a price for the item
                if (txtUnitPrice.Text.Length == 0)
                {
                    MessageBox.Show("You must enter the price of the item");
                    txtUnitPrice.Focus();
                    return;
                }
    
                // Before saving the new part, find out if there was
                // already a file that holds the list of parts
                // If that file exists, open it and store its parts 
                // in our lstParts variable
                if (File.Exists(FileName))
                {
                    stmAutoParts = new FileStream(FileName,
                                                  FileMode.Open,
                                                  FileAccess.Read,
                                                  FileShare.Read);
    
                    try
                    {
                        // Retrieve the list of items from file
                        lstAutoParts =
                  (List<PartDescription>)bfmAutoParts.Deserialize(stmAutoParts);
                    }
                    finally
                    {
                        stmAutoParts.Close();
                    }
                }
    
                // Create the part
                PartDescription part = new PartDescription();
                part.PartNumber = long.Parse(txtPartNumber.Text);
                part.Year = int.Parse(cbxYears.Text);
                part.Make = cbxMakes.Text;
                part.Model = cbxModels.Text;
                part.Category = cbxCategories.Text;
                part.PartName = txtPartName.Text;
                part.UnitPrice = double.Parse(txtUnitPrice.Text);
    
                // Call the Add method of our collection class to add the part
                lstAutoParts.Add(part);
    
                // Save the list
                stmAutoParts = new FileStream(FileName,
                                              FileMode.Create,
                                              FileAccess.Write,
                                              FileShare.Write);
    
                try
                {
                    bfmAutoParts.Serialize(stmAutoParts, lstAutoParts);
    
                    // After saving the item, reset the form
                    cbxYears.Text = "";
                    cbxMakes.Text = "";
                    cbxModels.Text = "";
                    cbxCategories.Text = "";
                    txtPartName.Text = "";
                    txtUnitPrice.Text = "0.00";
                    txtPartNumber.Text = rnd.Next(100000, 999999).ToString();
                }
                finally
                {
                    stmAutoParts.Close();
                }
            }
        }
    }
  106. Display the Central form
  107. Right-click the form and click View Code
  108. Add the following namespaces in the top section of the file:
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
  109. Return to the Central form and double-click the Save button
  110. Implement its event as follows:
     
    private void btnSave_Click(object sender, EventArgs e)
    {
        BinaryFormatter bfmCustomerOrder = new BinaryFormatter();
    
        // We will store our files in the following folder    
        string strDirectory = @"C:\College Park Auto Parts\Receipts";
        DirectoryInfo dirInfo = new DirectoryInfo(strDirectory);
    
        string strFilename = strDirectory + "\\" + txtSave.Text + ".cap";
    
        List<PartsOrdered> lstOrderedParts = null;
    
        if (lvwSelectedParts.Items.Count == 0)
            return;
        else
        {
            lstOrderedParts = new List<PartsOrdered>();
    
            for (int i = 0; i < lvwSelectedParts.Items.Count; i++)
            {
                PartsOrdered part = new PartsOrdered();
    
                part.PartNumber = long.Parse(lvwSelectedParts.Items[i].Text);
                part.PartName = lvwSelectedParts.Items[i].SubItems[1].Text;
      part.UnitPrice = double.Parse(lvwSelectedParts.Items[i].SubItems[2].Text);
      part.Quantity = int.Parse(lvwSelectedParts.Items[i].SubItems[3].Text);
      part.SubTotal = double.Parse(lvwSelectedParts.Items[i].SubItems[4].Text);
                lstOrderedParts.Add(part);
            }
    
      FileStream stmCustomerOrder = new FileStream(strFilename, FileMode.Create);
    
            try
            {
                bfmCustomerOrder.Serialize(stmCustomerOrder, lstOrderedParts);
            }
            finally
            {
                stmCustomerOrder.Close();
            }
        }
    }
  111. Save all
  112. Display the Part Editor form and double-click the Makes combo box
  113. Implement its SelectedIndexChanged event as follows:
     
    private void cbxMakes_SelectedIndexChanged(object sender, EventArgs e)
    {
        cbxModels.Text = "";
        cbxModels.Items.Clear();
    
        foreach (PartDescription part in lstAutoParts)
            if (part.Make == cbxMakes.Text)
                if (!cbxModels.Items.Contains(part.Model))
                    cbxModels.Items.Add(part.Model);
    }
  114. Display the Central form and double-click the Add/Select button
  115. Implement the event as follows:
     
    private void btnAdd_Click(object sender, EventArgs e)
    {
        if (txtPartNumber.Text.Length == 0)
        {
            MessageBox.Show("There is no part to be added to the order");
            return;
        }
    
        foreach (PartDescription part in lstAutoParts)
        {
            if (part.PartNumber == long.Parse(txtPartNumber.Text))
            {
                ListViewItem lviSelectedPart =
    		new ListViewItem(part.PartNumber.ToString());
    
                lviSelectedPart.SubItems.Add(part.PartName);
                lviSelectedPart.SubItems.Add(part.UnitPrice.ToString());
                lviSelectedPart.SubItems.Add(txtQuantity.Text);
                lviSelectedPart.SubItems.Add(txtSubTotal.Text);
                lvwSelectedParts.Items.Add(lviSelectedPart);
            }
        }
    
        CalculateOrder();
    }
  116. Return to the Central form and double-click the Open button
  117. Implement its event as follows:
     
    private void btnOpen_Click(object sender, EventArgs e)
    {
        List<PartsOrdered> lstReceipts = null;
        BinaryFormatter bfmReceipts = new BinaryFormatter();
        FileStream stmReceipts = null;
    
        string strDirectory = @"C:\College Park Auto Parts\Receipts";
        string strFilename = "";
    
        DirectoryInfo dirReceipts = new DirectoryInfo(strDirectory);
        FileInfo[] fleReceipts = dirReceipts.GetFiles();
    
        if (txtOpen.Text.Length == 0)
        {
            MessageBox.Show("You must enter a receipt number\n" +
                            "There is no receipt number to " +
                            "open a customer's order");
            txtOpen.Focus();
            return;
        }
    
        if (fleReceipts.Length == 0)
        {
            MessageBox.Show("There is no customer order to open");
            txtOpen.Focus();
            return;
        }
        else
        {
            lvwAutoParts.Items.Clear();
            lvwSelectedParts.Items.Clear();
    
            strFilename = strDirectory + "\\" + txtOpen.Text + ".cap";
    
            if (File.Exists(strFilename))
            {
                try
                {
                    stmReceipts = new FileStream(strFilename, FileMode.Open);
                    lstReceipts =
    		(List<PartsOrdered>)bfmReceipts.Deserialize(stmReceipts);
    
                    foreach (PartsOrdered part in lstReceipts)
                    {
                        ListViewItem lviReceiptPart =
    			new ListViewItem(part.PartNumber.ToString());
    
                        lviReceiptPart.SubItems.Add(part.PartName);
                        lviReceiptPart.SubItems.Add(part.UnitPrice.ToString());
                        lviReceiptPart.SubItems.Add(part.Quantity.ToString());
                        lviReceiptPart.SubItems.Add(part.SubTotal.ToString());
                        lvwSelectedParts.Items.Add(lviReceiptPart);
                    }
                }
                finally
                {
                    stmReceipts.Close();
                }
    
                CalculateOrder();
                txtSave.Text = txtOpen.Text;
            }
            else
        MessageBox.Show("There is no customer order with that receipt number");
        }
    }
  118. Save the file
  119. Display the Part Editor form and double-click an unoccupied area of its body
  120. Implement the Load event as follows:
     
    private void PartEditor_Load(object sender, EventArgs e)
    {
        // Since all values seem ready, prepare to process the item
        lstAutoParts = new List<PartDescription>();
        BinaryFormatter bfmAutoParts = new BinaryFormatter();
    
        for (int i = DateTime.Today.Year + 1; i >= 1960; i--)
            cbxYears.Items.Add(i.ToString());
    
        // Create a random number that will be used to identify the item
        Random rnd = new Random();
        txtPartNumber.Text = rnd.Next(100000, 999999).ToString();
    
        // This is the file that holds the list of parts
        string FileName = @"C:\College Park Auto Parts\Parts.prs";
    
        if (File.Exists(FileName))
        {
            FileStream stmAutoParts = new FileStream(FileName,
                                                     FileMode.Open,
                                                     FileAccess.Read,
                                                     FileShare.Read);
    
            try
            {
                // Retrieve the list of items from file
                lstAutoParts = 
    		(List<PartDescription>)
    			bfmAutoParts.Deserialize(stmAutoParts);
    
                // Display the car manufacturers in the Make combo box
                for (int i = 0; i < lstAutoParts.Count; i++)
                {
                    PartDescription part = (PartDescription)lstAutoParts[i];
    
                    if (!cbxMakes.Items.Contains(part.Make))
                        cbxMakes.Items.Add(part.Make);
                }
    
                // Display the pats categories in the Category combo box
                for (int i = 0; i < lstAutoParts.Count; i++)
                {
                    PartDescription part = (PartDescription)lstAutoParts[i];
    
                    if (!cbxCategories.Items.Contains(part.Category))
                        cbxCategories.Items.Add(part.Category);
                }
            }
            finally
            {
                stmAutoParts.Close();
            }
        }
    }
  121. Display the Central form and click the Part # text box
  122. In the Events section of the Properties window, double-click Leave and implement the event as follows:
     
    private void txtPartNumber_Leave(object sender, EventArgs e)
    {
        // We will allow the user to enter a part number
        // In the beginning, we assume that the user 
        // had entered an invalid number
        bool found = false;
        // This will represent the part found, if any
        PartDescription PartFound = null;
    
        // After the user had entered a part number,
        // check the whole list of parts
        foreach (PartDescription part in lstAutoParts)
        {
            // If you find a part that holds the number the user had entered
            if( part.PartNumber == long.Parse(txtPartNumber.Text) )
            {
                // Mark that part
                PartFound = part;
                // And update the flag that specifies
    	    // that the part has been found
                found = true;
            }
            // If the part number was not found, check the next
        } // If no part has that number, the found flag keeps marked as false
    
        // If a part with that number was found...
        if (found == true)
        {
            // Show the corresponding part name and unit price
            txtPartName.Text = PartFound.PartName;
            txtUnitPrice.Text = PartFound.UnitPrice.ToString("F");
            txtQuantity.Text = "1";
            txtSubTotal.Text = PartFound.UnitPrice.ToString("F");
            // Give focus to the quantity in case the user was to increase it
            txtQuantity.Focus();
        }
        else
        {
            // Since no part with that number was found,
            // reset the text boxes
            txtPartName.Text = "";
            txtUnitPrice.Text = "0.00";
            txtQuantity.Text = "0";
            txtSubTotal.Text = "0.00";
    
            // Let the user know that the part number that 
            // was entered is not in the list
            MessageBox.Show("There is no part with that number");
        }
    }
  123. Return to the Central form and double-click the New Auto Part button
  124. Implement the event as follows:
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace CollegeParkAutoParts3
    {
        public partial class Central : Form
        {
            int iFileName;
            List<PartDescription> lstAutoParts;
    
            public Central()
            {
                InitializeComponent();
            }
    
            void ShowAutoParts()
            {
                tvwAutoParts.Nodes.Clear();
                TreeNode nodRoot =
    		tvwAutoParts.Nodes.Add("College Park Auto-Parts",
                                           "College Park Auto-Parts", 0, 1);
                // Show the years nodes
                for (int years = DateTime.Today.Year + 1; years >= 1960; years--)
                    nodRoot.Nodes.Add(years.ToString(), years.ToString(), 2, 3);
    
                tvwAutoParts.SelectedNode = nodRoot;
                // Expand the root node
                tvwAutoParts.ExpandAll();
    
                lstAutoParts = new List<PartDescription>();
                BinaryFormatter bfmAutoParts = new BinaryFormatter();
    
                // This is the file that holds the list of auto parts
                string FileName = @"C:\College Park Auto Parts\Parts.prs";
    
                if (File.Exists(FileName))
                {
                    FileStream stmAutoParts = new FileStream(FileName,
                                                             FileMode.Open,
                                                             FileAccess.Read,
                                                             FileShare.Read);
                    try
                    {
                        // Retrieve the list of parts from file
                        lstAutoParts =
    			(List<PartDescription>)
    				bfmAutoParts.Deserialize(stmAutoParts);
    
                        // Show the makes nodes
                        foreach (TreeNode nodYear in nodRoot.Nodes)
                        {
                            List<string> lstMakes = new List<string>();
    
                            foreach (PartDescription part in lstAutoParts)
                            {
                                if (nodYear.Text == part.Year.ToString())
                                {
                                    if (!lstMakes.Contains(part.Make))
                                        lstMakes.Add(part.Make);
                                }
                            }
    
                            foreach (string strMake in lstMakes)
                                nodYear.Nodes.Add(strMake, strMake, 4, 5);
                        }
    
                        // Showing the models nodes
                        foreach (TreeNode nodYear in nodRoot.Nodes)
                        {
                            foreach (TreeNode nodMake in nodYear.Nodes)
                            {
                                List<string> lstModels = new List<string>();
    
                                foreach (PartDescription part in lstAutoParts)
                                {
    
                                    if ((nodYear.Text == part.Year.ToString()) &&
                                        (nodMake.Text == part.Make))
                                    {
                                        if (!lstModels.Contains(part.Model))
                                            lstModels.Add(part.Model);
    
                                    }
                                }
    
                                foreach (string strModel in lstModels)
                                    nodMake.Nodes.Add(strModel, strModel, 6, 7);
                            }
                        }
    
                        // Showing the categories nodes
                        foreach (TreeNode nodYear in nodRoot.Nodes)
                        {
                            foreach (TreeNode nodMake in nodYear.Nodes)
                            {
                                foreach (TreeNode nodModel in nodMake.Nodes)
                                {
                                List<string> lstCategories = new List<string>();
    
                                  foreach (PartDescription part in lstAutoParts)
                                    {
    
                                    if ((nodYear.Text == part.Year.ToString()) &&
                                            (nodMake.Text == part.Make) &&
                                            (nodModel.Text == part.Model))
                                        {
                                      if (!lstCategories.Contains(part.Category))
                                                lstCategories.Add(part.Category);
                                        }
                                    }
    
                                    foreach (string strCategory in lstCategories)
                                        nodModel.Nodes.Add(strCategory,
    						       strCategory, 8, 9);
                                }
                            }
                        }
                    }
                    finally
                    {
                        stmAutoParts.Close();
                    }
                }
            }
    
            private void btnNewAutoPart_Click(object sender, EventArgs e)
            {
                PartEditor editor = new PartEditor();
    
                if (editor.ShowDialog() == DialogResult.Cancel)
                    ShowAutoParts();
            }
        }
    }
  125. Display the Central form and double- click the New Customer Order button
  126. Implement the event as follows:
     
    private void btnNewCustomerOrder_Click(object sender, EventArgs e)
    {
        // We will store our files in the following folder    
        string strDirectory = @"C:\College Park Auto Parts\Receipts";
        DirectoryInfo dirInfo = Directory.CreateDirectory(strDirectory);
    
        // Get the list of files, if any, from our directory
        FileInfo[] fleList = dirInfo.GetFiles();
    
        // If there is no file in the directory,
        // then we will use 1000 as the first file name
        if (fleList.Length == 0)
        {
            iFileName = 1000;
        }
        else // If there was at least one file in the directory
        {
            // Get a reference to the last file
            FileInfo fleLast = fleList[fleList.Length - 1];
            // Get the name of the last file without its extension
            string fwe = Path.GetFileNameWithoutExtension(fleLast.FullName);
            // Increment the name of the file by 1
            iFileName = int.Parse(fwe) + 1;
        }
    
        txtSave.Text = iFileName.ToString();
    
        lvwAutoParts.Items.Clear();
        lvwSelectedParts.Items.Clear();
    }
  127. Display the Central form and double-click an unoccupied area of its body
  128. Define a new method and implement the Load event as follows:
     
    private void Central_Load(object sender, EventArgs e)
    {
        ShowAutoParts();
        btnNewCustomerOrder_Click(sender, e);
    }
  129. Return to the Central form and click the tree view
  130. In the Properties window, click the Events button and, in the Events section, double-click NodeMouseClick
  131. Implement the event as follows:
     
    private void tvwAutoParts_NodeMouseClick(object sender,
    			TreeNodeMouseClickEventArgs e)
    {
        TreeNode nodClicked = e.Node;
    
        if (nodClicked.Level == 4)
            lvwAutoParts.Items.Clear();
    
        try
        {
            foreach (PartDescription part in lstAutoParts)
            {
                if ((part.Category == nodClicked.Text) &&
                    (part.Model == nodClicked.Parent.Text) &&
                    (part.Make == nodClicked.Parent.Parent.Text) &&
                  (part.Year.ToString() == nodClicked.Parent.Parent.Parent.Text))
                {
                    ListViewItem lviAutoPart =
    			new ListViewItem(part.PartNumber.ToString());
    
                    lviAutoPart.SubItems.Add(part.PartName);
                    lviAutoPart.SubItems.Add(part.UnitPrice.ToString("F"));
                    lvwAutoParts.Items.Add(lviAutoPart);
                }
            }
        }
        catch (NullReferenceException)
        {
        }
    }
  132. Return to the Central form and double-click the Close button
  133. Implement the event as follows:
     
    private void btnClose_Click(object sender, EventArgs e)
    {
        Close();
    }
  134. Execute the application
  135. Click the New Auto Part button and use the Part Editor to create a few parts (let the computer generate the part numbers)
     
  136. Close the Part Editor
  137. Create a few customer part orders and save them:
     
    College Park Auto Parts: Customer Order
     
    College Park Auto Parts: Part Selection
  138. Close the forms and return to your programming environment
  139. Execute the application again and open a previously saved order
  140. Close the forms and return to your programming environment

Download

 

Home Copyright © 2007-2012 FunctionX